0

ストアド関数から取得したいくつかの変数があります。それらをストアド プロシージャのカーソルとして返したい。(理由は、Jasper レポートでそれらを使用したいためであり、Jasper はカーソル出力のあるストアド プロシージャのみを許可するためです)

私のPL/SQLコードは次のとおりです。

procedure myprocedure (my_cursor OUT sys_refcursor) is
    output1 TABLE1.FIELD1%TYPE;
    output2 TABLE1.FIELD2%TYPE;
    output3 TABLE2.FIELD1%TYPE;
    output4 TABLE1.FIELD3%TYPE;
    begin
        IF NOT(package1.function1 (output1, output2, output3, output3))
        THEN                
            output1 := NULL;
            output2 := NULL;
            output3 := NULL;
            output4 := NULL;
        END IF;
    open my_cursor for
    select :output1 as myoutput1, :output2 as myoutput2, :output3 as myoutput3, :output4 as myoutput4
    from DUAL
end myprocedure;

私は得るPLS-00049: bad bind variable 'output1'

関数の結果をカーソルで返すにはどうすればよいですか?

4

2 に答える 2

0

@Ramblin' Manがコメントしたようにコロン(:)を除外すると、問題が解決しました。

select output1 as myoutput1, output2 as myoutput2, output3 as myoutput3, output4 as myoutput4 from DUAL

SQL のコロンはバインド変数と呼ばれます。

この記事でわかるように、PL/SQL 自体がバインド変数に関する問題のほとんどを処理します。

また、PL/SQL の例の最後: p_empno をバインド変数に置き換える必要があると思われるかもしれません。ただし、幸いなことに、PL/SQL 変数へのすべての参照は、実際にはバインド変数です

ご協力ありがとうございました。

于 2013-10-01T09:40:35.917 に答える
-1
CREATE TABLE test_tbl
(
    col1 VARCHAR(5)
,   col2 VARCHAR(5)
,   col3 VARCHAR(5)
);


DECLARE
    l_output1 test_tbl.col1%TYPE;
    l_output2 test_tbl.col2%TYPE;
    l_output3 test_tbl.col3%TYPE;

    l_select VARCHAR2(32767);
    l_cur    SYS_REFCURSOR;
BEGIN
    l_output1 := 'col1';
    l_output2 := 'col2';
  --l_output3

    l_select := 'SELECT '
                    || CASE WHEN l_output1 IS NOT NULL THEN '''' || l_output1 || ''' AS my_' || l_output1 ELSE 'NULL' END || CASE WHEN l_output2 IS NOT NULL THEN  ', ' ELSE NULL END
                    || CASE WHEN l_output2 IS NOT NULL THEN '''' || l_output2 || ''' AS my_' || l_output2 ELSE NULL   END || CASE WHEN l_output3 IS NOT NULL THEN  ', ' ELSE NULL END
                    || CASE WHEN l_output3 IS NOT NULL THEN '''' || l_output3 || ''' AS my_' || l_output3 ELSE NULL   END ||
                ' FROM DUAL';

    DBMS_OUTPUT.PUT_LINE(l_select);

    OPEN l_cur FOR l_select;

    IF l_cur%ISOPEN THEN
        DBMS_OUTPUT.PUT_LINE('l_cur IS OPEN');

        CLOSE l_cur;
    END IF;
END;
/*
Result:

SELECT 'col1' AS my_col1, 'col2' AS my_col2 FROM DUAL
l_cur IS OPEN
*/
于 2013-09-10T13:13:05.247 に答える