问题描述
这就是我的问题
我有一张有三列的表格:
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 )将是这里可行的解决方案。
谢谢你的澄清。
我有一张有三列的表格:
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。正如文件里说的:
http://docs.oracle.com/database/121/ADDCI/lobs.htm#ADDCI4383
您可以在PL/SQL中看到这一点。使用问题中的测试用例:
插入没有看到我们为C1设置的值('xxxxxxxxx') ,因为它没有在此时设置。但是写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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




