sql - 收到此错误 PLS-00311 声明不完整或格式错误
问题描述
编译时出现错误
CREATE OR REPLACE TYPE Test AS OBJECT (
demo demo_tbl,
demo2 demo2_tbl
)
虽然我使用创建 demo2_tbl
CREATE OR REPLACE TYPE "demo2_tbl"
解决方案
[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. ...
然后你不需要记住总是引用它。
推荐阅读
- pandas - Pandas 按排名的条件累积总和
- python - 如何在不使用模块的情况下在确定单词后拆分字符串列表
- python - 如何使用 bitbucket api 获取 repo 的所有拉取请求列表?
- netsuite - SuiteScript 2.0:如何编写高效的代码?
- android - 密封类在 Android 环境中的性能影响是什么?
- variables - 如何使用动态变量查询 ansible 字典
- java - 使用netty发送多个RTSP消息
- php - 如何在 AJAX 循环函数中调用 PHP Strtotime?
- swift - 单击单元格时 UILabel 内容无效
- filter - 如何在授权过滤器中使用redis缓存?