无法从返回表的函数中使用动态SQL检索数据

时间:2013-08-06 13:53:15

标签: oracle stored-procedures dynamic

我的类型:

TYPE T_rowBalanceListForClient IS RECORD
(
    RowCode Asset.RowCode%TYPE,
    RowName Asset.RowName%TYPE
);  
TYPE T_tableBalanceListForClient IS TABLE OF T_rowBalanceListForClient;

我的功能:

FUNCTION F_BalanceListForClient
(
    p_ClientId Client.ClientId%TYPE
)
RETURN T_tableBalanceListForClient PIPELINED
AS
    CURSOR CUR_TABLE IS
        SELECT
                RowCode,
                RowName
            FROM Asset;
BEGIN

    FOR CUR_REC IN CUR_TABLE LOOP
        PIPE ROW(CUR_REC);
    END LOOP;

END;

我的部分存储过程:

    sql_statement := ' SELECT * FROM TABLE(:1)';
    OPEN c_Result FOR sql_statement USING F_BalanceListForClient(11);

在构建程序包时,我重新发现了Oracle错误:

PLS-00457:表达式必须是SQL类型

在常见的存储过程中,这样的调用是构建的并且运行良好(不是动态):

PROCEDURE GET_BALANCE_STANDARD_LIST
(
    c_Result OUT SYS_REFCURSOR,
    p_ClientId Client.ClientId%TYPE DEFAULT NULL
)
AS
BEGIN
    OPEN c_Result FOR
        SELECT RowName FROM TABLE(F_BalanceListForClient(p_ClientId));
END;

感谢任何帮助。 感谢。

1 个答案:

答案 0 :(得分:1)

CREATE OR REPLACE TYPE T_rowBalanceListForClient IS OBJECT 
(
    RowCode NUMBER,
    RowName VARCHAR2(200)
);  


CREATE OR REPLACE TYPE T_tableBalanceListForClient AS TABLE OF T_rowBalanceListForClient;
/


CREATE OR REPLACE FUNCTION F_BalanceListForClient
(
    p_ClientId NUMBER        
)
RETURN T_tableBalanceListForClient PIPELINED
AS
CURSOR CUR_TABLE IS
        SELECT
                RowCode,
                RowName
            FROM Assets
          ;    --put a filter of the p_clientId


BEGIN

    FOR CUR_REC IN CUR_TABLE
    LOOP

       pipe row (T_rowBalanceListForClient (CUR_REC.RowCode, CUR_REC.RowName));

    END LOOP;

RETURN;

END;
/


CREATE OR REPLACE PROCEDURE GET_BALANCE_STANDARD_LIST
(
    c_Result OUT SYS_REFCURSOR,
    p_ClientId NUMBER DEFAULT NULL
)
AS
sql_statement varchar2(200);

BEGIN

 sql_statement := ' SELECT * FROM TABLE(F_BalanceListForClient(:1))';
    OPEN c_Result FOR sql_statement USING p_ClientId;

END;
/

BEGIN

GET_BALANCE_STANDARD_LIST(:cur ,11);

END;
/