1

基本的に私の更新では、SQLクエリの列名は次のように動的になります

update bi_employee set <this_is_dynamic_column> where emp_id = 12

以下は、これまでに作成したストアド プロシージャです。

CREATE OR replace PROCEDURE Sp_run_employee_updates
IS
  CURSOR c_emp IS
    SELECT *
    FROM   BI_EMPLOYEE_UPDATE
    WHERE  EFFECTIVE_DATE = To_date('30-Apr-2012', 'dd-mm-yy');
BEGIN
    FOR employee_update IN c_emp LOOP
        declare update_sql varchar2(225);
        update_sql := 'UPDATE BI_EMPLOYEE   SET     '
                      || employee_update.column_name
                      || '= employee_update.new_value  WHERE     emp_id = '
                      || employee_update.employee_id;
    END LOOP;
END; 

それは私に次のエラーを与えます

エラー (17,13): PLS-00103: 次のいずれかが予期されているときに、記号 "=" が検出されました:継続する。


エラー(22,5): PLS-00103: 次のいずれかを予期しているときに、記号「UPDATE」が検出されました: begin function pragma procedure subtype type current cursor delete exists before 続行するには、記号「begin」が「UPDATE」に置き換えられました。


エラー(31,6): PLS-00103: 記号「;」が見つかりました 次のいずれかが期待される場合: loop

4

1 に答える 1

3

a- これは次のようになります。

to_date('30-Apr-2012','dd-mon-yyyy');

b- 次のように実行できます。

CREATE OR REPLACE
PROCEDURE SP_RUN_EMPLOYEE_UPDATES IS  

  update_sql varchar2(225);

  CURSOR c_emp IS
   SELECT * 
   FROM BI_EMPLOYEE_UPDATE 
   WHERE EFFECTIVE_DATE = to_date('30-Apr-2012','dd-mon-yyyy');

BEGIN

 FOR employee_update in c_emp LOOP

     update_sql :=  'UPDATE BI_EMPLOYEE SET ' || employee_update.column_name || 
                    '= :1 WHERE emp_id = :2' ;

  execute immediate update_sql using employee_update.new_value, employee_update.employee_id;

 END LOOP;

END SP_RUN_EMPLOYEE_UPDATES;
于 2012-04-25T05:39:28.963 に答える