2012-04-25 4 views
0

В основном в моих именах столбцов запроса на обновление SQL будет динамичным, какКак написать динамический sql в Oracle Хранимой процедуре?

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; 

Его дает мне foloowing ошибку

Error (17,13): PLS-00103: Обнаружен символ "=", когда ожидает одно из следующих действий: постоянные таблицы исключений долго двойной реф полукокса времени timestamp interval date двоичный национальный символ nchar Символ "" был заменен на "=" для продолжения.


Ошибка (22,5): PLS-00103: Встречающиеся символ «ОБНОВЛЕНИЕ», когда ожидают одно из следующих действий: начать процедуру функции прагма типа подтипа текущего курсора удалить существует до Символ «начинают »было заменено на« ОБНОВЛЕНИЕ »для продолжения.


Ошибка (31,6): PLS-00103: Встречающиеся символ ";" когда ожидается одно из следующих действий: петля

ответ

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; 
+0

Спасибо за ответ. Теперь proc компилируется. Но, к сожалению, это не работает. Новые значения могут быть строками или цифрами. Таблица BI_EMPLOYEE имеет столбцы с типом данных varchar2 и номером. Оба они могут иметь новые значения в таблице emp_update, но тип данных new_value в emp_update - varchar2. Таким образом, с помощью этого запроса он дает мне ошибку, как если новый vlaue является «John», «john» является недопустимым идентификатором. Пожалуйста помоги. – ashishjmeshram

+1

Вам нужно использовать переменные bind для employee_update.new_value и employee_update.employee_id. –

+0

@WW., Вы правы. Я обновлю свой ответ. –