|
清单6. 测试函数 CREATE_PROCEDURE( )
7r6c5X"y3[3Z&D!h9mTechWeb-技术社区/]8}-D)h!r)F1h#x&C
下面这个例子测试演示了从触发器调用包含一个参数的存储过程。
6}(I,X0q0Vtech.techweb.com.cn2b5s-{(j*~(I3J o1V
在该示例中,我们创建 t1 和 t2 这两个表,带有一个输入参数(p)
-V7F%b(b5{%`)W程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛
4G.V3i5b z)U;Z+S5f&S:C 的过程(abc)以及一个触发器(ins)。在执行触发器时,它将调用该过程。&d&?#J-v$K b1W.?
程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛!D'Y&_(f-q+q9b&?-a
然后,过程将会将 num 列的新值(NEW.coll)插入到表 t1 中。TechWeb-技术社区&V,@ ^9@$K+~+x
tech.techweb.com.cn4c J&Z&j+b
这可以通过以下操作来测试:在表 t2 上执行插入后对 t1 发出 select
+| W3J,P%q"f)`1w5u&r:W,a9O
来检验该表内容 —— 进而检验该过程是否成功执行。 create table t1 ( col1 int)
7U d7{$h0h;d DB20000I The SQL command completed successfully.
#Y%m9Q&f9@&x2n create table t2 ( col1 int )5X'M!n:_,I/F+^
DB20000I The SQL command completed successfully.
)t*]2k)g7P create procedure abc(in p int) begin insert into t1 values(p); end8q)a6o,r3P+p0y
DB20000I The SQL command completed successfully.
;t7X ?)F*g1l9s$vtech.techweb.com.cn create trigger ins after insert on t2 referencing NEW as new for EACH ROW MODE
$A$U9h7l&q)` DB2SQL BEGIN ATOMIC values ( call_procedure('DB2INST1.ABC', char(new.col1 * 2),
(y%f,]/l5N9|!I,Z 'SAMPLE', 'DB2INST1', 'db2inst1') ); END/z&W%^-H.m"b"]2p,M
DB20000I The SQL command completed successfully.(}-S,E&T3J6V;Z3O
insert into t2 values 20
'w9P&g.R0x*@+Q5Y-H程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛 DB20000I The SQL command completed successfully.
,s9F1I(]-J;k /* validate that the trigger has fired - it should update t1 */
*D&I;?3H"I;D"otech.techweb.com.cn select * from t10D9S+A7Q$[,L'W
COL1程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛#C%l j3K"F'P
-----------
$M"O!y1| Jtech.techweb.com.cn 40
.~+] i+`3m6A8B*G$b 1 record(s) selected.
9r8_0w$N5U/@![9y/B:F9f&r8^
:` p1M7w2t'z8b,O4^0D2h
下一个例子演示了在 UDF 中调用包含了两个参数的存储过程。在该例中,我们创建表( c ),带有两个输入参数的存储过程( abc )以及带有两个参数(parm1,parm2)的 UDF( udf_withcall )。当执行该 UDF 时,它将调用存储过程,然后,该存储过程会将由 UDF 传递给它的值插入表 c。对表 c 进行 select 将验证表 c 的内容以及存储过程是否执行成功。可以在“下载”小节中找到该脚本( udf_calls_proc.db2)的源代码。 create table c ( a int check (a <> 8), a1 int )tech.techweb.com.cn#V1B6g,H;j*K)B
DB20000I The SQL command completed successfully.0y"Z2r$G!p
create procedure abc(in p int, in p2 int) begin insert into c values(p,p2); end
+a,z2Y,v.L/i!N0N&RTechWeb-技术社区 DB20000I The SQL command completed successfully.5G0[!s$~&y:q:U
create function udf_withcall (parm1 int, parm2 int)TechWeb-技术社区,x(a,J _)u;W/Z
returns int
#w!e(t n+},Q1M#{6u ? Language SQL
.]*f9?-A.p S6T)Ltech.techweb.com.cn not deterministic
;H8j&~2w(k%B8X程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛 external action2R)s,i7d"Q;t _
return call_procedure('DB2INST1.ABC', char(parm1) ||','|| char(parm2), 'SAMPLE', 'DB2INST1', 'db2inst1'));]#U6W(v"~;p(w1m(j+V/K
DB20000I The SQL command completed successfully.TechWeb-技术社区/E @0f |*c9k1s._&h.B
select udf_withcall(30,40) from sysibm.sysdummy1
8q'i9S)s5k%j6C(j'u"n;y 1
1h6l&b7]-J#P6c程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛 -----------
8}"j4}3M&S'U&DTechWeb-技术社区 0程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛9S;U(U*u4N
1 record(s) selected.
F2T;]0X4]1P;g,H /* verify that the UDF has called the procedure and updated the table */
"m6x8Z%? S select * from c*y+f,\1o%X-g;n!q1_'w5R
A A1TechWeb-技术社区"E3N&c.K'z5I;l4r!x
----------- -----------TechWeb-技术社区,x%g f(z9^5]
10 20
1c+]0E7H!w;B7v0?TechWeb-技术社区 30 40程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛(@,I7t/o,X![
2 record(s) selected. 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛){;?;I0k6K)s
5z7_ g2R1j5O `程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛
5U&`:Q3~:s3F*[1_9o 构建例程
:C3P%F#a&O.D,F,?&k2O+w i;N9l/V
为了构建 C 例程(UDF 或 存储过程),必须首先对其进行预编译、编译以及链接。该过程可通过批文件 bldrtn (UNIX/LINUX 上)或 bldrtn.bat (Windows 上)自动完成,该文件包含在随 DB2 一同安装的样本中。可以在 UNIX/LINUX 上的 /sqllib/samples/c 目录或 Windows 上的 bldrtn [dbname userid password]
2w&|$_2k7k&m;e2p
1X2\9E#@'K&p*h#z0F-gTechWeb-技术社区6n$Z6B$g(d/N+V
如果未提供 dbname,那么批文件会将之默认为 SAMPLE ,而 userid 和 password 则被默认为当前会话的用户 ID 和口令。
|