首页 > 解决方案 > 收到此错误 PLS-00311 声明不完整或格式错误

问题描述

编译时出现错误

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

虽然我使用创建 demo2_tbl

CREATE OR REPLACE TYPE "demo2_tbl"

标签: sqldatabaseoracleplsqltypes

解决方案


[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<>在这里摆弄


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

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

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


推荐阅读