2010-12-13 4 views
1

Ребята, можно передать имя таблицы из одного курсора в другой. любезно позвольте мне по-другому.Передача указателя на курсор

CURSOR R IS SELECT TABLE_NAME FROM RESOURCE ; 


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

есть ли другой способ передать таблицу курсору.

ответ

5

Чтобы развернуть ответ JackPDouglas, вы не можете использовать имя параметра в качестве имени [таблицы] в курсоре. Вы должны использовать динамический SQL в 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 ; 
/

начинающимся Пример

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 ; 

Выход:

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

EDIT: Добавлено Close CUR, которое по праву было предложено @JackPDouglas

+0

не должны ли вы [закрыть] (http://asktom.oracle.com/pls/asktom/f?p=100:11:0: :: P11_QUESTION_ID: 1606716582692), что курсор – 2010-12-13 14:44:05

+0

@JackPDouglas хороший catch, добавлен – Harrison

4

Вы не можете использовать динамический sql с cursor - возможно, вы сможете делать то, что хотите, используя ref cursor. См. here, например

Смежные вопросы