2014-09-04 2 views
2

Я работаю над процедурой Oracle, которая должна быть очень автоматизированной, и поэтому я использую динамический SQL. Я новичок в использовании динамического SQL.Борьба с Oracle динамический SQL

Я использую переменную varchar2 для построения SQL, который должен быть выполнен. Я использовал DBMS_OUTPUT для захвата SQL, который будучи создан, и он выполняет отлично:

SQL для создания корзины подкачки таблицы = CREATE TABLE INBOUND.BASKET_CTAS_SWP компресс QUERY достигающих SELECT * FROM INBOUND.BASKET_FCT РАЗДЕЛА (SYS_1234) ;

Однако, когда я выполнить процедуру с помощью этого, он генерирует ошибку ниже

Execute MyProcedure; 

Спасибо за какие-либо указания!

оракул версия: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit производства

IDE: Oracle SQL Developer версии 4.0.2.15 Сборка 15,21

Код:

note: all variables set at beginning of procedure... 
Sqlexec:= 'CREATE TABLE ' || Basket_Swap_Schema || '.' || Basket_Swap_Table_Name || ' '; 
Sqlexec:= Sqlexec || 'COMPRESS FOR QUERY HIGH '; 
Sqlexec:= Sqlexec || 'AS SELECT * FROM ' || Basket_Source_Schema_Name || '.' || Basket_Source_Table_Name || ' '; 
Sqlexec:= Sqlexec || 'PARTITION ('||Basket_Partition_To_Process||'); '; 

Dbms_Output.Put_Line('sql to create Basket Swap table = ' || Sqlexec); 

Execute Immediate Sqlexec; 

Сообщение об ошибке:

Ошибка, начинающаяся с линии: 1 в команде - Выполнение Process_Wic_Snap_Partition отчет Error - ORA-00911: недопустимый символ ORA-06512: на "MY_SCHEMA.MY_PROCEDURE", строка 102 ORA-06512: в строке 1 00911. 00000 - "недопустимый символ" * Причина: идентификаторы может не начинаться с любого символа ASCII, кроме букв и цифр. $ # _ также допускаются после первого символа . Идентификаторы, заключенные двойными кавычками, могут содержать любой символ, отличный от двойного. Альтернативные котировки (q '# ... #') не могут использовать пробелы, табуляции или возврат каретки как разделители . Для всех других контекстов обратитесь к Справочнику по языку SQL .

ответ

5

Ваш запрос прекрасен, но с DynamicSQL вам не разрешено иметь точку с запятой в конце вашего оператора. Измените строку Sqlexec:= Sqlexec || 'PARTITION ('||Basket_Partition_To_Process||'); '; , чтобы не включать точку с запятой в конце инструкции: Sqlexec:= Sqlexec || 'PARTITION ('||Basket_Partition_To_Process||')';

+0

удивительный, вот и все. спасибо – Steve