ITPUB论坛-中国专业的IT技术社区

 找回密码
 注册
查看: 2014|回复: 2

怎么用触发器new值替换select字段变量

[复制链接]
论坛徽章:
4
阿斯顿马丁
日期:2013-08-08 21:36:33优秀写手
日期:2014-03-12 06:00:132015年新春福章
日期:2015-03-04 14:53:162015年新春福章
日期:2015-03-06 11:58:39
发表于 2018-4-3 10:06 | 显示全部楼层 |阅读模式

求助各位高手,每一次触发生成一条json格式插入表里,
我的思路写一个函数,生成json模块, 由触发器调用此函数,
关键问题:没法替换:old   :new  值 ,还是一条字符串
(数据库版本:11G)


select  '{"ID":"'||:new.ID||'","NAME":"'||:new.NAME||'"}' into str  from dual

我要结果:

{"id":"1","name":"a"}





-- 表

-- Create table
create table TR_LOG
(
  json        VARCHAR2(4000),
  operation   VARCHAR2(20),
  insert_date DATE
)



-- Create table
create table TEST
(
  id   INTEGER,
  name VARCHAR2(100)
)



-- 函数

create or replace function fun_json_str(tab varchar2, flag varchar2)
  return varchar2 is
  Result varchar2(4000);
begin

  if flag = 'insert' then
    select '''{' || list || '}'''
      into Result
      from (select listagg('"' || COLUMN_NAME || '":"''||:new.' ||
                           COLUMN_NAME ||'||''"',
                           ',') within GROUP(order by COLUMN_NAME) as list
              From user_tab_cols
             where table_name = upper(tab)
             order by column_id asc);

  elsif flag = 'delete' then

    select '''{' || list || '}'''
      into Result
      from (select listagg('"' || COLUMN_NAME || '":"''||:new.' ||
                           COLUMN_NAME ||'||''"',
                           ',') within GROUP(order by COLUMN_NAME) as list
              From user_tab_cols
             where table_name = upper(tab)
             order by column_id asc);

  elsif flag = 'update' then

    select '''[{' || old_list || '},{' || new_list || '}]'''
      into Result
      from (select listagg('"' || COLUMN_NAME || '":"''||ld.' ||
                           COLUMN_NAME ||'||''"',
                           ',') within GROUP(order by COLUMN_NAME) as old_list,
                listagg('"' || COLUMN_NAME || '":"''||:new.' ||
                           COLUMN_NAME ||'||''"',
                           ',') within GROUP(order by COLUMN_NAME) as new_list

              From user_tab_cols
             where table_name = upper(tab)
             order by column_id asc);

  end if;

  return(Result);
end fun_json_str;



--  触发器
create or replace trigger test_trigger
  after delete or insert or update on test
  FOR EACH ROW
declare
  list     varchar2(4000);
  json_str varchar2(4000);
  vresult  varchar2(4000);
begin
  if inserting then

        json_str := fun_json_str('TEST', 'insert');
    /*insert into tr_log values (json_str, 'insert', sysdate);

    dbms_output.put_line('{"ID":"' || :new.ID || '","NAME":"' || :new.NAME || '"}');*/

    dbms_output.put_line('select  '||json_str||' into str  from dual');
    execute immediate 'select  '||json_str||' into str  from dual';
    insert into tr_log values (vresult, 'insert', sysdate);

  elsif updating then

    /*      
    dbms_output.put_line('[{"ID":"' || ld.ID || '","NAME":"' ||
                         ld.NAME || '"},{"ID":"' || :new.ID ||
                         '","NAME":"' || :new.NAME || '"}]');*/

    execute immediate 'select  fun_json_str(''TEST'', ''insert'') into vresult  from dual';
    insert into tr_log values (vresult, 'update', sysdate);

  elsif deleting then

论坛徽章:
496
紫蜘蛛
日期:2007-09-26 17:05:56奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:53
发表于 2018-4-3 22:57 | 显示全部楼层
你只能把多个列变成多个参数,一个个传给你的函数。所以你的函数是无法做成通用的。

使用道具 举报

回复
论坛徽章:
4
阿斯顿马丁
日期:2013-08-08 21:36:33优秀写手
日期:2014-03-12 06:00:132015年新春福章
日期:2015-03-04 14:53:162015年新春福章
日期:2015-03-06 11:58:39
 楼主| 发表于 2018-4-4 22:46 | 显示全部楼层
newkid 发表于 2018-4-3 22:57
你只能把多个列变成多个参数,一个个传给你的函数。所以你的函数是无法做成通用的。

谢谢newkid大神指导

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

TOP技术积分榜 社区积分榜 徽章 电子杂志 团队 统计 虎吧 老博客 知识索引树 读书频道 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 | IT博客
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛 | SAP ERP系统
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表