【问题标题】:checking the validity of a stored procedure statement检查存储过程语句的有效性
【发布时间】:2018-05-11 10:16:00
【问题描述】:

我正在尝试执行这个存储过程语句,

CREATE OR REPLACE PROCEDURE table_records_select IS
    TYPE loc_array_type IS TABLE OF VARCHAR2(100)
        INDEX BY binary_integer;
    dml_str VARCHAR2        (200);
    loc_array    loc_array_type;
BEGIN
    -- bulk fetch the list of tables
    SELECT table_name BULK COLLECT INTO loc_array
        FROM all_tab_columns;
    -- for each table, delete the records where EXCN_ID matches with EXCN_ID of t_int_excn_log table where excn_strt_tm < sysdate-7 
    FOR i IN loc_array.first..loc_array.last LOOP



        dml_str := 'select B.* from t_int_excn_log A,'
                    || loc_array(i) || ' B'
                    ||'where A.excn_strt_tm < sysdate-7 and A.excn_id=B.excn_id';

    EXECUTE IMMEDIATE dml_str ;
    END LOOP;
END;
/
SHOW ERRORS;

看来存储过程创建成功,显示有效。

但是当我尝试执行它时,它会显示各种错误,

ORA-00933: SQL 命令未正确结束 ORA-06512:在“HIAB_UAT.TABLE_RECORDS_SELECT”,第 19 行 ORA-06512: 在第 3 行

最后显示“程序已完成”

谁能帮帮我。

【问题讨论】:

  • 检查错误返回的循环。尝试在立即执行之前添加一些简单的东西,例如 dbms_output.put_line(dml_str)。

标签: sql oracle


【解决方案1】:

您的动态 SQL 准备中有一个错误:在“dml_str”准备的第二行。别名“B”后缺少空格。

您的代码:

|| loc_array(i) || ' B'
||'where A.excn_strt_tm < sysdate-7 and A.excn_id=B.excn_id';

应该是:

|| loc_array(i) || ' B '
||'where A.excn_strt_tm < sysdate-7 and A.excn_id=B.excn_id';



CREATE OR REPLACE PROCEDURE table_records_select IS
    TYPE loc_array_type IS TABLE OF VARCHAR2(100)
        INDEX BY binary_integer;
    dml_str VARCHAR2        (200);
    loc_array    loc_array_type;
BEGIN
    -- bulk fetch the list of tables
    SELECT table_name BULK COLLECT INTO loc_array
        FROM user_tab_columns;--all_tab_columns;
    -- for each table, delete the records where EXCN_ID matches with EXCN_ID of t_int_excn_log table where excn_strt_tm < sysdate-7 
    FOR i IN loc_array.first..loc_array.last LOOP



        dml_str := 'select B.* from t_int_excn_log A,'
                    || loc_array(i) || ' B '
                    ||'where A.excn_strt_tm < sysdate-7 and A.excn_id=B.excn_id';
    EXECUTE IMMEDIATE dml_str ;
    END LOOP;
END;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    • 2019-02-27
    • 1970-01-01
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多