2010-07-29 7 views
0

J'essaie d'ouvrir un curseur REF en utilisant une instruction select comme ....Oracle - Comprendre le mot clé 'Using' ...?

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

Mais cela ne fonctionne que si myPassedInValList n'a qu'un seul ID en elle. J'essaie d'utiliser une liste comme '1', '2', '5', etc ...

Quelqu'un peut-il me dire pourquoi cela ne fonctionne pas.

J'ai essayé de Google, mais « Utilisation » est un mot terriblement commun :(

Répondre

3

Vous ne pouvez pas utiliser un type défini par l'utilisateur (probablement myPassedInValList est un varray ou d'une table imbriquée?) dans SQL comme ça. Afin de référencer le v aleurs de l'UDT, vous aurez besoin d'utiliser la fonction table, comme ceci:

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

La fonction table se traduira par le tableau dans un objet semblable à table en mémoire, ce qui vous permet d'accéder à son contenu dans SQL .

Cela fonctionnera uniquement si votre UDT est défini en tant qu'objet de base de données (CREATE TYPE...). S'il est défini dans votre package, le SQL ne pourra pas voir la définition.

1

Au meilleur de ma connaissance, ce n'est pas possible, vous pouvez essayer de la contourner avec SQL dynamique. Concaténer la chaîne OPEN myREF FOR SELECT * FROM MYTABLE WHERE MYID IN ( à la liste des valeurs réelles, puis ouvrez le curseur.

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; 
Questions connexes