2017-01-04 8 views
-2

Я пытаюсь обновить столбцы, используя для всех. Заданная часть инструкции обновления построена, а затем передана в оператор for all. В заданной части может быть несколько столбцов. Но это вызывает ошибку: «Отсутствует знак равенства». Любой другой способ решить эту проблему?Обновление нескольких столбцов для всех

DECLARE 
    V_COL_LIST VARCHAR2(4000); 
    type emp_t 
    IS 
    TABLE OF NUMBER; 
    emp_id emp_t; 
BEGIN 
    SELECT employee_id bulk collect 
    INTO emp_id 
    FROM employees 
    WHERE department_id=10; 

    V_COL_LIST:='SALARY=EMPLOYEE_ID'; 

    FORALL INDX IN 1..emp_id.count 
    UPDATE EMPLOYEES SET V_COL_LIST 
    WHERE EMPLOYEE_ID=emp_id(indx); 
END; 
+1

Я видел, как вы не принимаете или голосований любых ответов, когда люди отвечают. Это csae, что вы не получаете то, что ожидаете, или вы не знаете, что делать, когда кто-то отвечает на ваш запрос. Я настоятельно рекомендую вам перейти к ссылке http://stackoverflow.com/help/someone-answers – XING

+1

Ваш оператор UPDATE не будет работать как простой SQL, так почему вы ожидаете, что он будет работать в инструкции FORALL? Вы должны начать с написания правильного SQL, а затем адаптировать его для работы в массовой операции. – APC

ответ

1

Синтаксис, который вы использовали, не распознается. Вы можете использовать динамический SQL для этого. Однако я не вижу , почему вы устанавливаете зарплата сотруднику_и d в SALARY=EMPLOYEE_ID. Проверьте свою логику.

Использование динамического SQL:

DECLARE 
    V_COL_LIST VARCHAR2(4000); 
    type emp_t 
    IS 
    TABLE OF NUMBER; 
    emp_id emp_t; 
BEGIN 
    SELECT employee_id bulk collect 
    INTO emp_id 
    FROM employees 
    WHERE department_id=10; 

    V_COL_LIST:='SALARY=1000'; 

    FORALL INDX IN 1..emp_id.count 
     execute immediate 'UPDATE EMPLOYEES SET ' || V_COL_LIST 
    ||' WHERE EMPLOYEE_ID=:1' using emp_id(indx); 
END; 
/

Если вы знаете, какие столбцы должны быть установлены на то, что, только вы равнину update-

DECLARE 
    type emp_t 
    IS 
    TABLE OF NUMBER; 
    emp_id emp_t; 
BEGIN 
    SELECT employee_id bulk collect 
    INTO emp_id 
    FROM employees 
    WHERE department_id=10; 

    FORALL INDX IN 1..emp_id.count 
     UPDATE EMPLOYEES SET COL1 = 'ABC', COL2 = 'DEF' 
     WHERE EMPLOYEE_ID = emp_id(indx); 
END; 
/