it-swarm.com.de

Eine Variable deklarieren und ihren Wert aus einer SELECT-Abfrage in Oracle festlegen

In SQL Server können wir dies verwenden:

DECLARE @variable INT;
SELECT @variable= mycolumn from myTable;

Wie kann ich dasselbe in Oracle machen? Ich versuche gerade folgendes:

DECLARE COMPID VARCHAR2(20);
SELECT companyid INTO COMPID from app where appid='90' and rownum=1;

Warum ist das nicht Arbeit ?

enter image description here

31
user960567

SELECT INTO

DECLARE
   the_variable NUMBER;

BEGIN
   SELECT my_column INTO the_variable FROM my_table;
END;

Stellen Sie sicher, dass die Abfrage nur eine einzelne Zeile zurückgibt:

Standardmäßig darf eine SELECT INTO-Anweisung nur eine Zeile zurückgeben. Andernfalls löst PL/SQL die vordefinierte Ausnahme TOO_MANY_ROWS aus und die Werte der Variablen in der INTO-Klausel sind undefiniert. Stellen Sie sicher, dass Ihre WHERE-Klausel genau genug ist, um nur eine Zeile zu finden

Wenn keine Zeilen zurückgegeben werden, führt PL/SQL NO_DATA_FOUND aus. Sie können sich gegen diese Ausnahme schützen, indem Sie das Ergebnis einer Aggregatfunktion wie COUNT (*) oder AVG () auswählen, sofern dies sinnvoll ist. Diese Funktionen geben garantiert einen einzelnen Wert zurück, auch wenn keine Zeilen der Bedingung entsprechen.

Eine SELECT ... BULK COLLECT INTO-Anweisung kann mehrere Zeilen zurückgeben. Sie müssen Erfassungsvariablen einrichten, um die Ergebnisse zu speichern. Sie können assoziative Arrays oder geschachtelte Tabellen deklarieren, die nach Bedarf vergrößert werden, um die gesamte Ergebnismenge aufzunehmen.

Das implizite Cursor-SQL und seine Attribute% NOTFOUND,% FOUND,% ROWCOUNT und% ISOPEN enthalten Informationen zur Ausführung einer SELECT INTO-Anweisung.

62
Thilo

Nicht ganz sicher, was Sie wollen, aber in PL/SQL würden Sie dies einfach tun

DECLARE
  v_variable INTEGER;
BEGIN
  SELECT mycolumn
    INTO v_variable
    FROM myTable;
END;

Ollie.

5
Ollie

Ein zusätzlicher Punkt:

Wenn Sie von tsql in plsql konvertieren, müssen Sie sich um die no_data_found-Ausnahme sorgen

DECLARE
   v_var NUMBER;
BEGIN
   SELECT clmn INTO v_var FROM tbl;
Exception when no_data_found then v_var := null; --what ever handle the exception.
END;

In tsql wenn no data found, wird die Variable null sein, aber keine exception

1
Praveen

ORA-01422: Exakter Abruf gibt mehr als die angeforderte Anzahl von Zeilen zurück

wenn Sie den genauen Datensatz nicht mit der where-Bedingung angeben, wird die obige Ausnahme angezeigt

DECLARE
     ID NUMBER;
BEGIN
     select eid into id from employee where salary=26500;
     DBMS_OUTPUT.PUT_LINE(ID);
END;
0
user3325275

Zum Speichern einer einzelnen Zeilenausgabe in einer Variablen von der Auswahl in die Abfrage: 

deklariere v_username varchare (20); SELECT Benutzername in v_username FROM Benutzer WHERE user_id = '7';

dadurch wird der Wert eines einzelnen Datensatzes in der Variablen v_username gespeichert.


Zum Speichern mehrerer Zeilen in einer Variablen von der Auswahl in die Abfrage: 

sie müssen die Listagg-Funktion verwenden. listagg verkettet die resultierenden Zeilen einer Spalte in einer einzelnen Spalte, und um sie zu unterscheiden, können Sie ein spezielles Symbol verwenden. Verwenden Sie die Abfrage wie folgt SELECT listagg (Benutzername || ',') innerhalb der Gruppe (Reihenfolge nach Benutzername) in v_Benutzername FROM Benutzer;

0
Vincent Lal