ORA-00907 при динамическом создании представления в PL / SQL и использовании CLOB - PullRequest
2 голосов
/ 03 октября 2011

Это одна из тех ситуаций, когда вы получаете бесполезное сообщение об ошибке от Oracle.

Моя ситуация такова: я динамически создаю представление в PL / SQL.Я строю строку и использую EXECUTE IMMEDIATE для создания представления.Строка настолько длинная, что я использую CLOB для ее хранения.

Когда я запускаю приведенный ниже код в TOAD, я получаю бесполезное

ORA-00907: missing right parenthesis error. 

Вручную создание представления в TOAD (без EXECUTE IMMEDIATE) не вызывает проблем.Мне кажется, что здесь важна длина строки, так как я успешно создал представления с более короткими строками (а также с помощью to_char () вместо dbms_lob.substr (), однако to_char () работает только с меньшими clob).

Общая длина строки составляет 13775. (Очевидно, я редактировал строку ниже, где я строю строку.) Это база данных Oracle 10g в Linux.

declare
lv_sql CLOB;

begin
lv_sql := ' CREATE OR REPLACE FORCE VIEW my_view.....';

EXECUTE IMMEDIATE dbms_lob.substr(lv_sql, 14765, 1 );    
end;

1 Ответ

4 голосов
/ 03 октября 2011

Как сказал Клас, вы должны иметь возможность использовать VARCHAR2 (32767) для объявления вашей переменной, но если вы обнаружите, что этого недостаточно, вы можете просто использовать более одной переменной VARCHAR2 для хранения различных частей представления.оператора, а затем введите их в оператор EXECUTE IMMEDIATE.

Ответ AskTom здесь демонстрирует:

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:6161200355268

Говорит:

Выуказали, что максимальная длина строки для немедленного выполнения составляет 32 КБ.

Мы используем команду немедленного выполнения для создания сгенерированных пакетов, и в настоящее время мы передаем ее> 35000 символов

путем немедленного выполнения v_myvc1 ||my_vc2

vc1 и vc2 - 32 k varchar2 vars.общая длина которого

35000

Все по 8.1.7

Мой вопрос: какова максимальная длина строки немедленного выполнения, причина Iволновался, что это было 32 КБ, и мы уже по этому, и я не уверен, когда я собираюсь ударить стену.

Том Кайт отвечает:

Продолжение 5 марта 2003 г. - 18:00 Центральный часовой пояс:

интересно - никогда бы не подумал сделать это такway.

Это похоже на работу - ударит ли он о стену?не уверен, я бы никогда не перешел 32 КБ.

похоже, что он может быть довольно большим:

ops$tkyte@ORA817DEV> declare   
2          l_str1 long := 'select /* ' || rpad( '*', 20000, '*' ) || ' */ * '; 
3          l_str2 long := 'from /* '   || rpad( '*', 15000, '*' ) || ' */ dual';
4          l_str3 long := '/* '   || rpad( '*', 32000, '*' ) || ' */ ';   
5          l_result dual.dummy%type;   
6  begin   
7          execute immediate l_str1||l_str2||l_str3||l_str3||l_str3||' d' into l_result; 
8          dbms_output.put_line( l_result );   
9  end;  
10  / 

PL / SQL-процедура успешно завершена.

Хотя это было на экземпляре базы данных Oracle 8i, я был бы очень удивлен, если бы возможность последовательного изменения переменных VARCHAR2 была упущена в более поздних версиях.К сожалению, я не могу проверить это, так как у меня нет 10g экземпляра, доступного для раздачи.

...