Ich komme aus einem SQL Server-Hintergrund, aber ich habe damit in Oracle zu kämpfen. Alle Sprocs in der Datenbank, die konfiguriert wurde, erwarten, dass ein Parameter vom Typ 'sys_refcursor' übergeben wird. Auf den Punkt gebracht, tun sie dies (die sprocs sind weitaus komplexer, aber das ganze Cursor Sache ist das, was ich hinauswill):SYS_REFCURSOR out-Parameter - Ausführen gespeicherter Prozedur schlägt fehl
CREATE OR REPLACE PROCEDURE xxx_API_TEST
(
TESTCURSOR OUT SYS_REFCURSOR
) AS
BEGIN
OPEN CURS FOR
SELECT * FROM SOMETABLE;
END xxx_API_TEST;
So - in Oracle SQL Developer ich kein Problem führen kann - und Zeigen Sie die Ausgabe des Cursors im Fenster Ausgabevariablen an.
Allerdings muss ich den Dialog nicht jedes Mal neu laden, wenn ich es erneut testen möchte - ich dachte mir, es wäre möglich, das PL/SQL im Dialog in ein neues Arbeitsblatt zu kopieren und dann das als I auszuführen erforderlich, um - Einstellen von Parametern passen - so in diesem Fall würde ich laufen:
DECLARE
TESTCURSOR SYS_REFCURSOR;
BEGIN
xxx_API_TEST(
TESTCURSOR => TESTCURSOR
);
/* Legacy output:
DBMS_OUTPUT.PUT_LINE('TESTCURSOR = ' || TESTCURSOR);
*/
:TESTCURSOR := TESTCURSOR; --<-- Cursor
--rollback;
END;
, die genau das gleiche wie die im Run-Dialog angezeigt wird.
Allerdings, wenn ich dies tun - es wirft nur einen Fehler - die besagt:
Error starting at line : 1 in command -
<snip>
Error report -
ORA-06550: line 11, column 20:
PLS-00382: expression is of wrong type
ORA-06550: line 11, column 3:
PL/SQL: Statement ignored
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:
Ich habe keine Ahnung, wie man über die Diagnose dieses gehen. Die Tatsache, dass es aus dem Dialog, aber nicht aus dem Arbeitsblatt gut läuft, ist verwirrend - und inspizierend, was an die DB gesendet wurde, sehe ich keine Unterschiede in der tatsächlich verwendeten SQL.
Interessanterweise, wenn ich diesen Code aus dem Arbeitsblatt ausführen - es öffnet sich ein Dialogfeld, um nach dem Wert für TESTCURSOR fragen - die der "Ausführen" -Dialog nicht tut. Ich drücke einfach OK - aber ich habe versucht, sowohl das Kontrollkästchen "Null" zu aktivieren als auch das Häkchen zu entfernen.
Jede Hilfe sehr geschätzt. Es ist Oracle 12c. Wenn Sie weitere Informationen benötigen, lassen Sie es mich wissen.
Cheers, Tony
Update: 20/7/2016
ich die Werte in Variablen aus einer holen ziehen landete, und Dumping nur DBMS_OUTPUT - was mir gibt, was ich brauchte, wiederholt denselben Sproc ausführen. z.B.
loop
fetch testcursor into Res, ActDate<snip>;
exit when testcursor%notfound;
DBMS_OUTPUT.PUT_LINE(Res || ' | ' || ActDate etc etc);
end loop;
close testcursor;
Dank William - zumindest bin ich nicht verrückt zu werden. Es wurde beendet, indem es einfach wie oben ausgeführt wurde, aber das Holen in Variablen für jede Spalte, z. 'Schleife Holen Sie Testcursor in Res, ActDate; beenden, wenn Testcursor% nicht gefunden wird; DBMS_OUTPUT.PUT_LINE (Res || '|' || ActDate usw. etc); Endschleife; Schließen Testcursor; ' –
PoorbandTony
Ich habe meine Antwort mit einem Link zu einer früheren Frage aktualisiert, die helfen könnte. Der Vorschlag war, die Prozedur in eine Funktion zu packen und sie aus dual auszuwählen. –