【问题标题】:Display all object values in PLSQL显示 PLSQL 中的所有对象值
【发布时间】: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',你会得到什么?

标签: oracle plsql


【解决方案1】:

不确定您的代码中的 get_data()toString 是什么。但是,这应该可以解释如何显示对象值。

create or replace TYPE  mytype -- removed double quotes
    AS OBJECT
    (
        "ID"   NUMBER(10),
        "G"    NUMBER(10),
        "GES"  VARCHAR2(100 BYTE), --Use VARCHAR2 instead of VARCHAR
        "CC"   NUMBER(10),
        "RR"   VARCHAR2(100 BYTE)
    );
    /
SET SERVEROUTPUT ON    
DECLARE
     outn   mytype := mytype(1,10,'GES1',20,'RR1'); --declaration and assignment
BEGIN
     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;
/

结果

Type MYTYPE compiled

1
10
GES1
20
RR1


PL/SQL procedure successfully completed.

【讨论】:

  • 谢谢@Kaushik,我不知道你为什么要删除双引号?我的代码使用双引号可以正常工作,但是可以正常返回数据而没有错误,但问题是显示对象的数据。
  • 当我运行您的代码时,我得到:错误报告 - ORA-06550:第 6 行,第 38 列:PLS-00302:必须声明组件“ID” ORA-06550:第 6 行,第 7 列: PL/SQL:语句被忽略 ORA-06550:第 7 行,第 38 列:PLS-00302:必须声明组件“G” ORA-06550:第 7 行,第 7 列:PL/SQL:语句被忽略 ORA-06550:第 8 行,第 38 列:PLS-00302:必须声明组件“GES”
  • ORA-06550:第 8 行,第 7 列:PL/SQL:忽略语句 ORA-06550:第 9 行,第 38 列:PLS-00302:必须声明组件“CC” ORA-06550:行9,第 7 列:PL/SQL:语句被忽略 ORA-06550:第 10 行,第 38 列:PLS-00302:组件“RR”必须声明 ORA-06550:第 10 行,第 7 列:PL/SQL:语句被忽略 06550。 00000 - “第 %s 行,第 %s 列:\n%s” *原因:通常是 PL/SQL 编译错误。 *行动:
  • @SMH :您的错误消息表明对象未正确声明。如您所见,它对我很有效。要么你的 get_data() 函数有问题,要么你没有向我们展示一切。
猜你喜欢
  • 2022-10-12
  • 2013-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多