使用for all更新多个列

时间:2017-01-04 03:35:52

标签: sql oracle plsql forall

我正在尝试使用for all更新列。构造update语句的set部分,然后传递给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 个答案:

答案 0 :(得分:1)

无法识别您使用的语法。您可以使用动态SQL来执行此操作。但是,我没有看到为什么您在SALARY=EMPLOYEE_ID中将薪水设置为employee_i d。请检查你的逻辑。

使用动态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;
/

如果您知道要将哪些列设置为什么,那么只需更新 -

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;
/