web-dev-qa-db-ja.com

RefCursor戻り型を使用してOracleストアドプロシージャをテストする方法

SQL DeveloperまたはEmbarcardero Rapid XE2でOracleストアドプロシージャをテストする方法についての良い説明を探しています。ありがとうございました。

36
Ryan Fisch

何かのようなもの

create or replace procedure my_proc( p_rc OUT SYS_REFCURSOR )
as
begin
  open p_rc
   for select 1 col1
         from dual;
end;
/

variable rc refcursor;
exec my_proc( :rc );
print rc;

sQL * PlusまたはSQL Developerで動作します。 Embarcardero Rapid XE2の使用経験がないため、このようなSQL * Plusコマンドをサポートしているかどうかわかりません。

63
Justin Cave

このようなものを使用すると、ほとんどすべてのクライアントでプロシージャをテストできます。

DECLARE 
  v_cur SYS_REFCURSOR;
  v_a   VARCHAR2(10);
  v_b   VARCHAR2(10);
BEGIN
  your_proc(v_cur);

  LOOP
    FETCH v_cur INTO v_a, v_b;
    EXIT WHEN v_cur%NOTFOUND;
    dbms_output.put_line(v_a || ' ' || v_b);
  END LOOP;
  CLOSE v_cur;
END;

基本的に、テストハーネスはSYS_REFCURSOR変数の定義と、定義した変数を渡しながらプロシージャを呼び出す機能をサポートし、カーソル結果セットをループする必要があります。 PL/SQLはそれをすべて行います。匿名ブロックは、セットアップと保守が容易で、かなり適応性があり、PL/SQLを使用するすべての人にとって非常に読みやすいものです。

別の方法ですが、同じことを行う名前付きプロシージャを作成し、クライアントにデバッガー(SQL Developer、PL/SQL Developer、TOADなど)があると仮定すると、実行をステップ実行できます。

21
DCookie

SQL Developerでは、パッケージ本体を右クリックして、「実行」を選択できます。 「PL/SQLの実行」ウィンドウでは、PL/SQLブロックを編集できます。 [OK]をクリックすると、[出力変数-ログ]というタイトルのウィンドウペインに出力変数タブが表示されます。左側で出力変数を選択でき、結果が右側に表示されます。非常に便利で高速です。

RapidをT-SQLで使用しましたが、これに似たものがあったと思います。

DCookieの例のように、カーソルをループする独自のdelcare-begin-endスクリプトを作成することは、時々行う良い練習です。それは何でも動作し、あなたのコードが動作することがわかります。

10
Glenn Wark

Toad 10.1.1.8では、次を使用します。

variable salida refcursor
exec MY_PKG.MY_PRC(1, 2, 3, :salida)  -- 1, 2, 3 are params
print salida

次に、スクリプトとして実行します。

5
create or replace procedure my_proc(  v_number IN number,p_rc OUT SYS_REFCURSOR )
as
begin
open p_rc
for select 1 col1
     from dual;
 end;
 /

そして、ストアドプロシージャを呼び出す関数嘘を書いてください

 create or replace function my_proc_test(v_number IN NUMBER) RETURN sys_refcursor
 as
 p_rc sys_refcursor;
 begin
 my_proc(v_number,p_rc);
 return p_rc;
 end
 /

その後、SQLDeveloperエディターでこのSQLクエリを実行できます。

 SELECT my_proc_test(3) FROM DUAL;

コンソールで結果を右クリックし、単一のレコードビューでクリックして結果を編集し、refカーソルによって返されたすべてのレコードを表示できます。

3
user1118468

このリンクで十分だと思います。 Oracleプロシージャを実行する方法を探していたときに見つけました。

ページへのリンク

簡単な説明:

--cursor variable declaration 
variable Out_Ref_Cursor refcursor;
--execute procedure 
execute get_employees_name(IN_Variable,:Out_Ref_Cursor);
--display result referenced by ref cursor.
print Out_Ref_Cursor;
1
Shivam Sharma