2017-01-24 24 views
0

"select 'a' as alphabet, 1 as number from dual"のような文字列をプロシージャに渡して、同じものをカーソルに割り当てる必要があります。ここでOracleプロシージャのカーソルをvarchar2変数として

は私のprocは

CREATE OR REPLACE PROCEDURE ME(sqlstmt in varchar2) 
AS 
    C1 CURSOR IS sqlstmt; 

BEGIN 
    FOR REC IN C1 
     LOOP 
      DBMS_OUTPUT.PUT_LINE(REC.alphabet); 
     END LOOP; 
END; 

どのように見えるか私のコードで即時や他のものを実行しようとしましたが、何も助けません。

答えて

0

あなただけVARCHAR2に保存された選択に基づいて、カーソルを開くために、わずかに異なる構文を必要とする:

CREATE OR REPLACE PROCEDURE ME(sqlstmt IN VARCHAR2) AS 
    C1          SYS_REFCURSOR; 
    vAlphabet varchar2(100); 
    vNumber  number; 
BEGIN 
    OPEN C1 FOR sqlstmt; 

    LOOP 
     FETCH C1 INTO vAlphabet, vNumber; 

     EXIT WHEN C1%NOTFOUND; 
     DBMS_OUTPUT.PUT_LINE(vAlphabet); 
    END LOOP; 
END; 

プロシージャ呼び出し、声明の中で、このような'number'として予約語を避けるために注意を払っ:

SQL> exec ME('select ''a'' as alphabetValue, 1 as numberValue from dual'); 
a 

PL/SQL procedure successfully completed. 

データをフェッチするためにカーソルによって返された列の数と種類を事前に知っておく必要があることに注意してください。

+0

大変お手伝いしました。どうもありがとう。 – Jay

関連する問題