【问题标题】:Getting this error PLS-00311 the declaration is incomplete or malformed收到此错误 PLS-00311 声明不完整或格式错误
【发布时间】:2021-04-26 07:09:20
【问题描述】:

编译时出错

CREATE OR REPLACE TYPE Test AS OBJECT (
  demo demo_tbl,
  demo2 demo2_tbl   
)

当我使用创建 demo2_tbl 时

CREATE OR REPLACE TYPE "demo2_tbl"

【问题讨论】:

  • demo2_tbl 的声明似乎不完整。还有更多吗?
  • 就是这样。我是plsql的新手。你能帮我怎么完成它
  • 取决于你想要的。我猜不出来。您可以将其设为as objectas record,具有一些属性,类似于您的类型测试。或者它可能是table of integer 或其他时间。可能性是无穷无尽的,我不知道你想做什么。
  • 而不仅仅是demo2_tbl。您也需要demo_tbl 才有效。

标签: sql database oracle plsql types


【解决方案1】:

[TL;DR] 除非您有充分的理由,否则不要使用带引号的标识符;即使这样,您也可能不想使用带引号的标识符。


当我使用创建 demo2_tbl 时

CREATE OR REPLACE TYPE "demo2_tbl"

我假设您对该类型的声明继续,它类似于:

CREATE OR REPLACE TYPE "demo2_tbl" AS TABLE OF INT;

CREATE OR REPLACE TYPE "demo2_tbl" AS OBJECT( ... <rest of declaration here>

如果你没有,那是完整的声明,那么你还没有完全声明类型;您只做了一个类型的前向声明,以便它可以用作REF(如指针)目标。

如果您没有完全声明类型,那么这就是您的问题所在。

如果您确实完全声明了类型,那么问题是您在创建 "demo2_tbl" 时使用了带引号的标识符;所以现在你在引用它时需要在其他任何地方使用带引号的标识符。

例如:

CREATE TYPE demo_tbl AS TABLE OF INT;
CREATE OR REPLACE TYPE "demo2_tbl" AS TABLE OF INT;

如果你这样做:

CREATE OR REPLACE TYPE Test AS OBJECT (
  demo demo_tbl,
  demo2 demo2_tbl   
)

然后你得到错误:

PLS-00201: identifier 'DEMO2_TBL' must be declared

但是,如果你使用引号:

CREATE OR REPLACE TYPE Test AS OBJECT (
  demo  demo_tbl,
  demo2 "demo2_tbl"
)

有效。

db小提琴here


现在,解决方案可能是在任何地方使用带引号的标识符...但是,更好 解决方案是解决问题的根源并删除错误命名的类型及其依赖项(现在,在开始使用它们之前)并使用不区分大小写的名称重新创建它们:

DROP TYPE test;
DROP TYPE "demo2_tbl";
CREATE TYPE demo2_tbl AS ... etc. ...
CREATE TYPE Test AS OBJECT ... etc. ...

然后你就不需要记住总是引用它。

【讨论】:

    猜你喜欢
    • 2014-01-09
    • 2021-03-29
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多