因此,假设我有一个像这样的表:
CREATE TABLE MEETINGS(
MEETING_DAY DATE,
MEETING_ROOM NVARCHAR2(10),
MEETING_DURATION NUMBER(2)
);
像这样的过程,它接收日期和会议室,并返回记录,该记录包含在给定日期将在会议室发生的会议持续时间:
CREATE OR REPLACE PROCEDURE meetings_for_today(
v_room IN NVARCHAR2, v_day IN DATE, result_meetings OUT SYS_REFCURSOR)
IS BEGIN
OPEN result_meetings FOR
SELECT MEETING_DAY, MEETING_DURATION
FROM MEETINGS
WHERE MEETING_DAY = v_day AND MEETING_ROOM = v_room;
END;
/
但是我想检查一下该程序是否确实有效,我在这个主题上进行了很多搜索,但是发现很难找到解决方案。
所以我试着做:
DECLARE
meeting_res MEETINGS%ROWTYPE;
v_refcur sys_refcursor;
BEGIN
meetings_for_today('1A', to_date('12/12/2016', 'dd/mm/yyyy'), v_refcur);
LOOP
fetch v_refcur into meeting_res;
exit when v_refcur%notfound;
dbms_output.put_line(meeting_res.MEETING_DAY || ' ' || meeting_res.MEETING_DAY);
end loop;
End;
/
这给了我以下错误:
第1行出现错误:ORA-06504:PL / SQL:结果集变量或查询的返回类型与ORA-06512不匹配:在第8行
我究竟做错了什么?
PS:请不要给我一个有效的代码;向我解释我的推理出了什么问题以及如何更好地利用Oracle的资源:)
PS:请不要给我一个有效的代码,请向我解释我的推理出了什么问题以及如何更好地使用oracle的资源:)
此变量:
meeting_res MEETINGS%ROWTYPE;
类型:MEETINGS%ROWTYPE;
表示这是由MEETINGS表的所有3列组成的行(记录):
CREATE TABLE MEETINGS(
MEETING_DAY DATE,
MEETING_ROOM NVARCHAR2(10),
MEETING_DURATION NUMBER(2)
);
但是游标只返回2列,请看这里的SELECT子句,那里只有2列:MEETING_DAY + MEETING_DURATION
OPEN result_meetings FOR
SELECT MEETING_DAY, MEETING_DURATION
FROM MEETINGS .....
因此,您试图从包含2列的游标中获取一条记录,并将其放入包含3列的变量中。
它们肯定不匹配(3个列对2个列),并且您会收到ORA-06504错误。
您可以声明由2列组成的自己的记录类型
type my_type is record(
MEETING_DAY date , MEETING_DURATION number(2)
);
并以这种方式在您的代码中使用它:
DECLARE
type my_type is record(
MEETING_DAY date , MEETING_DURATION number(2)
);
meeting_res my_type;
v_refcur sys_refcursor;
BEGIN
meetings_for_today('1A', to_date('12/12/2016', 'dd/mm/yyyy'), v_refcur);
LOOP
fetch v_refcur into meeting_res;
exit when v_refcur%notfound;
dbms_output.put_line(meeting_res.MEETING_DAY || ' ' || meeting_res.MEETING_DAY);
end loop;
End;
/
注意-列数和对应列的类型必须匹配,或者至少其dattype必须是“ compatibile”-如果Oracle能够将一个值转换为另一个值(例如,可以将NUMBER强制转换为VARCHAR2),则它们是兼容的),否则,如果Oracle无法将某些值转换为另一种数据类型,则会得到ORA-06504(例如NUMBER到DATE)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句