0

このようなカーソルを宣言したとしましょう

CURSOR cur_customer IS
    SELECT c.customer_id, c.name, o.order_date
    FROM customer c, order o
    WHERE c.customer_id = o.customer_id

BEGIN
    FOR rec_customer IN cur_Customer LOOP
        -- invoke procedure here with rec_customer as a parameter
    END LOOP;
END;

カーソルが 1 つのテーブルのみからフェッチされる場合、パラメーターは次のように宣言できます。

rec_customer customer%ROWTYPE

ただし、この場合、カーソルは 2 つのテーブルからフェッチされます。では、この場合のパラメーターを宣言するにはどうすればよいでしょうか。可能ですか?

助言がありますか ?ありがとう

4

1 に答える 1

2

これがすべて PL/SQL プログラム内で行われる場合、何も宣言する必要はありません。暗黙カーソルを使用して、PL/SQL にそれを理解させます。

declare
    tot_sal number(23,2) := 0;
begin
     for r in ( select dept.dept_no
                       , emp.sal
                from dept 
                     join emp (on emp.deptno = dept,deptno) )
     loop
         tot_sql := tot_sql + r.sql;
     end loop;
end;

これを CURSOR FOR ループの有効な使用法として推奨しているわけではありません。これは、物事を機能させるために必要なインフラストラクチャがいかに少ないかを示しているだけです。

さらに構造が必要な場合は、次のように %ROWTYPE キーワードを使用してカーソルを参照できます。

CURSOR cur_customer IS
    SELECT c.customer_id, c.name, o.order_date
    FROM customer c, order o
    WHERE c.customer_id = o.customer_id;

rec_customer cur_customer%ROWTYPE;

つまり、テーブルを使用するのと同じように、カーソルを使用してレコード変数を定義できます。

プログラム単位、特にパッケージ間で共有できる構造を定義する場合は、RECORD 型を宣言します。このようなもの:

TYPE emp_rec IS RE(ORD 
     (emp_dept_name dept.dname%type
      , emp_name emp.ename%type
      , emp_sal emp.sql%type );

これを使用して、%ROWTYPE を使用する場所であればどこでも、プログラム ユニットのパラメーターなど、さまざまなものを定義できます。そのような宣言をパッケージ仕様に入れ、複数のパッケージで共有します。

FUNCTION get_emp (p_id emp.empno%type) return emp_rec%rowtype;

詳細をご覧ください

于 2013-04-22T06:16:05.057 に答える