Предполагается, что вы используете Oracle 10g или более поздней версии (и было написано до того, как OP выяснил, какую версию они используют)
Используйте оператор MEMBER OF
:
UPDATE T_PRIVILAGE
SET ENABLE_STATUS = 0,
GRANT_USERID = P_REQ_USER_ID
WHERE ID MEMBER OF P_DISABLE_LIST;
Вы также можете использовать псевдостолбец COLUMN_VALUE
:
UPDATE T_PRIVILAGE
SET ENABLE_STATUS = 0,
GRANT_USERID = P_REQ_USER_ID
WHERE ID IN ( SELECT COLUMN_VALUE FROM TABLE( P_DISABLE_LIST ) );
почему этот код не работает правильно?
SELECT * FROM TABLE( P_DISABLE_LIST )
Выбирает строку из таблицы. Однако таблица генерируется выражением коллекции таблиц, и нет базовой таблицы базы данных для ссылки на строку, поэтому Oracle генерирует исключение ORA-22905
. (Будет лежать базовая таблица, если коллекция будет храниться во вложенной таблице; Вот почему эта ситуация специально упоминается в исключении).
Обновление : PL / SQL решение:
FOR i IN 1 .. P_DISABLE_LIST.COUNT LOOP
UPDATE T_PRIVILAGE
SET ENABLE_STATUS = 0,
GRANT_USERID = P_REQ_USER_ID
WHERE ID = P_DISABLE_LIST(i);
END LOOP;