Запустить строку как запрос в Oracle
У меня есть небольшая проблема в Oracle. Я пытаюсь создать последовательность для генерации идентификаторов в таблице, в которой уже есть данные. Я пытаюсь использовать следующий анонимный блок.
declare y varchar2(2000);
BEGIN
SELECT 'CREATE SEQUENCE ID_SEQ MINVALUE 1 MAXVALUE 9999999999 START WITH ' || (max(ID)+1) || ' INCREMENT BY 1 CACHE 20;' INTO y FROM TEST_TABLE;
--dbms_output.put_line(y);
execute immediate y;
end;
Я получаю следующую ошибку:
Error report:
ORA-00911: invalid character
ORA-06512: at line 5
00911. 00000 - "invalid character"
Если я выполню значение переменной y, оно будет работать отлично. Я использую SQL Developer в качестве входного интерфейса и работаю на сервере Oracle 11g r2. Я нашел похожие коды, в которых параметр 'INCREMENT BY' был сгенерирован скриптом. Может кто-нибудь объяснить мою ошибку?
1 ответ
Когда ты execute immediate
команда, которую вы запускаете, не должна иметь точку с запятой в конце; это разделитель команд в SQL Developer (и SQL * Plus, и других клиентах), а не часть самого оператора SQL.
SELECT 'CREATE SEQUENCE ID_SEQ MINVALUE 1 MAXVALUE 9999999999 START WITH '
|| (max(ID)+1) || ' INCREMENT BY 1 CACHE 20' INTO y FROM TEST_TABLE;
Это показано в примерах для простого SQL. Просто чтобы сбить вас с толку, хотя, если вы используете PL/SQL в динамическом SQL, вам все еще нужны точки с запятой, соответствующие самому PL/SQL - хотя не выполняющиеся /
вы бы использовали, чтобы запустить его прямо с клиента. Это показано в других примерах.