【问题标题】:Unexpected "invalid character" error in Oracle 10gOracle 10g 中出现意外的“无效字符”错误
【发布时间】:2012-03-13 22:40:19
【问题描述】:

以下查询:

SELECT * FROM VIEW_NAME_HERE

导致ORA-00911: invalid character 错误。我尝试使用 SQL Developer、Oracle SQL Developer、Toad 和 java 应用程序来执行它。

VIEW_NAME_HERE 是一个视图。用于创建视图的 SQL 查询如下:

SELECT DISTINCT table1_alias.id2 AS col1 ,
                table1_alias.col2,
                table1_alias.col3
FROM table1
INNER JOIN table1 table1_alias
   ON table1.id1 =table1_alias.id2
WHERE  table1_alias.id2<>-55   AND table1_alias.LVL=1
UNION
SELECT col1 ,col2,col3
FROM table2 WHERE col1> 0 AND col4 = 1
AND LVL = 2

SELECT * 从其他视图和表中正常工作。

欢迎任何提示。

【问题讨论】:

  • 你能发布视图定义吗?
  • 实际视图名称是什么? create view 命令中的名称是否用双引号括起来?
  • 查询对我来说看起来不错...我建议重新创建视图并确保没有编译错误。 Oracle 发出警告,但即使出现一些错误也会创建视图
  • 是的,但是 Oracle 不会抛出 ORA-00911;它抛出ORA-04063: view [schema].[viewname] has errors
  • 你没有给 `table` 加上别名,但使用别名是不是打错字了?

标签: sql oracle10g ora-00911


【解决方案1】:

我无法在 Oracle 10g 上重现您的测试用例:

SQL> create table table1 (id2 number, col2 number, col3 number, id1 number, lvl number);

Table created.

SQL> create table table2 (col1 number, col2 number, col3 number, col4 number, lvl number);

Table created.

SQL> create view view_name_here as
  2  SELECT DISTINCT table1_alias.id2 AS col1 ,
  3                  table1_alias.col2,
  4                  table1_alias.col3
  5  FROM table1
  6  INNER JOIN table1 table1_alias
  7     ON table1.id1 =table1_alias.id2
  8  WHERE  table1_alias.id2<>-55   AND table1_alias.LVL=1
  9  UNION
 10  SELECT col1 ,col2,col3
 11  FROM table2 WHERE col1> 0 AND col4 = 1
 12  AND LVL = 2;

View created.

SQL> select * from view_name_here;

no rows selected

【讨论】:

    【解决方案2】:

    我怀疑您的视图名称包含无效字符,但是当它被创建时,该名称被用双引号括起来(根据文档是“引用标识符”),因此它是允许的;并且在查询时省略了双引号。比如:

    create view "MY~VIEW" as select * from dual;
    
    View created.
    
    select * from MY~VIEW;
                    *
    Error at line 1:
    ORA-00911: invalid character
    

    但这有效:

    select * from "MY~VIEW";
    
    D
    -
    X
    

    当然,实际字符可能是其他字符,但错误(至少在 SQL*Plus 中)有助于用* 突出显示它。 SQL 引用有一个section on naming objects;我猜你违反了规则 7。

    将对象名称括在双引号中并不是一种好的做法(尽管我确信意见会有所不同),通常是因为它会导致大小写差异的问题,但可能会产生类似这样的其他微妙影响。去掉引号要容易得多,让 Oracle 使用大写名称创建所有对象,并在创建对象时发现任何问题。

    【讨论】:

    • 实际视图名称为VIEW_PIP_EXEC_MINISTRY
    • 好的,那似乎不相关。你正在做的正是select * from VIEW_PIP_EXEC_MINISTRY?并且没有任何列名(尤其是别名)有任何奇怪的字符或 qoutes?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    • 1970-01-01
    • 2017-09-22
    • 2021-02-06
    • 2010-11-21
    相关资源
    最近更新 更多