【发布时间】:2019-04-16 21:30:57
【问题描述】:
我试图显示一个对象中的所有值,但它给了我“必须声明”错误。
我尝试了下面的代码,但仍然给我同样的错误。
declare
outN mytype;
begin
outN:= get_data();
dbms_output.put_line(outN.toString);
-- tried this as well
dbms_output.put_line(outN.ID);
dbms_output.put_line(outN.G);
dbms_output.put_line(outN.GES);
dbms_output.put_line(outN.CC);
dbms_output.put_line(outN.RR);
end;
而我的对象是:
create or replace TYPE "mytype"
AS OBJECT
(
"ID" NUMBER(10),
"G" NUMBER(10),
"GES" VARCHAR(100 BYTE),
"CC" NUMBER(10),
"RR" VARCHAR(100 BYTE)
);
错误:
错误报告 - ORA-06550:第 5 行,第 38 列: PLS-00302:必须声明组件“ID” ORA-06550:第 5 行,第 7 列: PL/SQL:语句被忽略 ORA-06550:第 6 行,第 38 列: PLS-00302:必须声明组件“G” ORA-06550:第 6 行,第 7 列: PL/SQL:语句被忽略 ORA-06550:第 7 行,第 38 列: PLS-00302:必须声明组件“GES” ORA-06550:第 7 行,第 7 列: PL/SQL:语句被忽略 ORA-06550:第 8 行,第 38 列: PLS-00302:必须声明组件“CC” ORA-06550:第 8 行,第 7 列: PL/SQL:语句被忽略 ORA-06550:第 9 行,第 38 列: PLS-00302:必须声明组件“RR” ORA-06550:第 9 行,第 7 列: PL/SQL:语句被忽略 06550. 00000 - “第 %s 行,第 %s 列:\n%s” *原因:通常是 PL/SQL 编译错误。
另一个:
错误报告 - ORA-06550:第 5 行,第 38 列: PLS-00302:必须声明组件“TOSTRING” ORA-06550:第 5 行,第 7 列: PL/SQL:语句被忽略 06550. 00000 - “第 %s 行,第 %s 列:\n%s” *原因:通常是 PL/SQL 编译错误。 *行动:
get_data 只是一个返回 select 语句结果的函数(返回 db 行)
【问题讨论】:
-
什么是
toString?我在其定义中没有看到mytype类型的属性(或方法)。在任何情况下,第一个错误都会在类型名称处抛出。您将其声明为"mytype"。在 Oracle 中,当您使用双引号时,您是在说您需要区分大小写的标识符。默认情况下,Oracle 不区分大小写;它会自动将您代码块中的mytype转换为MYTYPE,这与"mytype"不匹配。养成不使用双引号标识符的习惯,它们只会带来麻烦。另一种方法是在声明部分使用双引号。 -
get_data()是什么?您的代码中有一个调用它,但您没有向我们展示它是什么。另外:如果您需要帮助,您必须在帖子中包含确切的错误消息。现在,MYTYPE类型没有声明(小写的"mytype"是不同的),但您可能会遇到更多错误 - 告诉我们它们到底是什么。 -
编辑我的问题
-
对不起,我不相信你。如果你定义了
"mytype"类型,但你引用它时没有双引号,你将不会到达“未声明的组件”,你会首先得到错误PLS-00201: identifier 'MYTYPE' must be declared。 -
除非...您是否也(也许在过去)创建了一个类型
MYTYPE?哪些可能仍存在于您的架构(或您有权访问的架构)中?如果你select * from ALL_TYPES where UPPER(type_name) = 'MYTYPE',你会得到什么?