Таблица обновления Oracle PLSQL, где находится ассоциативный массив?

Я хотел бы в хранимой процедуре обновить все записи, соответствующие идентификатору. Теперь этот список идентификаторов передается в виде таблицы varchar (ассоциативный массив).

CREATE TYPE varcharArray AS TABLE OF VARCHAR2(1000) index by ...

и объявление proc выглядит примерно так

PROCEDURE testProc (p_IDs in varcharArray, p_Success out Number)

и оператор обновления в процедуре

update testtable 
set col = 'val' 
where id in (select column_value from table(p_IDs);

Это не работает. Поэтому мне пришлось сделать цикл в массиве и обновить для каждого идентификатора.

Но я бы очень хотел, чтобы он обновлялся с помощью предложения where in. Любая помощь была бы отличной.

PS: поле id - это число.


person Ocelot    schedule 02.06.2015    source источник
comment
Что означает ... после CREATE TYPE?   -  person Tony Andrews    schedule 02.06.2015
comment
ничего, обновлю.   -  person Ocelot    schedule 02.06.2015
comment
Хорошо, тогда это не ассоциативный массив, а вложенная таблица. Ассоциативный массив — это тип PL/SQL, в котором вы указываете тип индекса, например. индексировать по pls_integer или индексировать по varchar2(40)   -  person Tony Andrews    schedule 02.06.2015
comment
на самом деле есть индекс by. прости за это. Обновлено в вопросе.   -  person Ocelot    schedule 02.06.2015
comment
Но тогда create type неверно, потому что вы не можете создать ассоциативный массив в базе данных, вы можете только объявить его в блоке PL/SQL.   -  person Tony Andrews    schedule 02.06.2015
comment
Я объявил это в пакете. Сохраненный процесс находится в том же пакете.   -  person Ocelot    schedule 02.06.2015
comment
Затем удалите предложение index by, чтобы сделать его вложенной таблицей, и убедитесь, что тип объявлен в спецификации пакета, а не в теле. Тогда это должно работать.   -  person Tony Andrews    schedule 02.06.2015
comment
Он объявлен в спецификации пакета, а не в теле. Кроме того, мне нужно, чтобы это был ассоциативный массив, потому что я вызываю его из управляемого доступа к данным .Net, который поддерживает ассоциативные массивы, но не udt.   -  person Ocelot    schedule 02.06.2015
comment
В этом случае, я думаю, вам нужно будет перенести данные из ассоциативного массива во вложенную таблицу, а затем запросить из нее.   -  person Tony Andrews    schedule 02.06.2015
comment
о.. вау, не могли бы вы дать мне кусочек этого? Вероятно, вы можете добавить это в свой ответ, чтобы, если это сработает, я мог проголосовать.   -  person Ocelot    schedule 02.06.2015
comment
for i in 1..assocarry.count loopnestedtable(i):= assocarray(i); конечная петля;   -  person Tony Andrews    schedule 02.06.2015
comment
хорошо, спасибо за это .. попробую это тоже .. и дам вам знать, как это идет.   -  person Ocelot    schedule 02.06.2015


Ответы (1)


Меня устраивает:

create table testtable (col varchar2(10), id varchar2(1000));
insert into testtable values (null, 'AAA');
insert into testtable values (null, 'BBB');
insert into testtable values (null, 'CCC');
insert into testtable values (null, 'DDD');
commit;


create or replace PROCEDURE testProc (p_IDs in varcharArray) is
begin
update testtable
set col = 'val'
where id in (select column_value from table(p_IDs));
end;
/

exec testproc(p_ids=>varcharArray('AAA','DDD'));

SQL> select * from testtable;

COL        ID
---------- ----------
val        AAA
           BBB
           CCC
val        DDD
person Tony Andrews    schedule 02.06.2015
comment
как насчет создания таблицы testtable (col varchar2 (10), идентификационный номер); есть ли способ бросить varcharArray .. что-то вроде: где в (выберите to_number (column_value) из таблицы (p_IDs)) - person Ocelot; 02.06.2015
comment
о, я просто догадывался.. Я не знал, что есть приведение to_number(). я попробую. - person Ocelot; 02.06.2015