#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.