立即执行“创建或替换视图”给出 00900。00000 -“无效 SQL 语句”错误

Posted

技术标签:

【中文标题】立即执行“创建或替换视图”给出 00900。00000 -“无效 SQL 语句”错误【英文标题】:Execute immediate 'Create or replace view' gives 00900. 00000 - "invalid SQL statement" error 【发布时间】:2015-08-10 21:48:29 【问题描述】:

我一直被这个错误困扰。您能否提出以下代码中的错误?这写在一个接受变量输入的过程中。谢谢。

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:

【问题讨论】:

【参考方案1】:

您正在尝试执行的操作完全可以使用立即执行。您只是在某处出现语法错误,或者该表确实不存在。

尝试将您正在构建的字符串写入 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;

【讨论】:

我将查询保存到一个变量并打印出来。下面是打印出来的。当我单独运行时,它甚至执行并创建了视图。创建或替换视图 PresentOnAdmission AS select * from ( select NAME, CODETYPE, CODE from HLIDEV_VIEWS.V_CONCEPT WHERE HLIDEV_VIEWS.V_CONCEPT.CONCEPTTYPE = 'POA_CONCEPT_TYPE' ) pivot ( max(code) as code for (codetype) in ('POA_CODE' AS POA_CODE ,'POA_REASON' AS POA_REASON) ); @PMangu 看起来像语法错误。尝试试错方法:首先删除pivot并查看任何错误。然后删除where条件并查看最后尝试删除两者并检查。这样您应该能够缩小(调试)到确切的错误并更正. 参考几个例子:docs.oracle.com/cd/B19306_01/appdev.102/b14261/… 您是否正在从包中立即执行?包所有者是否拥有直接授予他(而不是通过角色)的表的 SELECT 权限? @MatthewMcPeak 我是从存储过程中运行它,而不是从包中运行,如果这是您所要求的。我从分配了管理员角色的用户帐户(我应该说模式)运行它。我不是管理员用户,不在管理员组中。刚刚创建并分配给我一个管理员角色。但是,如果我能够运行并能够分别使用相同的 Create view 语句(而不是从存储过程)创建,那么这会是一个特权问题吗?只是想知道,因为我在这些特权级别问题上非常糟糕。【参考方案2】:

感谢@MatthewMcPeak 和@MahendarMahi 的投入。突然间,我的代码开始正常工作,并以我想要的方式创建了视图。正如@MahendarMahi 所建议的那样,我唯一做的就是删除了pivot 并运行它以查看相同的错误,然后替换了pivot,错误就消失了。我确信代码没有变化,但无论如何它现在很奇怪。再次感谢您的宝贵时间。

【讨论】:

以上是关于立即执行“创建或替换视图”给出 00900。00000 -“无效 SQL 语句”错误的主要内容,如果未能解决你的问题,请参考以下文章

立即执行命令

如何找出 datagrip 中的 ORA-00900 无效 SQL 语句

Oracle.DataAccess.Client.OracleException: ORA-00900: 无效的 SQL 语句

ORA-00900:PHP中无效的SQL语句,但在sqlplus中有效

我用plsql导入oracle数据 imp hen/520 @H file=d:/daochu.dmp ignore=y 出现错误‘ora-00900’

从 Java 调用 Oracle 函数时出现错误 ORA-00900