私は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;
は感謝ウィリアム - 少なくとも私は怒っつもりはありません。上記のように実行して終了しましたが、各列の変数を取得します。 'ループ Res、ActDateにtestcursorを取り込みます; testcursor%notfoundのときに終了します。 DBMS_OUTPUT.PUT_LINE(Res || '|' || ActDateなど); end loop; close testcursor; ' –
PoorbandTony
私は以前の質問へのリンクを使って自分の答えを更新しました。プロシージャを関数にラップしてデュアルから選択するという提案がありました。 –