Oracle - Понимание ключевого слова "Использование" ...? - PullRequest
0 голосов
/ 30 июля 2010

Я пытаюсь открыть REF CURSOR с помощью оператора select, например ....

OPEN myREF FOR SELECT * FROM MYTABLE WHERE MYID IN (:Values) USING myPassedInValList;

Но это работает только тогда, когда myPassedInValList имеет только один идентификатор. Я пытаюсь использовать список вроде «1», «2», «5» и т. Д. *

Может кто-нибудь сказать мне, почему это не работает.

Я пытался в Google, но слово "Использование" - это очень распространенное слово: (

Ответы [ 2 ]

3 голосов
/ 30 июля 2010

Вы не можете использовать пользовательский тип (предположительно, myPassedInValList является таблицей varray или nested?) В SQL, подобном этому.Чтобы ссылаться на значения из UDT, вам нужно использовать функцию table, например:

OPEN myREF 
     FOR SELECT * 
         FROM MYTABLE 
         WHERE MYID IN (select * from table(:Values)) 
     USING myPassedInValList;

Функция table преобразует массив в табличный объект впамять, которая позволяет вам получать доступ к ее содержимому в SQL.

Это будет работать только в том случае, если ваш UDT определен как объект базы данных (CREATE TYPE...).Если он определен в вашем пакете, SQL не сможет увидеть определение.

1 голос
/ 30 июля 2010

Насколько мне известно, это невозможно.Вы можете попытаться обойти это с помощью динамического SQL: объединить строку OPEN myREF FOR SELECT * FROM MYTABLE WHERE MYID IN ( со списком фактических значений, затем открыть курсор.

http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28370/dynamic.htm#i13057

/*you could build this string dynamically by looking through myPassedInValList and
concatenating them in the IN list.*/
v_stmt_str := 'SELECT * FROM MYTABLE WHERE MYID IN (''1'',''2'')'

/*Open cursor & specify bind argument in USING clause:*/
OPEN v_emp_cursor FOR v_stmt_str;
...