Немедленное выполнение "Создать или заменить представление" дает 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, и ошибка исчезла. Я уверен, что в коде нет изменений, но в любом случае это странно работает сейчас. Еще раз спасибо за ваше время.

Другие вопросы по тегам