首页 文章

如何在Oracle存储过程中编写动态sql?

提问于
浏览
0

基本上在我的更新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 time timestamp interval date二进制国家字符nchar符号“”代替“=”接着说 .


错误(22,5):PLS-00103:当期望以下之一时遇到符号“UPDATE”:begin function pragma procedure子类型类型当前游标删除存在先前符号“begin”被替换为“UPDATE”以继续 .


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

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;
    

相关问题