2016-07-19 6 views
0

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; 

Antwort

0

Das Ausführen-Dialog wird aus dem Verfahren spec erzeugt und kennt daher den richtigen Typ für testcursor, aber wenn man es einfach einfügen in ein Arbeitsblatt dies nicht der Fall, und es scheint, als Textzeichenfolge zu definieren. Ab SQL Developer 4.0.3.16 scheint die Eingabeaufforderung für den Arbeitsblattbindungswert keine Möglichkeit zum Ändern des Datentyps zu haben.

Wie ich ein wiederverwendbares Testskript mit einer Cursor-Ausgabe in SQL Dev erstellen kann, weiß ich nicht. (Ich benutze normalerweise PL/SQL Developer, der dies kann, aber es ist keine freie Software.)

Edit: in diesem Thread eine Lösung war, eine Wrapper-Funktion zu schreiben und wählen Sie aus Dual. Ich habe gerade versucht, und Sie nicht bekommen, ein Gitter, aber Sie eine Art Debug-Ausgabe erhalten, ohne zu viel Aufwand:

Oracle SQL Developer: Show REFCURSOR Results in Grid?

+0

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

+0

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. –

Verwandte Themen