2009-04-21 1 views
2

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

хранимой процедуры

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; 

Temp Таблица

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

Это был только тот ответ, который мне нужен. Я не уверен, почему я этого не заметил! –

+0

, кстати, глобальная временная таблица вообще никогда не нуждается в усечении. –

ответ

3

Это легко, вы могут использовать dynamic cursors ...

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.

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

  • Нет связанных вопросов^_^