2017-03-21 3 views
0

Ich habe eine PL/SQL gespeicherte Prozedur zu schreiben, alle Zeilen aus einer ausgewählten Tabelle zu extrahieren, die in einer Datenbank ich so etwas wie dies versucht habe:in Ausgabeparameter

create or replace PROCEDURE ANAGRAFICA_GET (
ID_O OUT NUMBER 
NOME_O OUT VARCHAR2(25), 
COGNOME_O OUT VARCHAR2(25), 
DATA_NASCITA_O OUT VARCHAR2(25), 
CITTA_NASCITA_O VARCHAR2(25), 
GENERE_O OUT VARCHAR2(25), 
OCCUPAZIONE_O OUT VARCHAR2(25) 
) 
AS 
    CURSOR RESULTS IS 
    SELECT ID,NOME,COGNOME,DATA_NASCITA,CITTA_NASCITA,GENERE,OCCUPAZIONE 
    FROM TAB_ANAGRAFICA; 
    ESTRAZIONE TAB_ANAGRAFICA%ROWTYPE; 
    LAST_ID INT; 
    FIRST_ID INT; 
BEGIN 
    SELECT ID 
    INTO LAST_ID 
    FROM TAB_ANAGRAFICA 
    WHERE ROWNUM <=1 
    ORDER BY ID DESC; 
    SELECT ID 
    INTO FIRST_ID 
    FROM TAB_ANAGRAFICA 
    WHERE ROWNUM <=1 
    ORDER BY ID ASC; 
    OPEN RESULTS; 
    FOR i IN FIRST_ID .. LAST_ID LOOP 
     FETCH RESULTS INTO ESTRAZIONE; 
     ID_O := ESTRAZIONE.ID; 
     NOME_O := ESTRAZIONE.NOME; 
     COGNOME_O := ESTRAZIONE.COGNOME; 
     DATA_NASCITA_O := ESTRAZIONE.DATA_NASCITA; 
     CITTA_NASCITA_O := ESTRAZIONE.CITTA_NASCITA; 
     GENERE_O := ESTRAZIONE.GENERE; 
     OCCUPAZIONE_O := ESTRAZIONE.OCCUPAZIONE; 
    END LOOP; 
    CLOSE RESULTS; 
END; 

Aber wenn ich die gespeicherte Prozedur ausführe, kann ich nur die letzte Reihe in den Ausgangsvariablen sehen; Stattdessen, wenn ich versuche, einen dbms_outputline-Befehl in der Schleife zu schreiben, wenn ich die Prozedur ausführen, kann ich sehen, dass in der Lage ist, alle Daten abzurufen. Wie kann ich dieses Problem lösen? Wie kann ich einen resulset anstelle eines einzelnen Datensatzes im Bereich der Ausgabevariablen erhalten? Danke an alle Marco

Antwort

0

Die gespeicherte Prozedur gibt nur die Parameter, die in der Deklaration als out gekennzeichnet sind. Was Sie effektiv tun, ist das Öffnen des Cursors, das Durchlaufen desselben und das Zuweisen dieser Parameter jedes Mal, aber nur wenn die gespeicherte Prozedur beendet ist, werden diese Parameter ausgegeben.

Was würden Sie tun möchten, ist nur den Cursor als paremeter zu setzen:

create or replace PROCEDURE ANAGRAFICA_GET (
    PASSED_CURSOR OUT SYS_REFCURSOR, 
) AS 
BEGIN 
     OPEN PASSED_CURSOR FOR 
      SELECT X, Y, Z FROM EXAMPLE_TABLE; 
END 
+0

Das funktioniert gut, wenn ich alle Werte in einen Cursor zurückkehren wollen ... Aber ich brauche das verwenden ganz Liste von Namen, die gesamte Liste der cogmome und so weiter getrennt, dh Wurzel -NOME (Liste) -COGNOME (Liste) -.... Weil ich all dieser Liste in einer externen Umgebung verwenden muß –

+0

Ich denke, das passiert, weil ich die Variablen außerhalb der Schleife ausgeben –

+0

Ich verstehe nicht, was Sie meinen. Auf diese Weise übergeben Sie den Cursor an Ihre externe Umgebung. Dann kann die externe Umgebung durchgehen und auf jeden Datensatz mit allen von Ihnen benötigten Werten zugreifen. – Thor

Verwandte Themen