Вызов процедуры Oracle в цикле for - PullRequest
0 голосов
/ 20 февраля 2019

Я создал и сохранил процедуру в SQLDeveloper.Я могу назвать это, и это работает как ожидалось.Однако, если я пытаюсь использовать его в цикле for для набора таблиц, я получаю ошибку:

ORA-06512: в строке 10

00000 - «неверный оператор SQL»

Это процедура:

create or replace PROCEDURE ADD_PARAMETERS 
(
  TBL_NAME IN VARCHAR2 
) AS 
BEGIN

  EXECUTE IMMEDIATE 'ALTER TABLE '||TBL_NAME||' ADD(FB_AREA_HA Float)';

  EXECUTE IMMEDIATE 'UPDATE '||TBL_NAME||' SET FB_AREA_HA = FB_AREA/10000';
END ADD_PARAMETERS;

А вот цикл for с процедурой

SET SERVEROUT ON
DECLARE

sql_stmnt VARCHAR2(400);

BEGIN
    FOR x in (SELECT * FROM all_tables WHERE table_name LIKE 'BBX_%')
    LOOP
        sql_stmnt := 'EXECUTE ADD_PARAMETERS('''||x.TABLE_NAME||''')';
        DBMS_OUTPUT.PUT_LINE(sql_stmnt||';');
        EXECUTE IMMEDIATE sql_stmnt;
    END LOOP;
END;

В чем причина этой ошибки?Я почти уверен, что это не строка 10, хотя ...

1 Ответ

0 голосов
/ 20 февраля 2019

EXECUTE не является командой SQL.Это сокращение клиента SQL * Plus (и других) для анонимного блока.Динамический оператор выполняется в контексте SQL, а не в клиенте, поэтому он не распознается - отсюда и ошибка (которая действительно исходит из строки 10 вашего блока, поскольку именно там происходит EXECUTE IMMEDIATE).

Вы можете сделать эквивалент расширения этого сокращения:

sql_stmnt := 'BEGIN ADD_PARAMETERS('''||x.TABLE_NAME||'''); END;';

Но вам не нужен динамический SQL для процедуры вызов , вы можете просто сделать:

BEGIN
    FOR x in (SELECT * FROM all_tables WHERE table_name LIKE 'BBX_%')
    LOOP
        ADD_PARAMETERS(x.TABLE_NAME);
    END LOOP;
END;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...