Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Создание записи  [new]
Alexggg99
Member

Откуда: С-Петербург
Сообщений: 54
Как создать запись внутри функции на основе таблице,
l_rec v_table%rowtype;
причем имя этой таблицы передаётся в функцию как переменная.

create or replace function l_changes(log_id     number,
                                     log_user   varchar2,
                                     log_date   date,
                                     v_table    varchar2,
                                     log_action varchar2) return varchar2 is
l_rec v_table%rowtype;
begin
  if log_action = 'U' then
    return null;
  else
    return null;
  end if;
end;
29 июн 11, 00:20    [10890133]     Ответить | Цитировать Сообщить модератору
 Re: Создание записи  [new]
проходил мимо...
Member

Откуда: от верблюда
Сообщений: 1178
Alexggg99,

Если на самом деле нужно, в чем я СИЛЬНО сомневаюсь, используй xmltype.
Или - для настоящих ценителей - execute immediate для анонимного блока, где будет создана и использована требуемая запись. Но я бы таких разработчиков убивал, пока маленькие...
29 июн 11, 00:29    [10890153]     Ответить | Цитировать Сообщить модератору
 Re: Создание записи  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54391
Alexggg99
Как создать запись внутри функции на основе таблицы,
l_rec v_table%rowtype;
а для чего? что с ней будет дальше?
29 июн 11, 00:33    [10890160]     Ответить | Цитировать Сообщить модератору
 Re: Создание записи  [new]
Alexggg99
Member

Откуда: С-Петербург
Сообщений: 54
а как тогда мне обойтись без l_rec v_table%rowtype;
дело в том что по передаваемой таблице в функцию необходимо выбрать поля я решил сначала выгрузить необходимые мне поля в запись а потом уже разбератся. Передоваяемая таблицы в функцию могут быть очень разными. Я точно буду знать какая запись мне нужна по log_id
29 июн 11, 00:39    [10890174]     Ответить | Цитировать Сообщить модератору
 Re: Создание записи  [new]
проходил мимо...
Member

Откуда: от верблюда
Сообщений: 1178
Точно - убивать!
29 июн 11, 00:41    [10890181]     Ответить | Цитировать Сообщить модератору
 Re: Создание записи  [new]
Alexggg99
Member

Откуда: С-Петербург
Сообщений: 54
проходил мимо...,

а как тогда мне быть цель: добавить в запрос столбец (строка), который
содержал бы информацию о том, что и на что поменялось. Например, если
изменилорь имя с ААА на ЖЖЖ и фамилия с РРР на ННН, то в поле должно
быть "PRSN_FIRST_NAME: ААА->ЖЖЖ; PRSN_LAST_NAME: РРР->ННН".
29 июн 11, 00:54    [10890204]     Ответить | Цитировать Сообщить модератору
 Re: Создание записи  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54391
проходил мимо...
Точно - убивать!
да подожди ты сразу убивать
29 июн 11, 00:55    [10890206]     Ответить | Цитировать Сообщить модератору
 Re: Создание записи  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54391
Alexggg99
проходил мимо...,

а как тогда мне быть цель: добавить в запрос столбец (строка), который
содержал бы информацию о том, что и на что поменялось. Например, если
изменилорь имя с ААА на ЖЖЖ и фамилия с РРР на ННН, то в поле должно
быть "PRSN_FIRST_NAME: ААА->ЖЖЖ; PRSN_LAST_NAME: РРР->ННН".
универсальная функция, одна на все случаи - на самом деле ничего полезного от неё нет

кто тебе мешает сразу апдейт писать вместо вызова этого функционального монстра?
29 июн 11, 00:56    [10890209]     Ответить | Цитировать Сообщить модератору
 Re: Создание записи  [new]
Alexggg99
Member

Откуда: С-Петербург
Сообщений: 54
обождите вы убивать.....скажите лучше с помощью чего лучше выполнить функцию
29 июн 11, 00:57    [10890214]     Ответить | Цитировать Сообщить модератору
 Re: Создание записи  [new]
проходил мимо...
Member

Откуда: от верблюда
Сообщений: 1178
Alexggg99,

На самом деле тебе этого не нужно. Ты пытаешься изобрести аудит, который изобрели задолго до тебя.
29 июн 11, 00:58    [10890215]     Ответить | Цитировать Сообщить модератору
 Re: Создание записи  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54391
Alexggg99
обождите вы убивать.....скажите лучше с помощью чего лучше выполнить функцию
функцию выбросить, писать сразу апдейты, твой Оракл тебе спасибо скажет
29 июн 11, 00:58    [10890217]     Ответить | Цитировать Сообщить модератору
 Re: Создание записи  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54391
проходил мимо...
Alexggg99,
Ты пытаешься изобрести аудит
а чего ты так решил?
29 июн 11, 01:00    [10890220]     Ответить | Цитировать Сообщить модератору
 Re: Создание записи  [new]
Alexggg99
Member

Откуда: С-Петербург
Сообщений: 54
andreymx,

мне аплейт не нужен мне нужно вернуть результаты запроса, а функция возврашает изменения которые произошли в таблице
Например, если
изменилорь имя с ААА на ЖЖЖ и фамилия с РРР на ННН, то в поле должно
быть "PRSN_FIRST_NAME: ААА->ЖЖЖ; PRSN_LAST_NAME: РРР->ННН".
а сам запрос вот:
Select o.log_id, o.log_user, o.log_date, o.object, o.log_action, l_changes(...) from (
Select u.*, row_number() over(order by log_date desc) rn
 from (Select t.log_id, t.log_user, t.log_date, 'clnt_attr' object, t.log_action
         from clnt_attr_log t
       union all
       Select t.log_id, t.log_user, t.log_date, 'con_header', t.log_action
         from con_header_log t
       union all
       Select t.log_id, t.log_user, t.log_date, 'con_value', t.log_action
         from con_value_log t 
       union all
       Select t.log_id, t.log_user, t.log_date, 'dic_client', t.log_action
         from dic_client_log t
       union all
       Select t.log_id, t.log_user, t.log_date, 'dic_person', t.log_action
         from dic_person_log t
       union all
       Select t.log_id, t.log_user, t.log_date, 'prsn_attr', t.log_action
         from prsn_attr_log t  ) u
order by log_date desc) o
where rn<11; 
29 июн 11, 01:02    [10890228]     Ответить | Цитировать Сообщить модератору
 Re: Создание записи  [new]
проходил мимо...
Member

Откуда: от верблюда
Сообщений: 1178
Alexggg99,

Нет слов. Полагаю, мое присутствие далее здесь излишне...
29 июн 11, 01:14    [10890245]     Ответить | Цитировать Сообщить модератору
 Re: Создание записи  [new]
Alexander Ryndin
Member

Откуда:
Сообщений: 4917
Блог
Alexggg99,

давайте вы объясните, какова цель этого велосипеда... ну а вообще вот это мастрид
29 июн 11, 01:35    [10890258]     Ответить | Цитировать Сообщить модератору
 Re: Создание записи  [new]
AmKad
Member

Откуда:
Сообщений: 5222
проходил мимо...
Alexggg99,

Нет слов. Полагаю, мое присутствие далее здесь излишне...

Мы этого субъекта уже знаем. Еще тот любитель извращений. Не помню чтобы чье-то присутствие ему еще когда-то помогало
29 июн 11, 01:45    [10890272]     Ответить | Цитировать Сообщить модератору
 Re: Создание записи  [new]
Alexggg99
Member

Откуда: С-Петербург
Сообщений: 54
Цель - создать запрос который возвращал бы следующие поля:
  • ID лога
  • Пользователь
  • Дата изменения
  • Объект (название таблицы)
  • Действие (I, U, D)
  • строка, который содержал бы информацию о том, что и на что поменялось. Например, если изменилорь имя с ААА на ЖЖЖ и фамилия с РРР на ННН, то в поле должно быть "PRSN_FIRST_NAME: ААА->ЖЖЖ; PRSN_LAST_NAME: РРР->ННН".
  • 29 июн 11, 10:27    [10890961]     Ответить | Цитировать Сообщить модератору
     Re: Создание записи  [new]
    AlexFF__|
    Member

    Откуда:
    Сообщений: 2855
    Alexggg99
    Цель - создать запрос который возвращал бы следующие поля:
  • ID лога
  • Пользователь
  • Дата изменения
  • Объект (название таблицы)
  • Действие (I, U, D)
  • строка, который содержал бы информацию о том, что и на что поменялось. Например, если изменилорь имя с ААА на ЖЖЖ и фамилия с РРР на ННН, то в поле должно быть "PRSN_FIRST_NAME: ААА->ЖЖЖ; PRSN_LAST_NAME: РРР->ННН".


  • Ну так делайте в триггере свой аналог аудита. Кстати, дело очень полезное, я имею ввиду сам процесс.
    29 июн 11, 10:44    [10891070]     Ответить | Цитировать Сообщить модератору
     Re: Создание записи  [new]
    Сергей Арсеньев
    Member

    Откуда:
    Сообщений: 4118
    Alexggg99
    Как создать запись внутри функции на основе таблице,
    l_rec v_table%rowtype;


    Если надо извращаться, то можно так:
    begin
     execute immediate('begin for l_rec in (Select * from '||'DUAL'||' where 1=1) loop dbms_output.put_line(''Dummy:''||l_rec.dummy); end loop; end;');
    end;
    /

    Но если надо журнал, то это можно сделать другими способами (Audit, Trigger, MatView Log и т.д. и т.п.)
    29 июн 11, 10:53    [10891138]     Ответить | Цитировать Сообщить модератору
     Re: Создание записи  [new]
    Alexggg99
    Member

    Откуда: С-Петербург
    Сообщений: 54
    Сергей Арсеньев,

    что за способ Audit ?
    29 июн 11, 11:00    [10891184]     Ответить | Цитировать Сообщить модератору
     Re: Создание записи  [new]
    -2-
    Member

    Откуда:
    Сообщений: 15330
    Alexggg99
    что за способ Audit ?
    Фиксировать изменение данных проще всего с FLASHBACK ARCHIVE или CDC для версий чуть пораньше.
    29 июн 11, 11:12    [10891273]     Ответить | Цитировать Сообщить модератору
     Re: Создание записи  [new]
    sam_sql.ru
    Member

    Откуда:
    Сообщений: 606
    Может быть этого хотел ?

    CREATE OR REPLACE FUNCTION l_changes(log_id NUMBER, log_user VARCHAR2, log_date DATE, v_table VARCHAR2, log_action VARCHAR2)
    RETURN VARCHAR2
    IS
    BEGIN
    EXECUTE IMMEDIATE 'DECLARE l_rec ' || v_table || '%ROWTYPE; BEGIN <<Здесь твои дела>>; END;';

    IF log_action = 'U' THEN
    RETURN NULL;
    ELSE
    RETURN NULL;
    END IF;
    END;
    /
    29 июн 11, 11:37    [10891447]     Ответить | Цитировать Сообщить модератору
     Re: Создание записи  [new]
    sam_sql.ru
    Member

    Откуда:
    Сообщений: 606
    а вообще да, если подразумевается, что sql меняется - динамический sql
    29 июн 11, 11:38    [10891460]     Ответить | Цитировать Сообщить модератору
    Все форумы / Oracle Ответить