Динамическое заполнение курсора Oracle в хранимой процедуре

Мне нужно динамически заполнить курсор Oracle (Oracle 10g). Оператор SQL изменяется в зависимости от входного значения, которое нужно извлечь из разных таблиц и столбцов. Чего я не хочу делать, так это поддерживать временную таблицу, которую я усекаю и загружаю каждый раз, когда выполняется sproc. Вот что я сейчас делаю, но если есть другая альтернатива, я был бы признателен за помощь:

Хранимая процедура

    PROCEDURE Get_Type_One_Polygon_Values(in_role VARCHAR2, rc_generic OUT SYS_REFCURSOR) as
BEGIN        

        execute immediate 'truncate table teamchk.temp_type_one_roles';

        execute immediate 'INSERT INTO TEAMCHK.TEMP_TYPE_ONE_ROLES ' || 
                          'SELECT ' || in_role || '_POLY_ID, ' || in_role || '_POLY_NAME ' ||      
                          'FROM TEAMCHK.' || in_role;        

        open rc_generic for                           
        select * from teamchk.temp_type_one_roles;

END;

Временная таблица

    CREATE TABLE TEAMCHK.TEMP_TYPE_ONE_ROLES
(
    ROLE_ID     NUMERIC(38,0),
    ROLE_NAME   VARCHAR2(75)        
);

person Blake Blackwell    schedule 21.04.2009    source источник
comment
Это был как раз тот ответ, который мне был нужен. Я не уверен, почему я упустил из виду это!   -  person Blake Blackwell    schedule 22.04.2009
comment
кстати, глобальную временную таблицу вообще никогда не нужно усекать.   -  person Jeffrey Kemp    schedule 11.07.2009


Ответы (1)


Это просто, вы можете использовать динамические курсоры...

create or replace PROCEDURE Get_Type_One_Polygon_Values
(in_role VARCHAR2, rc_generic OUT SYS_REFCURSOR) as
sql varchar2(100);
BEGIN        
            sql :='SELECT ' || in_role || '_POLY_ID, ' 
                 || in_role || '_POLY_NAME '
                 || 'FROM TEAMCHK.' || in_role;        

            open rc_generic for sql;
END;

Может быть полезно использовать псевдонимы столбцов POLY_ID и POLY_NAME, чтобы объединить их все в refcursor.

person Osama Al-Maadeed    schedule 22.04.2009