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,非常感谢!你的回答非常详细,这正是我想要理解的。我很高兴我接近正确答案!