PL/SQL вопросец

User avatar
ALV00
Уже с Приветом
Posts: 1491
Joined: 08 Mar 2002 10:01
Location: NJ

PL/SQL вопросец

Post by ALV00 »

Домашнюю работу делал, stackoverflow читал, дядю Тома тоже читал. Прояснения не наступило.
Нужно динамически вызвать процедуру, которая возвращает некий result set, типы колонок заранее неизвестны.
Нужно убедиться, что возвращается хотя бы одна строка. Для этого нужно сделать fetch, но во что его фетчить, если тип записи неизвестен?
Примерно как то так:

Code: Select all

CREATE OR REPLACE PROCEDURE SP_TEST(pProcedureName VARCHAR2)
IS 
    v_Statement VARCHAR(250);
    v_cur SYS_REFCURSOR;
BEGIN  
    v_Statement := 'begin ' || pProcedureName || '(:r); end;';
    EXECUTE IMMEDIATE v_Statement USING v_cur;
    FETCH v_cur INTO ????;
    CLOSE v_cur;
END;
User avatar
Uzito
Уже с Приветом
Posts: 8230
Joined: 06 Feb 2002 10:01
Location: NJ, USA

Re: PL/SQL вопросец

Post by Uzito »

добавить в переменные
c integer;
вместо fetch сделать

c := dbms_sql.to_cursor_number(v_cur);
if dbms_sql.fetch_rows(c) > 0 then
-- not empty
end if;
iDesperado
Уже с Приветом
Posts: 1422
Joined: 28 Nov 2008 17:50

Re: PL/SQL вопросец

Post by iDesperado »

помню из реф курсора селектить было можно, что-то типа такого должно работать

Code: Select all

CREATE OR REPLACE PROCEDURE SP_TEST(pProcedureName VARCHAR2)
IS 
    v_Statement VARCHAR(250);
    v_cur SYS_REFCURSOR;
    v_count NUMBER;
BEGIN  
    v_Statement := 'begin ' || pProcedureName || '(:r); end;';
    EXECUTE IMMEDIATE v_Statement USING v_cur;
    SELECT COUNT(*) INTO v_count FROM TABLE(v_cur) ;
END;
User avatar
ALV00
Уже с Приветом
Posts: 1491
Joined: 08 Mar 2002 10:01
Location: NJ

Re: PL/SQL вопросец

Post by ALV00 »

iDesperado, table() не работает в данном случае, к сожалению.
Uzito, dbms_sql решило проблему. Thanks a lot!

Return to “Вопросы и новости IT”