Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ура! Без рефкурсора получаю набор данных


}|{yk ©   (2004-04-27 16:29:00) 

CREATE OR REPLACE
type ttablecolumns is OBJECT
(
COLUMN_NAME varchar2(32),
COLUMN_TYPE varchar2(32)
);

CREATE OR REPLACE
type ttablecolumns_tab is table of TTableColumns;
/

Функцию
CREATE OR REPLACE
FUNCTION get_table_cols(inTable_Name in varchar2,inOwner_Name in varchar2)
return TTableColumns_Tab
is
 retval TTableColumns_Tab:=TTableColumns_Tab();
 col_name varchar2(32);
 col_type varchar2(32);
 cursor c_TableCols is
 select a.column_name,a.data_type from all_tab_columns a
   where a.table_name=inTable_name
         and a.owner=inOwner_Name;
begin
 open c_TableCols;
 loop
  FETCH c_TableCols into col_name,col_type;
  exit when c_TableCols%NOTFOUND;
  retval.EXTEND;
  retval (retval.LAST):=TTableColumns(col_name,col_type);
 end loop;
 close c_TableCols;
 return retval;
end;
/

и
select column_name,column_type from table (cast(GET_TABLE_COLS('CUST1','CES') as TTableColumns_Tab));
ляпота
но кто нить знает как такую функцию использовать в ODAC?


}|{yk   (2004-04-27 18:16:00) [1]

Вот
триггер мне нужен для формирования xml-предстваления изменений
тело триггера во всех таблицах одинаковое, меняется только участок кода, ответственный за xml

FUNCTION GET_TRIGGER_LOG_BODY(inOwner_Name in varchar2)
return TTABLETRIGGERMAKET_TABLE
 is
  retval TTABLETRIGGERMAKET_TABLE:=TTABLETRIGGERMAKET_TABLE();
  col_name varchar2(32);
  col_type varchar2(32);
  table_name varchar2(32);
  trigger_maket_new varchar2(2000);
  trigger_maket_old varchar2(2000);  
  trigger_maket varchar2(4000);
  cursor c_TableCols is
  select a.table_name,a.column_name,a.data_type from all_tab_columns a
    where a.owner=inOwner_Name
    and a.table_name in
    (
    select b.table_name from app_logged_tables b where b.is_logged='Y'
    );
 begin
  trigger_maket:='';
  trigger_maket_new:='IF (INSERTING OR UPDATING)  THEN   BEGIN ';
  trigger_maket_new:=trigger_maket_new||'new_value :=''<operation type="'' || operation || ''" created='' || TO_CHAR (time_event) || ''><table table_name="">'';';
  trigger_maket_old:='IF (DELETING OR UPDATING)  THEN   BEGIN ';
  trigger_maket_old:=trigger_maket_old||'old_value :=''<operation type="'' || operation || ''" created='' || TO_CHAR (time_event) || ''><table table_name="">'';';
  open c_TableCols;
  loop
   FETCH c_TableCols into table_name,col_name,col_type;
   exit when c_TableCols%NOTFOUND;
   trigger_maket_new:=trigger_maket_new||'new_value := new_value || '''||'<'||col_name||' type="'||col_type||'">''||new.'||col_name||'||''</'||col_name||'>'';';
   trigger_maket_old:=trigger_maket_old||'old_value := old_value || '''||'<'||col_name||' type="'||col_type||'">''||old.'||col_name||'||''</'||col_name||'>'';';
  end loop;
   trigger_maket_new:=trigger_maket_new||'new_value := new_value || ''</table></operation>'';'||'END;END IF;';
   trigger_maket_old:=trigger_maket_old||'old_value := old_value || ''</table></operation>'';'||'END;END IF;';
   trigger_maket:=trigger_maket||trigger_maket_new||trigger_maket_old;
   retval.EXTEND;
   retval (retval.LAST):=TTABLETRIGGERMAKET(table_name,trigger_maket);
  close c_TableCols;
  return retval;
 end;


Курдль   (2004-04-27 17:16:00) [2]


> Так зачем делать навороченную ХП которая возвращает тоже
> самое, что и этот запрос ?
> И каким образом ты автоматизированно создаешь триггеры ?

Вот мне самому интересно, чем закончится эта эпоппея "универсального созидателя"? :)))


Vlad   (2004-04-27 17:14:00) [3]


> }|{yk ©   (27.04.04 17:04) [2]

Не понял.
Получать поля и типы можно и без ХП, ты сам же запрос написал:
select a.column_name,a.data_type from all_tab_columns a
  where a.table_name=:inTable_name and a.owner=:inOwner_Name;

Так зачем делать навороченную ХП которая возвращает тоже самое, что и этот запрос ?
И каким образом ты автоматизированно создаешь триггеры ?


}|{yk   (2004-04-27 17:04:00) [4]

чтобы получать поля, типы, и автоматизовано создавать триггеры
для хранения логов (сейчас делаю)


Vlad   (2004-04-27 16:43:00) [5]

Можно вопрос ?
Зачем нужны были такие извращения ?
Почему на клиенте с помощью SQL запроса нельзя было тоже самое получить ???


Наверх

Титульная страница Поиск, карта сайта Написать письмо