【问题标题】:oracle db "invalid table name" but works with sqlliteoracle db“无效的表名”但适用于 sqlite
【发布时间】:2012-03-02 06:13:07
【问题描述】:

我有两个数据库,一个在测试环境中,是 sqllite3,另一个是用于 qa/prod 的 oracle db。这不是我的系统,我无法控制此设置。我编写了一个在我的测试环境中工作的 SQL 查询,但对 qa 失败。我假设它与 oracle 和 sqllite3 之间的差异有关,但我不知道发生了什么。感谢您的帮助。

这是错误和 SQL:

OCIError: ORA-00903: 无效的表名:

SELECT 'agency' AS came_from,
account.name as account_name, agency.id as id,
agency.name as name,
agency.contact_name as contact_name, 
agency.contact_email as
contact_email, agency.phone_number as phone_number,
agency.account as account
FROM 'agency' LEFT OUTER JOIN account 
ON account.id ='agency'.account WHERE account in (1601)   
UNION SELECT 'advertiser' AS  came_from, 
account.name as account_name, advertiser.id as id,
advertiser.name as name, advertiser.contact_name as contact_name,
advertiser.contact_email as contact_email, 
advertiser.phone_number as phone_number,
advertiser.account as account 
FROM 'advertiser' 
LEFT OUTER JOIN account ON account.id = 'advertiser'.account 
WHERE account in (1601) AND (advertiser.workflow_state <> 'deleted'
OR advertiser.workflow_state
IS NULL)  ORDER BY name asc

【问题讨论】:

    标签: oracle


    【解决方案1】:

    'agency' 和 'advertiser' 在 Oracle 中不是有效的表名。

    最常见的是,这些表将命名为 AGENCYADVERTISER,然后您可以更改您的 FROM 子句以删除单引号。但是,您可能会使用区分大小写的标识符创建表,并且需要使用双引号来引用表名,即

    SELECT *
      FROM "agency"
    

    更不可能的是,您使用区分大小写的标识符创建表并在表名中包含单引号,在这种情况下,您需要双引号和单引号,但这会非常奇怪

    SQL> create table "'agency'" (col1 number);
    
    Table created.
    
    SQL> select *
      2    from "'agency'";
    
    no rows selected
    

    如果不确定表的名称是什么,可以查询数据字典

    SELECT owner, table_name
      FROM all_tables
     WHERE lower(table_name) like '%agency%';
    

    【讨论】:

      【解决方案2】:

      删除表名周围的引号。

      【讨论】:

        猜你喜欢
        • 2014-12-12
        • 1970-01-01
        • 2011-12-24
        • 1970-01-01
        • 2013-06-03
        • 1970-01-01
        • 2023-03-24
        • 2020-09-05
        • 1970-01-01
        相关资源
        最近更新 更多