2016-12-18 7 views
2

それでは、私はこのようなテーブルがあるとしましょう:プロシージャの結果であるレコードを出力する方法は?

CREATE TABLE MEETINGS(
    MEETING_DAY DATE, 
    MEETING_ROOM NVARCHAR2(10), 
    MEETING_DURATION NUMBER(2) 
); 

日付と会議室を受け取り、それが'LL会議の期間を持つレコードを返します。このような手順で、特定の日に部屋に起こる:

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; 
/

しかし、私は手順が実際に働いている場合、私はこのトピックに関する多くのことを検索しましたチェックしたいのですが、私は見つけることは本当に難しい見つけますよ溶液。

だから私はやって試してみた:

ERROR at line 1: ORA-06504: PL/SQL: Return types of Result Set variables or query do not match ORA-06512: at line 8

私が間違っているのは何:私は次のエラーを与える

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; 
/

PS:私には動作するコードを教えてください。私の推論に何が間違って私に説明し、どのように私はより良い、Oracleのリソースを使用する必要があります:)

答えて

2

PS: Please don't give me a code that works, explain me what's wrong on my reasoning and how should I better use oracle's resources :)

この変数:

meeting_res MEETINGS%ROWTYPE; 

のタイプがある:MEETINGS%ROWTYPE;
これは行であることを意味し、

CREATE TABLE MEETINGS(
    MEETING_DAY DATE, 
    MEETING_ROOM NVARCHAR2(10), 
    MEETING_DURATION NUMBER(2) 
); 

しかし:すべて3列ミーティングテーブルのから成り(レコード)カーソルのみ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; 
/

NOTE - 列の数をOracleが1つの値を別の値に変換できる場合は、互換性があります(たとえば、NUMBERは可能です)。対応する列の型も一致する必要があります。 VARCHAR2にキャストする必要があります。そうでなければ、Oracleがある値を別のデータ型に変換できない場合は、ORA-06504を取得します(たとえば、NUMBERをDATEに設定します)。

+0

おはよう、どうもありがとうございました!あなたの答えは非常によく精緻化されており、私が理解しようとしていたものです。私は正しい答えに近づいてうれしいです! – Safirah

関連する問題