0

OracleSqlDeveloperでこの単純なストアドプロシージャをテストするのに問題があります。ストアドプロシージャは単純な選択を実行し、カーソルを返します。

create or replace
PROCEDURE GET_PROJECT_DRF_HISTORY

( projectId IN NUMBER,
  resultset_out OUT sys_refcursor
) AS

BEGIN

  OPEN resultset_out for
  SELECT * from GLIDE_HISTORY
  where GLIDE_HISTORY.PRJ_ID = projectId;
/*  DBMS_OUTPUT.PUT_LINE(resultset_out);*/

END GET_PROJECT_DRF_HISTORY;

この手順をテストするために、次のスクリプトを使用しました。

variable results sys_refcursor;

exec get_project_drf_history(3345, :results);

print :results;

oracleとSqlDeveloperツールの両方に慣れていないので、ここでの間違いを理解するのに苦労しています。パスワードがないため、Sql*Plusでこれを確認できません。Oracle SqlDeveloper1.1.2.25とOracle10gを使用しています。

誰か助けてくれませんか?前もって感謝します。

4

3 に答える 3

1

サミー、

変数宣言は、sys_refcursorではなく refcursor にする必要があります。また、結果を出力するときは、変数自体を出力しているので、: (バインド変数であることを示すために使用されます) は必要ありません。

次のスクリプトを SQL Developer で正常に実行できました (もちろん sql plus.)。SQL Developer の場合は、F5 を使用してスクリプトとして実行します。

--Creating Procedure
create or replace procedure test_ref(
i_limit number,
o_results out sys_refcursor
) is
begin
   open o_results for 
      'select object_name 
        from all_objects
        where rownum < ' || i_limit;
end;
/

そして、このプロシージャを呼び出すスクリプト。(F5 を使用してスクリプトとして実行します)。

var c1 refcursor;

exec test_ref(10,:c1);

print c1;
于 2010-09-21T18:55:22.093 に答える
0

これが実際の例です。refcursorを宣言してから、匿名ブロックでprocを呼び出して値を割り当てます。それからあなたはそれを印刷します

var x REFCURSOR ;

declare
     /*a no cleanup procedure*/
      procedure GetMeMyRefCursor(outter out nocopy sys_refcursor) 
        as
        begin
             open outter for 
                    select level 
                     from dual 
                     connect by level <= 5;           
        end GetMeMyRefCursor;
begin
  GetMeMyRefCursor(:x); 
  /*note you pass in the refcursor you created via the :X*/
end ;
/ 

print x; 
/*now print it*/

/*LEVEL                  
---------------------- 
1                      
2                      
3                      
4                      
5*/ 

コメントに基づく:コメントを使用しているため、印刷ではなくIN / OUTパラメータに問題があります(質問と他の回答だけでタイトルを読んでいませんでした)

これは機能します:(コードに基づく)

create or replace
PROCEDURE GET_PROJECT_DRF_HISTORY

( projectId     IN NUMBER,
  resultset_out OUT sys_refcursor
) AS

BEGIN

  OPEN resultset_out for
  SELECT level from dual connect by level <= projectId;
/*  DBMS_OUTPUT.PUT_LINE(resultset_out);*/

END GET_PROJECT_DRF_HISTORY;
/

var results REFCURSOR; 
--this needs to be REFCURSOR (at least in 10g and 11i)
exec GET_PROJECT_DRF_HISTORY(5, :results); 

print results;
/

SQL Developerでデバッグする場合は、SQL Developerから直接パッケージとプロシージャをデバッグすることもできます(これは実際の節約になります)。SQLDeveloperでデバッグするのは非常に簡単です。

[接続]->[スキーマ]->[手順]->[GET_PROJECT_DRF_HISTORY]を右クリックして、[デバッグ用にコンパイル]をクリックします。次に、手順でブレークポイントを配置し、右クリックして「デバッグ」します(これにより、匿名ブロックが作成されます。以下を参照してください。ここに値などを入力できます)

DECLARE
  PROJECTID NUMBER;
  RESULTSET_OUT sys_refcursor;
BEGIN
  PROJECTID := NULL;

  GET_PROJECT_DRF_HISTORY(
    PROJECTID => PROJECTID,
    RESULTSET_OUT => RESULTSET_OUT
  );
  -- Modify the code to output the variable
  -- DBMS_OUTPUT.PUT_LINE('RESULTSET_OUT = ' || RESULTSET_OUT);
END;

http://www.oracle.com/technetwork/developer-tools/sql-developer/sqldeveloperwhitepaper-v151-130908.pdf 11ページ)

それ以外の場合、これをすべてDeveloperから実行している場合、エラーは表示されるはずのようには見えません。

しかし、私が実際に起こっていると思うのは、VARが正しくないため、存在しないということです。

variable results sys_refcursor;

Usage: VAR[IABLE] [ <variable> [ NUMBER | CHAR | CHAR (n [CHAR|BYTE]) |
VARCHAR2 (n [CHAR|BYTE]) | NCHAR | NCHAR (n) |
NVARCHAR2 (n) | CLOB | NCLOB | REFCURSOR |
BINARY_FLOAT | BINARY_DOUBLE ] ]

それで、私の最初の例「varxREFCURSOR;」から始めます。動作するはずです

于 2010-09-21T18:04:50.943 に答える
0

管理者に SQL Developer のバージョンをアップグレードするよう依頼することをお勧めします。あなたのものはかなり時代遅れであり、いくつかのあいまいなバグに遭遇している可能性があります. (バージョン 1 を使用しようとしたときに実行しました) 2.1 になっているはずです。

于 2010-09-23T02:26:53.480 に答える