2013-03-07 4 views
2

У меня небольшая проблема в 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" 

Если я исполню значение переменной у него работает отлично. Я использую SQL Developer в качестве входного интерфейса и работаю на сервере Oracle rg 11g r2. Я нашел похожие коды, где параметр «INCREMENT BY» был сгенерирован скриптом. Может кто-нибудь объяснить мою ошибку?

ответ

8

Когда вы 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; 

Это показано в examples for plain SQL. Просто чтобы сбить вас с толку, если вы используете PL/SQL в динамическом SQL, вам все равно нужны полуколоны, соответствующие самому PL/SQL, но не исполняемые /, которые вы использовали бы для его непосредственного запуска с клиента. Это показано в other examples.

 Смежные вопросы

  • Нет связанных вопросов^_^