Проблема при выполнении запроса в процедуре - PullRequest
0 голосов
/ 24 мая 2018

У меня есть процедура, которая ожидает оператор SELECT в качестве параметра.Если я запускаю оператор SELECT из процедуры, он работает нормально, но когда я запускаю его внутри процедуры, я получаю сообщение об ошибке:

Процедура:

data_dump(query_in => 'select * from reservation where type not in ('H','PURGE','E') ',
                               file_in      => 'export_'||months_from||''||months_to||'.csv',
                              directory_in => 'C:\Users\Administrator\Desktop\test',
                              delimiter_in => '|' );

Сам запрос даетмне ожидаемый результат.

select * from reservation where type not in ('H','PURGE','E', '|| other ||') 


The error is: encountered the symbol 'H'.

Может ли это быть из-за одинарных кавычек вокруг условия IN?

при получении ошибки отсутствует правая скобка:

(trunc(a.update_date) between (select add_months(TRUNC(SYSDATE), -(]'|| months_from ||q'[') ) from dual) and (select add_months(TRUNC(SYSDATE), -(]'|| months_to ||q'[') from dual))]'

1 Ответ

0 голосов
/ 24 мая 2018

Вы передаете аргументы в кавычках внутри строки.Вам нужно либо избежать этих внутренних кавычек:

data_dump(query_in => 'select * from reservation where type not in (''H'',''PURGE'',''E'') ',
                               file_in      => 'export_'||months_from||''||months_to||'.csv',
                              directory_in => 'C:\Users\Administrator\Desktop\test',
                              delimiter_in => '|' );

Или использовать альтернативный механизм цитирования :

data_dump(query_in => q'[select * from reservation where type not in ('H','PURGE','E') ]',
...

Со своим «другим» значением вынужно по-прежнему включать это в свои собственные escape-кавычки:

data_dump(query_in => 'select * from reservation where type not in (''H'',''PURGE'',''E'','''|| other ||''')',
...

или (возможно, становится менее читаемым сейчас):

data_dump(query_in => q'[select * from reservation where type not in ('H','PURGE','E',']' || other || q'[')]',
...

Вы можете использовать dbms_output для отладки такого роданапечатать сгенерированный аргумент и посмотреть, совпадает ли это с тем, что вы запускали вручную.


С вашим третьим частичным кодом вы поместили закрывающие одинарные кавычки после (предположительно числовых) переменных:

(trunc(a.update_date) between (select add_months(TRUNC(SYSDATE), -(]'|| months_from ||q'[') ) from dual) and (select add_months(TRUNC(SYSDATE), -(]'|| months_to ||q'[') from dual))]'
                                                                                         ^                                                                            ^

и, как говорится в сообщении, вам не хватает закрывающей скобки во втором вызове add_month;так и должно быть (где ... - остальная часть оператора, который вы не показали):

q'[ ... (trunc(a.update_date) between (select add_months(TRUNC(SYSDATE), -(]'
  || months_from ||q'[) ) from dual) and (select add_months(TRUNC(SYSDATE), -(]'
  || months_to ||q'[) ) from dual))]'

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

Также вам не нужны внутренние данные select from dual или все скобки;Вы можете просто сделать:

q'[ ... trunc(a.update_date) between add_months(TRUNC(SYSDATE), -]'
  || months_from ||q'[) and add_months(TRUNC(SYSDATE), -]'|| months_to ||q'[)]'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...