Невозможно запустить динамический запрос в хранимой процедуре при выборе количества записей

#sql #oracle #stored-procedures #oracle-sqldeveloper

#sql #Oracle #хранимые процедуры #oracle-sqldeveloper

Вопрос:

Привет, я пытаюсь просто получить количество данных в исходной таблице.

 CREATE OR REPLACE PROCEDURE MOVE_CHECK (SCHEMA_SOURCE   IN VARCHAR2,
                                        SCHEMA_TARGET   IN VARCHAR2,
                                        TABLE_SOURCE    IN VARCHAR2,
                                        TABLE_TARGET    IN VARCHAR2,
                                        COLUMN_SOURCE   IN VARCHAR2,
                                        COLUMN_TARGET   IN VARCHAR2)
AS
   A              VARCHAR2 (30);
   B              VARCHAR2 (30);
   C              VARCHAR2 (30);
   D              VARCHAR2 (30);
   E              VARCHAR2 (30);
   F              VARCHAR2 (30);
   Count_source   NUMBER (38);
   TEMP_1         VARCHAR2 (100);
BEGIN
   A := SCHEMA_SOURCE;
   B := SCHEMA_TARGET;
   C := TABLE_SOURCE;
   D := TABLE_TARGET;
   E := COLUMN_SOURCE;
   F := COLUMN_TARGET;

   TEMP_1 :=
      'select count ( ' || E || ' ) into  Count_source   from ' || C || ';';

   DBMS_OUTPUT.PUT_LINE ('STARTED');
   DBMS_OUTPUT.PUT_LINE (TEMP_1);

   EXECUTE IMMEDIATE (TEMP_1);

   DBMS_OUTPUT.PUT_LINE ('source_count:' || Count_source);

   DBMS_OUTPUT.PUT_LINE ('END');
END MOVE_CHECK;
  

Я получаю

 Connecting to the database 
ORA-00911: invalid character
ORA-06512: at "YDSCST.MOVE_CHECK", line 31
ORA-06512: at line 16
  

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

Я пытаюсь закодировать процедуру, в которой я могу проверить, полностью ли все данные перемещены из исходной таблицы в целевую.

Ответ №1:

Ваш динамический оператор не должен иметь точку с запятой в конце; это разделитель операторов, и он не относится или не действителен для одного оператора. В любом случае вы можете динамически запускать только один оператор SQL (если вы не помещаете несколько в анонимный блок PL / SQL).

Вы into тоже не в том месте:

 TEMP_1 := 'select count ( '|| E ||' ) from ' || C;

DBMS_OUTPUT.PUT_LINE ('STARTED');
DBMS_OUTPUT.PUT_LINE (TEMP_1);

EXECUTE IMMEDIATE TEMP_1 INTO Count_source;
  

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

 TEMP_1 := 'select count ( '|| COLUMN_SOURCE ||' ) from ' || TABLE_SOURCE;
  

Комментарии:

1. Спасибо, Алекс 🙂 теперь это работает. Но я, когда жестко запрограммировал sql-запрос в SP: выберите count<column> в count_source из <имя_таблицы>, и sp работал.

2. Как статический запрос, который будет работать; как динамический запрос, который получит ORA-00905.