DBMS_SQL.NUMBER_TABLE
- это ассоциативный массив PL / SQL, определенный в пакете DBMS_SQL
как:
TYPE number_table IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
Это данные PL / SQLтип и не должен работать в операторах SQL (мне еще предстоит выяснить, почему ваш первый оператор работает).
Если вы хотите, чтобы тип данных работал в SQL, вам нужно использовать коллекцию (безINDEX BY
; также называется типом данных вложенной таблицы):
CREATE TYPE number_table IS TABLE OF NUMBER;
Или фиксированной длины VARRAY
:
CREATE TYPE number_array IS VARRAY(10) OF NUMBER;
Например:
Установка Oracle :
CREATE TABLE real_number_table ( real_number_column, real_number_date ) AS
SELECT 1033000, DATE '2019-01-01' FROM DUAL;
CREATE TYPE number_table IS TABLE OF NUMBER;
Оператор PL / SQL 1 :
Тогда ваш SQLОператор будет работать с типом данных коллекции:
DECLARE
L_NUMBER NUMBER;
L_NUMBER_TABLE NUMBER_TABLE;
L_LAST_PRINTED_DATE DATE := SYSDATE;
BEGIN
L_NUMBER_TABLE := NUMBER_TABLE();
L_NUMBER_TABLE.EXTEND;
L_NUMBER_TABLE( L_NUMBER_TABLE.COUNT ) := 1033000;
UPDATE REAL_NUMBER_TABLE
SET REAL_NUMBER_DATE = L_LAST_PRINTED_DATE
WHERE EXISTS (
SELECT TB.COLUMN_VALUE
FROM TABLE( L_NUMBER_TABLE ) TB
WHERE TB.COLUMN_VALUE = REAL_NUMBER_COLUMN
);
END;
/
, а затем:
SELECT * FROM real_number_table;
выводит:
REAL_NUMBER_COLUMN | REAL_NUMBER_DATE
-----------------: | :---------------
1033000 | 09-OCT-19
PL / SQL Statement 2 :
Или вы можете упростить его и использовать оператор MEMBER OF
(это работает только с типами данных коллекции, но не VARRAY
s):
DECLARE
L_NUMBER NUMBER;
L_NUMBER_TABLE NUMBER_TABLE := NUMBER_TABLE( 1033000 );
L_LAST_PRINTED_DATE DATE := SYSDATE + 1;
BEGIN
UPDATE REAL_NUMBER_TABLE
SET REAL_NUMBER_DATE = L_LAST_PRINTED_DATE
WHERE REAL_NUMBER_COLUMN MEMBER OF L_NUMBER_TABLE;
END;
/
и затем:
SELECT * FROM real_number_table;
выходы:
REAL_NUMBER_COLUMN | REAL_NUMBER_DATE
-----------------: | :---------------
1033000 | 10-OCT-19
db <> fiddle здесь
Ваш окончательный анонимный блок PL / SQL может быть переписан как:
DECLARE
L_NUMBER_TABLE NUMBER_TABLE;
L_LAST_PRINTED_DATE DATE := SYSDATE;
BEGIN
SELECT column1
BULK COLLECT INTO L_NUMBER_TABLE
FROM your_table; -- as per L_ORIGINAL_CURSOR
IF L_NUMBER_TABLE.COUNT > 0 THEN
UPDATE other_table
SET date_column = L_LAST_PRINTED_DATE
WHERE number_column MEMBER OF L_NUMBER_TABLE;
END IF;
END;
/