PL SQL使用用户定义的类型

时间:2016-09-12 03:51:09

标签: sql plsql oracle11g

这是我定义的类型:

CREATE OR REPLACE TYPE new_type AS OBJECT(pname VARCHAR2(10), quan NUMBER(4));

这是我想要使用的功能:

CREATE OR REPLACE FUNCTION get_max(mon IN  VARCHAR2)

RETURN new_type

AS

    type_var new_type;

    CURSOR c1 IS SELECT pr.pname,o.quan FROM product pr, orders o WHERE pr.pid=o.pid AND o.quan=(SELECT MAX(quan) FROM orders WHERE TO_CHAR(o_date,'MM')=mon) AND TO_CHAR(o_date,'MM')=mon;

BEGIN

    OPEN c1;

    FETCH c1 INTO type_var.pname,type_var.quan;

    RETURN type_var;

END get_max;

执行区:

DECLARE
    type_var new_type;
BEGIN
    type_var:=get_max('03');
    DBMS_OUTPUT.PUT_LINE(type_var.pname||' '||type_var.quan); 
END;

我正在尝试获取特定月份的产品名称及其订单数量,该月份具有该给定月份的最大订单数量 This is the order table i have

结果应该是

facewash    10

为3月

在运行执行块时,我得到的错误是:

错误报告 -

  

ORA-06530:参考未初始化的复合材料

     

ORA-06512:at" SYSTEM.GET_MAX",第8行

     

ORA-06512:第4行

     
      
  1. 00000 - "参考未初始化的复合材料"
  2.   

* Cause:对象,LOB或其他复合引用为a            左侧没有初始化。

* Action:使用适当的构造函数初始化复合            或整个对象分配。

2 个答案:

答案 0 :(得分:4)

问题是您从未运行constructor,因此出现(正确的)错误消息:

 * Cause: An object, LOB, or other composite was referenced as a left hand
   side without having been initialized.
 * Action: Initialize the composite with an appropriate constructor or
   whole-object assignment.

更改光标以运行构造new_type()

CURSOR c1 IS SELECT new_type(pr.pname, o.quan) FROM ...

然后在fetch中简单地分配给变量:

FETCH c1 INTO type_var;

像往常一样,所有这些以及更多内容都可以documentation免费获得。

答案 1 :(得分:0)

在块中使用记录类型变量时,在为变量赋值之前,需要INITIALIZE变量。正如你在这里没有这样做的那样,它正确地将错误作为对UNINITIALIZED复合的引用。

要在BEGIN中初始化它,您需要在获取值之前执行以下操作 -

BEGIN

  type_var := new_type('',0);

  OPEN c1;
  FETCH c1 
  INTO type_var.pname,type_var.quan;
  RETURN type_var;
  CLOSE c1;

END;

身体的其余部分将与您的代码保持一致。

还有一件事......你需要在完成提取后关闭光标。它不存在,请修复它。