2016-07-19 5 views
0

私はSQL Serverのバックグラウンドから来ていますが、私はこれをOracleで苦労しています。設定されているデータベース内のすべてのsprocsは、 'sys_refcursor'型で渡されたパラメータを必要とします。一言で言えば、彼らは(ストアドプロシージャは、はるかに複雑ですが、全体のカーソルの事は私が取得していますものです)この操作を行う: - OracleのSQL Developerで、私はこの何の問題を実行することはできません -SYS_REFCURSOR outパラメータ - 実行中のストアドプロシージャが失敗する

CREATE OR REPLACE PROCEDURE xxx_API_TEST 
(
    TESTCURSOR OUT SYS_REFCURSOR 
) AS 
BEGIN 
    OPEN CURS FOR 
    SELECT * FROM SOMETABLE; 
END xxx_API_TEST; 

だから、および出力変数ウィンドウにカーソルの出力を表示します。

しかし、再テストするたびにダイアログを再ロードする必要はなく、ダイアログ内のPL/SQLを新しいワークシートにコピーしてから合わせて調整パラメータ - - に必要なので、この場合には、私が実行したい:

DECLARE 
     TESTCURSOR SYS_REFCURSOR; 
    BEGIN 

     xxx_API_TEST(
     TESTCURSOR => TESTCURSOR 
    ); 
     /* Legacy output: 
    DBMS_OUTPUT.PUT_LINE('TESTCURSOR = ' || TESTCURSOR); 
    */ 
     :TESTCURSOR := TESTCURSOR; --<-- Cursor 
    --rollback; 
    END; 

ファイル名を指定して実行]ダイアログボックスに示されたものとまったく同じです。

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: 

私はこの1つの診断について移動する方法は考えてきたん:私はこれを行う場合

しかし、 - 述べる - それだけでエラーがスローされます。ダイアログからはうまく動作しますが、ワークシートではうまくいきません。DBに送信された内容を調べると、実際に使用されたSQLの違いはわかりません。

興味深いことに、このコードをワークシートから実行すると、[実行]ダイアログでは表示されないTESTCURSORの値を尋ねるダイアログがポップアップします。私はちょうどOKを押します - しかし、私は無駄に 'Null'チェックボックスをチェックしてアンティッキングしようとしました。

ご協力いただきありがとうございます。それはOracle 12cです。それ以上の情報が必要な場合は、私に知らせてください。

乾杯、 トニー


更新日:20/7/2016

私はフェッチから変数に値を引いてしまった、とだけDBMS_OUTPUTするダンプ - 私は必要なものを私に与えています同じsprocを繰り返し実行する。例:

loop 
    fetch testcursor into Res, ActDate<snip>; 

    exit when testcursor%notfound; 

    DBMS_OUTPUT.PUT_LINE(Res || ' | ' || ActDate etc etc); 

    end loop; 
    close testcursor; 

答えて

0

[実行]ダイアログボックスには、手続きの仕様から生成されるため、testcursorの正しいタイプが知っている、しかし、あなたはちょうどそれがないワークシートに貼り付けたときに、テキスト文字列としてそれを定義するようです。 SQL Developer 4.0.3.16以降、ワークシートのバインド値プロンプトではデータ型を変更する方法がないようです。

SQLデベロッパにカーソルを出力して再利用可能なテストスクリプトを作成する方法については、わかりません。 (私は通常これを行うことができるPL/SQL Developerを使用しますが、フリーソフトウェアではありません)

編集:このスレッドでは、ラッパー関数を記述してデュアルから選択する方法がありました。私は試した、あなたは、グリッドを得ることはありませんが、あなたはあまりにも多くの努力なしでデバッグ出力の種類を取得:

Oracle SQL Developer: Show REFCURSOR Results in Grid?

+0

は感謝ウィリアム - 少なくとも私は怒っつもりはありません。上記のように実行して終了しましたが、各列の変数を取得します。 'ループ Res、ActDateにtestcursorを取り込みます; testcursor%notfoundのときに終了します。 DBMS_OUTPUT.PUT_LINE(Res || '|' || ActDateなど); end loop; close testcursor; ' – PoorbandTony

+0

私は以前の質問へのリンクを使って自分の答えを更新しました。プロシージャを関数にラップしてデュアルから選択するという提案がありました。 –

関連する問題