这是我定义的类型:
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行
- 00000 - "参考未初始化的复合材料"
醇>
* Cause
:对象,LOB或其他复合引用为a
左侧没有初始化。
* Action
:使用适当的构造函数初始化复合
或整个对象分配。
答案 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;
身体的其余部分将与您的代码保持一致。
还有一件事......你需要在完成提取后关闭光标。它不存在,请修复它。