2017-04-13 5 views
0

最初のOracleプロシージャを作成しようとしています。 selectは複数のレコードを返します。変数に各レコードを配置して、そのプロシージャの後のアクションでレコードを使用できるようにする必要があります。助けてください?Oracleプロシージャ、変数に複数のレコードを配置

key number; 
    keyCount number; 
    rub varchar2(50); 
    srub varchar2(100); 
    type varchar2(200); 
    date varchar2(14); 
    note varchar2(500); 
    BEGIN 
     SELECT KEY,COUNT(KEY),RUB, 
     SRUB,TYPE ,DATE,NOTE FROM Student 
     WHERE S_KEY = {key}; 

    END; 
+0

テーブルから変数にデータを格納するために使用できる 'INTO' [link](https://docs.oracle.com/cd/B13789_01/appdev.101/b10807/13_elems045.htm)の使用に関するOracleのマニュアル –

答えて

2

PL/SQLでは、一致する変数に結果を選択する必要があります。 1つの方法は、各列の別々の変数です(図のように)。代わりに、クエリのプロジェクトに一致する行変数を使用します。 find out more

集計関数 - COUNT()があるので、非集計列を定義するGROUP BY節が必要です。複数のレコードがあるので、スカラー変数ではなくコレクションに値を設定する必要があります。 Find out more

あなたの手順は良い習慣に入るこの

create or replace procedure my_first_proc 
     (p_key in student.s_key%type) 
    as 
    type my_rec is record (
     key number , 
     keyCount number , 
     rub varchar2(50); , 
     srub varchar2(100) , 
     type varchar2(200) , 
     date varchar2(14), 
     note varchar2(500) 
     ); 
     type my_rec_coll is table of my_rec; 
     l_student_recs my_rec_coll; 
    BEGIN 
     SELECT KEY,COUNT(KEY),RUB,SRUB,TYPE ,DATE,NOTE 
     bulk collect into l_student_recs 
     FROM Student 
     WHERE S_KEY = p_key 
     group by KEY,RUB,SRUB,TYPE ,DATE,NOTE 
     ; 
     for idx in l_student_recs.first() .. l_student_recs.last() 
     loop 
      -- do some processing here 
      dbms_output.put_line('RUB = '||l_student_recs(idx).rub); 
     end loop; 
    EXCEPTION 
     when no_data_found then 
      raise_application_error(-01403, 'no student records for key='||p_key); 
    END; 

のようになります:

    • 使用賢明な変数名のローカル変数からパラメータ名を区別
    • ハンドル予測可能な例外
  • 関連する問題