Немедленное выполнение "Создать или заменить представление" дает 00900. 00000 - ошибка "неверный оператор SQL"
Я застрял с этой ошибкой. Подскажите, пожалуйста, в чем ошибка в коде ниже? Это написано внутри процедуры, которая принимает входные данные для переменных. Благодарю.
execute immediate 'Create or replace view '||p_viewname||' AS
select * from (
select NAME, CODETYPE, CODE
from HLIDEV_VIEWS.V_CONCEPT
WHERE HLIDEV_VIEWS.V_CONCEPT.CONCEPTTYPE = '''||p_concepttype||'''
)
pivot
(
max(code)
for codetype in ('||all_codetypes||')
)';
Обновление: ниже ошибка, которую я вижу.
EXEC "HLIDEV_VIEWS"."FinalCreatePOAView" ('POA_CONCEPT_TYPE','PresentOnAdmission')
Error report -
ORA-00911: invalid character
ORA-06512: at "HLIDEV_VIEWS.FinalCreatePOAView", line 39
ORA-06512: at line 1
00911. 00000 - "invalid character"
*Cause: identifiers may not start with any ASCII character other than
letters and numbers. $#_ are also allowed after the first
character. Identifiers enclosed by doublequotes may contain
any character other than a doublequote. Alternative quotes
(q'#...#') cannot use spaces, tabs, or carriage returns as
delimiters. For all other contexts, consult the SQL Language
Reference Manual.
*Action:
2 ответа
То, что вы пытаетесь сделать, вполне выполнимо с помощью команды немедленного выполнения. У вас просто где-то есть синтаксическая ошибка или таблица действительно не существует.
Попробуйте записать строку, которую вы строите, в DBMS_OUTPUT.PUT_LINE, а не отправлять ее в EXECUTE IMMEDIATE. Затем попробуйте запустить эту строку как команду в SQL*Plus. Это должно подчеркнуть ошибку.
FWIW, у меня нет ваших объектов в моей базе данных, но я написал EXECUTE IMMEDIATE в той же форме, что и ваша, и она отлично работает в Oracle 11g2.
DECLARE
p_view_name VARCHAR2(61) := 'VXSMIMMCP.MATT_V';
p_region_code VARCHAR2(30) := 'R01';
p_all_port_codes VARCHAR2(400) := '''P01'',''P02'',''P03''';
BEGIN
EXECUTE IMMEDIATE
'Create or replace view '
|| p_view_name
|| ' AS select * from ( select REGION_CODE, account_number , port_code from APPS.XXCUS_ACCOUNTS WHERE APPS.XXCUS_ACCOUNTS.REGION_CODE = '''
|| p_region_code
|| ''' ) pivot ( min(account_number) for port_code in ('
|| p_all_port_codes
|| ') )' ;
END;
Спасибо @MatthewMcPeak и @MahendarMahi за ваш вклад. Внезапно мой код начал работать нормально, и он создал представление так, как я хотел. Единственное, что я сделал, было, как предложил @MahendarMahi, я удалил pivot и запустил его, чтобы увидеть ту же ошибку, а затем заменил pivot, и ошибка исчезла. Я уверен, что в коде нет изменений, но в любом случае это странно работает сейчас. Еще раз спасибо за ваше время.