oracle 使用存储过程构建和执行查询-返回多行并存储在每个变量中

ddhy6vgd  于 2023-10-16  发布在  Oracle
关注(0)|答案(1)|浏览(140)

我正在尝试创建一个存储过程,该过程将执行以下操作:
1.从表(DWH_ALM_ST_AUDIT_TRAIL_MAP)返回选定值并插入变量
1.返回的值是SQL语句的一部分
1.执行生成的SQL语句
我已经测试了在脚本输出中打印,使用DBS_OUTPUT.PUT_LINE,结果看起来很公平。但是,当我尝试执行过程(而不是打印)时,结果提示成功,但是尽管行匹配条件,也没有进行更新。
为了更好地说明,您可以参考下面的代码和示例数据。
我创建了下面的SQL语句:

create or replace PROCEDURE SP_GET_ROW_NUM
AS
/* cursor used to store multiple rows of values in a variable */
    CURSOR ROW_NUM_CUR IS
        SELECT  ROW_NUM
        FROM    DWH_ALM_ST_AUDIT_TRAIL_MAP;

    CURSOR QUERY_CUR IS
        SELECT  QUERY
        FROM    DWH_ALM_ST_AUDIT_TRAIL_MAP;

    ROW_t ROW_NUM_CUR%ROWTYPE;
    TYPE ROW_ntt IS TABLE OF ROW_t%TYPE; 
    l_ROW  ROW_ntt;

    QUERY_t QUERY_CUR%ROWTYPE;
    TYPE QUERY_ntt IS TABLE OF QUERY_t%TYPE; 
    l_QUERY  QUERY_ntt;

    SQL_STAT VARCHAR2(2000);

BEGIN
    OPEN  ROW_NUM_CUR;
    FETCH ROW_NUM_CUR BULK COLLECT INTO l_ROW;
    CLOSE ROW_NUM_CUR;

    OPEN  QUERY_CUR;
    FETCH QUERY_CUR BULK COLLECT INTO l_QUERY;
    CLOSE QUERY_CUR;

    FOR i IN 1..l_ROW.COUNT LOOP
        SQL_STAT := 'UPDATE DWH_ALM_GAP_STRESS_TEST SET ROW_NUM = ' || l_ROW(i).ROW_NUM || ' ' || l_QUERY(i).QUERY || ';' ;

    END LOOP;

END SP_GET_ROW_NUM;

这是示例数据:
DWH_ALM_ST_AUDIT_TRAIL_MAP
| 行数|查询|
| --|--|
| 45 |其中TOP_CONVENTION = 'CAISSE TITRES'且PERIMETRE = 'I.外部|
| 46 |其中TOP_CONVENTION = 'BRUT' AND PERIMETRE = 'II.外部OCAA'|
真的很感激如果有人能在这方面提供建议。
如果需要,我很乐意分享更多。

nafvub8i

nafvub8i1#

包括缺失的EXECUTE IMMEDIATE功能,现在一切都工作得很好!

create or replace PROCEDURE SP_GET_ROW_NUM
AS
    CURSOR ROW_NUM_CUR IS
        SELECT  ROW_NUM
        FROM    DWH_ALM_ST_AUDIT_TRAIL_MAP;

    CURSOR QUERY_CUR IS
        SELECT  QUERY
        FROM    DWH_ALM_ST_AUDIT_TRAIL_MAP;

    ROW_t ROW_NUM_CUR%ROWTYPE;
    TYPE ROW_ntt IS TABLE OF ROW_t%TYPE; -- must use type
    l_ROW  ROW_ntt;

    QUERY_t QUERY_CUR%ROWTYPE;
    TYPE QUERY_ntt IS TABLE OF QUERY_t%TYPE; -- must use type
    l_QUERY  QUERY_ntt;

    SQL_STAT VARCHAR2(2000);

BEGIN
    OPEN  ROW_NUM_CUR;
    FETCH ROW_NUM_CUR BULK COLLECT INTO l_ROW;
    CLOSE ROW_NUM_CUR;

    OPEN  QUERY_CUR;
    FETCH QUERY_CUR BULK COLLECT INTO l_QUERY;
    CLOSE QUERY_CUR;

    FOR i IN 1..l_ROW.COUNT LOOP
        SQL_STAT := 'UPDATE DWH_ALM_GAP_STRESS_TEST SET ROW_NUM = ' || l_ROW(i).ROW_NUM || ' ' || l_QUERY(i).QUERY;
        EXECUTE IMMEDIATE SQL_STAT;

    END LOOP;

END SP_GET_ROW_NUM;

相关问题