Oracle 如何输出作为过程结果的记录?
假设我有一张这样的桌子:Oracle 如何输出作为过程结果的记录?,oracle,stored-procedures,plsql,Oracle,Stored Procedures,Plsql,假设我有一张这样的桌子: 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
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代码>
这意味着,这是一行(记录),由会议表的所有3列组成:
CREATE TABLE MEETINGS(
MEETING_DAY DATE,
MEETING_ROOM NVARCHAR2(10),
MEETING_DURATION NUMBER(2)
);
但是光标只返回两列,看看这里的SELECT子句,那里只有两列:MEETING_DAY+MEETING_DURATION
OPEN result_meetings FOR
SELECT MEETING_DAY, MEETING_DURATION
FROM MEETINGS .....
因此,您正试图从此游标中获取一条包含2列的记录,并将其放入一个包含3列的变量中
它们当然不匹配(3匹对2匹),你会得到ORA-06504错误
您可以声明自己的记录类型,该记录类型由两列组成
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必须是“兼容的”-如果Oracle能够将一个值转换为另一个值(例如数字可以转换为VARCHAR2),则它们是兼容的,否则如果Oracle无法将某个值转换为另一个数据类型,您将获得ORA-06504(例如迄今为止的编号)。Omg,非常感谢!你的回答非常详细,这正是我想要理解的。我很高兴我接近正确答案!