暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 使用TAPI逻辑触发器中的Clob

askTom 2016-03-22
192

问题描述

这就是我的问题

我有一张有三列的表格:

jo_标题varchar2(4000)
jo_desclob
结果_cd号

限制:
我们使用DesignerTAPI来生成逻辑来验证和触发此表上的事件。

在预插入和预更新触发器中(逻辑存储在TAPI包中)
我们需要调用一个函数,该函数将导出结果_cd cg$rec.result_cd := auto_code(cg$rec.jo_) ;


问题:
在触发器中使用Clob列不可用(不允许) ,因此当代码被调用时, cg$rec.jo_dec在记录级别不可用


解决方案:
1.向表中添加附加列,将jo_dec分解为varchar2。
(因为auto_code函数只需要3000个cg$rec.jo_dec )
这个新列将是varchar2 ,允许我们将其用于TAPI逻辑。
那么我们的插入逻辑将是这样的
cg$rec.result_cd := auto_code ( cg$rec.jo_标题、cg$rec.ac_store_str ) ;

缺点:在表格的每个位置插入/更新,我都必须准备新列,然后
把它添加到我的陈述中,并为现场添加额外的存储。
ac_store_str:=匹配_pkg.prep_jo_dec(jo_dec) ;

我倾向于这个原因,它允许我从设计师那里生成(100%) ,而不需要后续代
修改...但我不喜欢额外的列和空间要求,也不依赖于
应用程序以传递正确的信息。(为该表提供数据的多个应用程序( web、窗体、db_package )


2.虚拟列
我创建了一个虚拟列“ac_store_str as (匹配_pkg.prep_jo_ dev(jo_ dev ) )”
返回3000或更小的被剥离的字符串。

然后,在我的计算逻辑中,我可以使用ac_store_str来获取auto_code(cg$rec.jo_tal, cg$rec.ac_store_str)

**创建表时,它将显示缺省值为“匹配”的列。pkg.prep_jo_ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

问题:

1.从我的TAPI包中是否可以获得ac_store_str的值?它似乎无法通过cg$rec.ac_store_str访问?

2.我是否完全没有更好的解决方案来解决我的问题?
(是的,我意识到摆脱了Designer,TAPI是一个解决方案,但我们必须在下次再解决这个问题)

感谢您提前反馈。

***更新信息:
下拉表选项卡1 ;
创建表标签1 (c1club) ;
创建或替换过程p (c clob)为
开始
空;
结束;
/

创建或替换触发器trg1
在更新每行的选项卡1之前
开始
dbms_输出.put_line ('长度old ='||长度(:old.c1 ) ) ;
:new.c1 :=:new.c1 || to_clob ('更新') ;
dbms_输出.put_line ('长度new ='||长度(:new.c1) ) ;
p(:new.c1) ;
结束;
/
创建或替换触发器trg2
每行在Tab1上插入之前
开始
dbms_t.put_line('建议的blob列的新值:'||chr(10) ;
dbms_输出.put_line(:new.c1) ;
←Wikivoyage :new.c1 :=:new.c1 || to_clob(chr(10)||'插入') ;
dbms_输出.put_line ('blob列的最终值:'||chr(10) ;
dbms_output.put_line(:new.c1);
p(:new.c1) ;
结束;


用你发给我的信息建立了一个测试用例,你是对的。您可以在触发器中看到CLOB字段的值。有以下警告。
如果插入到Tab(c1)值中( to_cLOB('Hi there clab') ) ;
触发器显示信息,你可以使用Clob。但是
我使用表单将数据插入到表中,所以我认为它是在用和空_clab()进行插入,并返回lobloc ,然后在保存时直接写入到clab。当此更新发生时, NO触发器将触发。因此,在我的代码中,当我尝试使用Clob时,它是空的。

除了在我的表单中重写插入语句(不推荐) ,我认为在发出调用之前在应用程序中准备数据的初始方法(窗体、WEB、DB )将是这里可行的解决方案。

谢谢你的澄清。


专家解答

我不知道Forms如何处理LOB。如果它像您所说的那样使用定位器,那么您可以在不触发触发器的情况下操作LOB。正如文件里说的:

Using OCI functions or the DBMS_LOB package to update LOB values or LOB attributes of object columns does not fire triggers defined on the table that contains the columns or attributes.


http://docs.oracle.com/database/121/ADDCI/lobs.htm#ADDCI4383

您可以在PL/SQL中看到这一点。使用问题中的测试用例:

SQL> declare
  2    lob_loc clob;
  3    doc     varchar2(1000) := lpad('x', 10, 'x');
  4  begin
  5
  6     insert into tab1 (c1)
  7     values (empty_clob())
  8     returning c1 into lob_loc;
  9
 10     dbms_lob.write(lob_loc, length(doc), 1, doc);
 11  end;
 12  /
proposed new value of clob column:


final value of clob column:


insert

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.24
SQL>
SQL> select * from tab1;

C1
-----------------------------------------------------
xxxxxxxxxx


插入没有看到我们为C1设置的值('xxxxxxxxx') ,因为它没有在此时设置。但是写lob并不会触发更新触发器!

虽然它在正常更新时确实会触发:

SQL> update tab1 set c1 = 'a';
length old =10
length new =7

1 row updated.


所以是的,我相信在运行插入之前,您需要准备好您的数据。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论