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:在预期以下情况之一时遇到符号“=”:常量异常表 long double ref char 时间时间戳间隔日期二进制国家字符 nchar 符号“”被替换为“=”继续。


错误(22,5):PLS-00103:在预期以下情况之一时遇到符号“UPDATE”:开始函数杂注过程子类型类型当前游标删除之前存在符号“开始”替换“更新”以继续。


错误(31,6):PLS-00103:遇到符号“;” 当期待以下之一时:循环

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 回答