проверка правильности оператора хранимой процедуры - PullRequest
0 голосов
/ 11 мая 2018

Я пытаюсь выполнить этот оператор хранимой процедуры,

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

В конце говорится «Процедура завершена '

Может кто-нибудь помочь мне в этом.

1 Ответ

0 голосов
/ 11 мая 2018

В вашей динамической подготовке 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...