2017-04-05 16 views
0

2つのフィールドを持つコレクションを作成し、パラメータとしてそのコレクションのタイプの変数を持つプロシージャを作成する必要があります。たとえば、列の場合いくつかの列を持つコレクションを定義する

TYPE an_array IS VARRAY(10) OF varchar2(20); 

::私が唯一持っている場合 は、どのように私は2つのフィールドを持つコレクションを作成することができ、ID、名前、 (挿入方法は分かりません)。

その後、私は、プロシージャを作成する必要が

CREATE OR REPLACE PROCEDURE test_proc (p_array an_array) AS 

しかし、私は、この手順で何かをする私の列を使用する必要があります。 例として、テーブルemployee(id number、name varchar2(20))を考えます。あなたがレコードのコレクションを使用することができます

 CREATE OR REPLACE PROCEDURE test_proc (p_array an_array) AS 
    CURSOR cs IS select * from employees; 
    v_row employees%ROWTYPE; 
    BEGIN 
    OPEN cs; 
    LOOP 
    FETCH cs into v_row ; 
    EXIT WHEN cs%NOTFOUND; 
    IF (mod (v_row.id,2) = 0) then 
     THE ID FIELD FROM MY COLLETION := v_row.id; 
     THE NAME FIELD FROM MY COLLECTION := v_row.name; 
END LOOP; 
CLOSE cs; 
    END; 

`

答えて

2

: 私の手順は、次のようになります。この

declare 
    type TRec is record(
     col_1 varchar2(20), 
     col_2 number); 

    type TList is table of TRec; 

    t_l TList := TList(); 

    r_l TRec; 

    procedure foo(a_par TList, ai_elem int) is 
    begin 
     if a_par.Exists(ai_elem) then 
     dbms_output.put_line('Value at pos ' || ai_elem || ' is :' || a_par(ai_elem) 
           .col_2); 
     else 
     dbms_output.put_line('There is no element in position :' || ai_elem); 
     end if; 

    end; 

begin 
    r_l.col_1 := 'abc'; 
    r_l.col_2 := 10; 

    t_l.Extend; 
    t_l(t_l.Count) := r_l; 

    foo(t_l, 1); 

    foo(t_l, 3); 

end; 
+0

さてさて、その後私は、プロシージャを宣言するだろうかのような

何か?私はレコードを匿名ブロックで宣言しなければならないので、そのコレクションを外部から取得する方法は? – lexraid

+0

匿名ブロックで必要とするタイプを「宣言する」必要がある理由を明確に理解できません。可視性の範囲はどうですか?型を匿名ブロックで宣言すると、そのブロックにもプロシージャーが宣言されています。 – Seyran

+0

ええ、そうです、私は同じブロックでそれらを宣言しなければなりません、ありがとう。 – lexraid

関連する問題