0

マスター ストアド プロシージャを実行して、列をターゲット テーブルにロードしています。という名前の列がありますdptname- この列は別のプロジェクト チームによって処理されるため、子ストアド プロシージャが定義されており、empno を取得してDptname. 彼らは、以下のストアド プロシージャを呼び出して私のdptname列を読み込むように要求しました。

deptnameこの子ストアド プロシージャを割り当て/呼び出し、マスター ストアド プロシージャの列に割り当てる方法を教えてください。

これは、子ストアド プロシージャのスケルトンです。

get_dptname(in_emp_no, out_dptname)

私のマスターストアドプロシージャ:

Create or Replace procedure InsertTargetTable
as
begin
for a in (
Select  EMP.empno
EMP.NAME,
CL.Attendance,
DEPTNAME= "**ASSIGN THE VALUE FROM THE 3rd Party stored procedure**
from EMP, CL
on EMP.empno=CL.empno
) Loop
Insert Into Target Table ( empno, NAME,Attendance, DEPTNAME  ) 
Values (a.empno, a.NAME, a.Attendance, a.DEPTNAME);
ENDLOOP;
COMMIT:
END
4

2 に答える 2

0

他のグループが関数GET_DEPT_NAMEを作成した場合、次のように使用できます。

CREATE OR REPLACE PROCEDURE InsertTargetTable
AS
BEGIN

    INSERT INTO Target_Table ( empno, NAME, Attendance, DEPTNAME  ) 
        SELECT EMP.empno, EMP.NAME, CL.Attendance, GET_DEPT_NAME(EMP.empno)
           FROM EMP, CL
           WHERE EMP.empno = CL.empno;

    COMMIT:

END;

いくつかのメモ:

  1. データが正規化されていない: 従業員が部門を変更した場合はどうなるでしょうか? Target_Table は更新されませんが、挿入中に設定された部門に固定されたままになります。おそらく、現在の部門の値を取得するために、テーブルを実際に照会するときに部門を検索する必要があります。

  2. ストアド プロシージャが関数であることを願っています。その場合、上記の例に示すように簡単に使用できます。(そうでない場合は、関数を要求します)。

  3. 可能であれば、ループを避けてください。単一の「insert into ... select from」ステートメントは、はるかに効率的です。

于 2013-09-03T01:35:13.603 に答える