2010-12-13 10 views
1

Il est possible de passer le nom de la table d'un curseur à l'autre. Avec bonté laissez-moi l'autre sens.Passage du nom de table au curseur

CURSOR R IS SELECT TABLE_NAME FROM RESOURCE ; 


CURSOR S(TAB VARCHAR2) IS SELECT username from TAB where sid=1291; 

Y at-il un autre moyen de passer la table à un curseur.

Répondre

5

Pour développer la réponse de JackPDouglas, vous ne pouvez pas utiliser un nom de paramètre comme nom [table] dans un curseur. Vous devez utiliser SQL dynamique dans un REF CURSOR

http://download.oracle.com/docs/cd/B10500_01/appdev.920/a96590/adg09dyn.htm#24492

CREATE OR REPLACE PROCEDURE dynaQuery(
     TAB IN VARCHAR2, 
     sid in number , 
     cur OUT NOCOPY sys_refcursor) IS 
query_str VARCHAR2(200); 
BEGIN 
    query_str := 'SELECT USERNAME FROM ' || tab 
     || ' WHERE sid= :id'; 
dbms_output.put_line(query_str); 
    OPEN cur FOR query_str USING sid; 
END ; 
/

Exemple Commence

create table test1(sid number, username varchar2(50)); 
insert into test1(sid, username) values(123,'abc'); 
insert into test1(sid, username) values(123,'ddd'); 
insert into test1(sid, username) values(222,'abc'); 
commit; 
/



declare 
    cur sys_refcursor ; 
    sid number ; 
    uName varchar2(50) ; 
    begin 
    sid := 123; 
    dynaQuery('test1',sid, cur); 
    LOOP 
    FETCH cur INTO uName; 
    DBMS_OUTPUT.put_line(uName); 
    EXIT WHEN cur%NOTFOUND; 
    -- process row here 
    END LOOP; 
CLOSE CUR; 


    end ; 

Sortie:

SELECT USERNAME FROM test1 WHERE sid= :id 
abc 
ddd 
abc 
ddd 
ddd 

EDIT: Ajout Fermer CUR qui a été à juste titre proposé par @JackPDouglas

+0

ne devrait pas vous [fermer] (http://asktom.oracle.com/pls/asktom/f?p=100:11:0 :: :: P11_QUESTION_ID: 1606716582692) que curseur –

+0

@JackPDouglas bonne prise, ajouté – Harrison

4

Vous ne pouvez pas utiliser SQL dynamique avec un cursor - vous pourriez être en mesure de faire ce que vous voulez en utilisant un ref cursor. Voir here par exemple

Questions connexes