我的一个 Oracle Apex 查询出现“无效标识符错误”

Posted

技术标签:

【中文标题】我的一个 Oracle Apex 查询出现“无效标识符错误”【英文标题】:I'm getting "Invalid Identifier Error" for one of my Oracle Apex Queries 【发布时间】:2020-10-10 22:31:01 【问题描述】:

我正在尝试在 Oracle Apex 上运行一个脚本,到目前为止,除了最后一个之外,所有表和查询都可以正常工作。它返回错误“ORA-00904: : invalid identifier ORA-06512: at "SYS.WWV_DBMS_SQL_APEX_200200", line 626 ORA-06512: at "SYS.DBMS_SYS_SQL", line 1658 ORA-06512: at "SYS.WWV_DBMS_SQL_APEX_200200", line 612 ORA-06512:在“APEX_200200.WWV_FLOW_DYNAMIC_EXEC”,第 1749 行。我应该怎么做才能修复这个错误?

CREATE TABLE customer(
     VIN            VARCHAR2(17)
                    CONSTRAINT vehicles__VIN__fk
                      REFERENCES vehicles (VIN) ON DELETE SET NULL,
     sale_date      DATE
                    CONSTRAINT sales__sale_date__fk 
                      REFERENCES sales (sale_date) ON DELETE SET NULL,
     c_name         VARCHAR2(50)
                    CONSTRAINT sales__c_name__nn NOT NULL,
     address        VARCHAR2(50)
                    CONSTRAINT sales__address__nn NOT NULL,
     phone          VARCHAR2(11)
                    CONSTRAINT sales__phone__nn NOT NULL,
     gender         VARCHAR2(6)
                    CONSTRAINT sales__gender__nn NOT NULL,
     a_income       VARCHAR2(30)
                    CONSTRAINT sales__a_income__nn NOT NULL,
    );

我不知道它是否有帮助,但 VIN 和 sale_date 引用了这两个工作查询:

CREATE TABLE vehicles(
  VIN   VARCHAR2(17)
        CONSTRAINT vehicles__VIN__pk PRIMARY KEY,
  brand VARCHAR2(20)
        CONSTRAINT vehicles__brand__nn NOT NULL,
  model VARCHAR2(20)
        CONSTRAINT vehicles__model__nn NOT NULL,
  color VARCHAR2(10)
        CONSTRAINT vehicles__color__nn NOT NULL
);

CREATE TABLE sales(
     sale_date      DATE, 
     price          VARCHAR2(30)
                    CONSTRAINT sales__price__nn NOT NULL,
     VIN            VARCHAR2(17)
                    CONSTRAINT vehicles__VIN__fk
                        REFERENCES vehicles (VIN) ON DELETE SET NULL,
     d_id           VARCHAR2(10)
                     CONSTRAINT dealer__d_id__fk 
                      REFERENCES dealer (d_id) ON DELETE SET NULL,
    CONSTRAINT sales__sale_date__pk PRIMARY KEY (sale_date)
    );

【问题讨论】:

当您不向我们显示查询时,您希望我们告诉您查询出了什么问题? 可以调试你看不到的东西吗?至于您的设计-为什么只需要 1 (m/f) 的 GENDER 6 字符。当 a_income 应该是一个数字时,为什么它是一个 varchar?命名 Not Null 约束确实没有任何好处。这样做非常少见。 【参考方案1】:

删除最后一个逗号。

另外,如果您的约束具有命名约定<tablename>__<columnname>__<constrainttype>,那么不要只是从另一个表复制/粘贴并更新列名;你还需要更新表名,否则你会发现你有重复的约束名,这会引发异常。

CREATE TABLE customer(
     VIN            VARCHAR2(17)
                    CONSTRAINT customer__VIN__fk
                      REFERENCES vehicles (VIN) ON DELETE SET NULL,
     sale_date      DATE
                    CONSTRAINT customer__sale_date__fk 
                      REFERENCES sales (sale_date) ON DELETE SET NULL,
     c_name         VARCHAR2(50)
                    CONSTRAINT customer__c_name__nn NOT NULL,
     address        VARCHAR2(500)
                    CONSTRAINT customer__address__nn NOT NULL,
     phone          VARCHAR2(11)
                    CONSTRAINT customer__phone__nn NOT NULL,
     gender         CHAR(1)
                    CONSTRAINT customer__gender__nn NOT NULL
                    CONSTRAINT customer__gender__chk
                      CHECK ( gender IN ( 'M', 'F' /*, 'A', 'B', 'C'*/ ) ),
     a_income       NUMBER(12,2)
                    CONSTRAINT customer__a_income__nn NOT NULL
);

接下来是其他问题:

为什么客户有VIN(车辆识别号)?客户不限于拥有一辆汽车。 为什么客户有sale_date?如果您指的是汽车销售,那么为什么客户仅限于一次销售?您可能希望通过将数据移动到名为customer_cars(或类似名称)的单独表来修复这两个问题,以便每个客户可以拥有多辆汽车,并且每辆汽车可以由多个客户拥有(在不同时间)。李> 您是否希望所有客户的地址都包含 50 个字符? 为什么genderVARCHAR(6) 而不是CHAR(1),其值为M/F(酌情使用额外的字符代码进行扩展)? 为什么a_income 是字符串而不是NUMBER

【讨论】:

肯定varchar2(1) 是比char(1) 更好的数据类型选择吗? (Pet peeve alert.) 无论如何,也许 OP 想要包括非二元性别。 @WilliamRobertson 存在语义差异。 CHAR 是你想要一个固定长度的字符串; VARCHAR2 是你想要一个可变长度的字符串。在这种情况下,数据是一个固定长度的字符串,因此在语义上CHAR 是合适的。但是,如果您习惯于人们不使用 CHAR 并想要一个简单的规则说“对所有事情都使用 VARCHAR2”,那很好。

以上是关于我的一个 Oracle Apex 查询出现“无效标识符错误”的主要内容,如果未能解决你的问题,请参考以下文章

不能在 sql 查询 APEX ORACLE 中使用绑定变量作为表名

Oracle APEX - 将隐藏的 SQL 查询下载到 CSV

如何在 oracle apex 18 中编辑交互式网格(带有复杂的 sql 查询)?

Oracle APEX 文本页面项作为 SQL 查询中的不可编辑超链接字段

如何将 SQL 查询中一个字段的值用于 Oracle Apex 上另一个字段的值列表?

如何防止sql注入oracle apex