网站首页  |   业界社区  |  电信社区  |  技术社区   |  极客社区  |  游戏社区  |  生活社区   |   科技博客  |   同事录
TechWeb-技术社区


标题: [推荐] 使用IBM DB2例程简化迁移的步骤
沙漠之狐
TW金牌会员
Rank: 6Rank: 6



UID 81206
精华 12
积分 1051
帖子 612
阅读权限 70
注册 2006-8-21
状态 离线
发表于 2008-7-28 12:18 资料 短消息 加为好友
使用IBM DB2例程简化迁移的步骤

当使用来自于不同供应商的不同数据库系统时,用户和数据库管理员将不可避免地碰到在这些产品中各不相同的特性和功能。通常,可在以下方面发现这些差异:
!p.d,r0x&s4S程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛
-i)h"s*D8?9K*B+x8Q4]        ◆受支持的 SQL 方言中的不同语法。
&g/B'^;O"x#d-z!{TechWeb-技术社区
6N%N(h2q%W%p;G7y$sTechWeb-技术社区        ◆数据库管理器应用程序界面。
8u.p'O H1Z,J+x
3w$x5]$N%?.s,E3D9r        ◆不同的管理工具及其用法。
2j:I7H3d*Q5s9B4Ntech.techweb.com.cn$V6L)j8y;D!U6Q"P$n
        为了使得将数据库和应用程序从 Oracle、Sybase 或 Microsoft SQL Server 等数据库产品迁移到 IBM DB2 ,Universal Database(UDB)更容易,本文将展示一些可行的 DB2 UDB 功能实现,而且这些功能在其他数据库系统中也可获得。这些实现将涉及创建存储过程和用户定义函数(UDF)以实现那些常常被请求的功能。程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛7W/Y)J5i9Q3d"M
TechWeb-技术社区!\3P,_5K,c(m:m2z
        在“下载”小节中,您将找到这些过程和函数的源代码以及包含了 CREATE PROCEDURE 和 CREATE FUNCTION 语句的 SQL 脚本。如果您对确切的实现细节很感兴趣,就请查阅这些代码。一旦编译并链接了源代码(或安装了预编译的库)以及在数据库中注册了这些过程和函数之后,您就可以按本文实例所演示的那样来使用它们了。另外值得注意的是,这些过程和函数可用于 DB2 UDB 版本 7 和版本 8。
:R.~$U.~0c)^"U0m+~9c5L8j#h9R&h&I/[
        清除表&O*u.?'W/H!Y;G)p9w,q:J
*}-n4s+a3[6M A7y*f5^
        当从 Oracle 迁移到 DB2 时,所碰到的一个普遍问题就是 TRUNCATE 命令。在 Oracle 中执行时,该命令不用借助一个或多个 DELETE 操作就可快速地清除表中所有内容, DELETE 操作需要进行大量的日志记录。程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛8e7a*[#_2y e1t.h7]
6L0m&S2h6h)y+v+g4f4J
        DB2 的 IMPORT 功能提供了完成相同功能的方法,只要使用 REPLACE INTO 子句以及将一个空文件指定为数据源。在该情况下,表中所有的行都将被快速清除并且只使用一条日志记录,接着就从给定的文件中导入新的数据。而对于一个空文件,就不会导入任何内容,从而在该操作结束时清除了该表。
#W'j/I(J9?7u
,G*n4K8x$J,p.O+N        要实现该功能,我们可以利用 DB2 定义的叫做 sqluimpr() 的 C API 函数来以程序的方式将数据导入数据库的表中。我们将这个 API 包装到存储过程中,以便可通过 SQL 接口用于所有的应用程序,而无需考虑编程的语言。清单 1 中展示了存储过程 TRUNCATE_TABLE 的签名。9T:L5e1E K-r![.j!w

+K3m U(K/D/i9M:q1o        清单1. 过程 TRUNCATE_TABLE的签名          >>--TRUNCATE_TABLE--(--schema_name--,--table_name--)--------><
.U,c+f1]6A3k-@tech.techweb.com.cn0\3n#V)i)K"G)|
tech.techweb.com.cn5v7g)o1?#~;L2[)t#T9U)E
        VARCHAR(130) 类型的参数 schema_name 指定模式,用以在其中找到表。如果模式名外加了双引号,就将其看成定界名称(混合大小写的和特殊的字符)。如果模式名为 空 ,即未指定模式,那么则要查阅 CURRENT SCHEMA 专用寄存器来确定所要使用的模式。 VARCHAR(130) 类型的参数 table_name指定将被清除的表的未限定名称。加上显式或隐式定义的模式名就可惟一地识别出表。如果表名外加了双引号,就将其看成定界名称(混合大小写的和特殊的字符)。TechWeb-技术社区7\+X;f)z(d3_!l%o

6{+x'd!T.r!x4R        如果输入参数 schema_name 为 空 ,则由该过程的逻辑来确定默认模式。否则,就删除现有模式名上的双引号,或者将未加引号的模式名转换为大写体。对于表名同样如此,比如最后表名上的双引号会被删除,或者未加引号的表名会被转换为大写体。接着,我们通过查询 DB2 目录视图 SYSCAT.TABLES 来证实该表是否存在。现在就可以启动导入了。先准备好必要的参数,其中使用的文件是 /dev/null(Windows 上的 NUL 文件),因为它总是存在并且不包含任何内容,也就是可用作数据源的空文件。同样,/dev/null(Windows 上的 NUL 文件)将用于进行导入所需的消息文件。如果成功地启动了导入,该过程就会成功返回。如果碰到错误,则与消息文本一起返回 SQLSTATE 以指示错误。清单 2 演示了过程 TRUNCATE_TABLE 的执行。可以在“下载”小节中找到该脚本( truncate_example.db2)的源代码。

引用 回复 顶部
沙漠之狐
TW金牌会员
Rank: 6Rank: 6



UID 81206
精华 12
积分 1051
帖子 612
阅读权限 70
注册 2006-8-21
状态 离线
发表于 2008-7-28 12:26 资料 短消息 加为好友
清单2. 测试过程 TRUNCATE_TABLE          /* create and insert some values into the table tab1 */
1V+[6Y&z1K:|1t9U          CREATE TABLE tab1 (col1 INTEGER NOT NULL PRIMARY KEY, col2 VARCHAR(15) )
!~!b5x7\$I          DB20000I The SQL command completed successfully.程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛:]5F)T7x(W
          INSERT INTO tab1 VALUES ( 1, 'some data' ), ( 2, NULL )
(I9m-j-f/|-|/B'X6DTechWeb-技术社区          DB20000I The SQL command completed successfully.TechWeb-技术社区:a6}+`.A6Y$U9H:P&O3}
          /* verify the current contents of table tab1 */TechWeb-技术社区3j;M8p1v9G)U.M!u
          SELECT * FROM tab1
:E/G8z1Z9i+O"z          COL1 COL25|9]5n!q8S"O |0`$o(U
          ----------- ---------------3C2J;T-D#n.E"I
          some data
:o.V |!u-h$X2~tech.techweb.com.cn          -TechWeb-技术社区+U*V3X,E2K2a'w/V
          record(s) selected.
+d,M*r9x7]5F'A          /* Call the truncate stored procedure for the DB2INST1 schema, and the table tab1 */程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛([0Q7c-p9F+p,u;]
          CALL truncate('DB2INST1', 'tab1')
*E7z-w0|5l&f(ETechWeb-技术社区          Return Status = 0程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛$v2e C3H1C;m2c%H
          /* Verify that the table contents have been truncated. */9x'T2h!V*Z6|2s-c0Z:?"?-J
          SELECT * FROM tab1
"K6_)p)_8d$Xtech.techweb.com.cn          COL1 COL2.a9Y1l1L+@&U-z2s)X
          ----------- ---------------
#r%y)E%d5T,i6\$D/A6q          record(s) selected.
!t.n5s9X-s.t'{9C          /* Insert some new values into the tab1 table */
%V8[1P#]+i*O.Z          INSERT INTO tab1 VALUES ( 2, 'some new data' ), ( 3, NULL )+v6A:R3r&G'h2W.w
          DB20000I The SQL command completed successfully.
8F7r9o+O"|+e          SELECT * FROM tab17s:p/a0Q1S0T#^:~9e2D
          COL1 COL2
8{3^&?)A2{5_%P5?!~0l程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛          ----------- ---------------
3O.m2E.k7Y7^*L1e4w程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛          some new data
%_9H-{"|*y#K          -
;y1R%R7[)v*u.Z'W          record(s) selected. ~9X&a7A#`6E;@
          /* Call the truncate procedure with a NULL schema */4m5E8P2s(S6@
          CALL truncate(NULL, 'tab1')$c8J&C;x*l'c3y(X
          Return Status = 0程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛4N'^.Q4i+s3c%d)s
          /* Verify that the table contents have been truncated. */
,O$~3~.t-i0Q;f"I          SELECT * FROM tab1
8G,Z;j"y4}4X%t:o4Ytech.techweb.com.cn          COL1 COL2程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛!O7C3w l)Q'S
          ----------- ---------------程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛1a$l*Q:?)v+I
          record(s) selected.&n&{.C.l6y S2x
          Sybase 的 host_name 函数
-z+a7Q%}*~3V&u(E程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛
'M,I5p5S P)j*O1f程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛(F5L2P2N6y9^
        Sybase 数据库中的 host_name( ) 函数返回的是 客户机进程(非 Adaptive Server 进程)的当前主机名,也就是运行该应用程序的计算机的主机名而非数据库服务器的主机名。
*X-Q&K%a-A/X%?/_(a2Ltech.techweb.com.cn
/t'e$l6X+k        清单3.中展示了用户定义函数 HOST_NAME 的签名。          >>--HOST_NAME--( )-------------><
1x'G1E7E:T&vTechWeb-技术社区*N(\8?(z)q

,]6}.u6t%i1s-B+d;j        该函数访问存储在 DBINFO 结构中的应用程序 ID 并解码客户机的 IP 地址(它是应用程序 ID 的一部分)。然后便使用 C 库函数“gethostbyaddr”来解析该 IP 地址的名称,该函数在必要时将访问名称服务器或其他源(比如 /etc/hosts)。
9p)z&|3V,e0j1^1i5V#^
"n.M5`7G;A1X3y3K.y程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛        IP 地址是应用程序 ID 中前面 8 字节的编码,或者使用 "*LOCAL" 来代表本地连接。对于本地连接,解析的是 IP 地址为 127.0.0.1 的主机名。tech.techweb.com.cn(d'x*O(L3[%J
tech.techweb.com.cn2A.i*@#J+m,~
        注意:!~3^1n$C6V)U(d
;z0`7t:V0a.d'\7y#f
        由于 DRDA 的需求,如果非本地 IP 地址的第一个字符初始为‘0’到‘9’,就将之映射到字母‘G’到‘P’。而在该名称查找之前,要将该映射反过来进行。

引用 回复 顶部
沙漠之狐
TW金牌会员
Rank: 6Rank: 6



UID 81206
精华 12
积分 1051
帖子 612
阅读权限 70
注册 2006-8-21
状态 离线
发表于 2008-7-28 12:26 资料 短消息 加为好友
清单4. 演示了 HOST_NAME 函数的执行。可以在“下载”小节中找到该脚本 host_name_example.db2 的源代码。程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛&p U)Z5z5r

*x9}%E _9W7_/m)n&C程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛        清单4. 测试函数 HOST_NAME( )
)a;M;O%B&d-]2a2j
9^:P+`4a%e+B%~3wtech.techweb.com.cn        下面这个例子测试演示了用以获取本地连接主机名的函数的执行。tech.techweb.com.cn+~3])i;N$o.\1I

#Z5_3s4a(]TechWeb-技术社区        在该场景中,DB2 数据库驻留在一个本地 AIX 机器上。
1G"[0?5g,x%}
.P/`'`4k*n%[ h        地址 127.0.0.1 在 /etc/hosts 文件中被映射到计算机名 demoaix:          /* connect to the local database */
%w:e(}4u5n&i"B%K4M程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛          connect to sample$n'f-|4u4i$~
          Database Connection Information
&}7@)v(b%H)O7e0U1J程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛          Database server = DB2/6000 8.1.2程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛4A$l"T*R%d&d"Q m.m
          SQL authorization ID = DB2INST1(H8h2W%~!r
          Local database alias = SAMPLE
&C/c1r*d9`!{          /* execute the host_name function */&t%E+\,G)j"J,x7g1z i/C4}
          values host_name()"(F1J9t6~7X;p*]+j%j6J
          1
/t/g&Y0x1@#x&Y't程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛          ------------------------------------------------
$J(K;`8C%y$X0G8TTechWeb-技术社区          demoaix程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛2~/A)s+U0J5b)w&d%K6Z
          1 record(s) selected.
8@!M"D2y-G%W.stech.techweb.com.cn
+C$q+D5i;y/e"B9w8Z3r)rTechWeb-技术社区1G&u+l;Q;u6r+Y
        下一个例子测试演示了远程连接上的函数的执行。
4i4Y;M#f4S)p+d,v-i2w!k4B
        在该场景中,DB2 数据库与上面一样驻留在同一 AIX 机器上。程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛*C-M#\7x(]1y2F5p

*L.r9})l(w r7y        到 AIX 上数据库的连接是由一个 Windows 2000 客户机建立的;
!{%S0|7Y$k1M/`5]TechWeb-技术社区+I5|5^ x8e)_9K
        该客户机的名字为 mycomputer。          /* The database samplaix is an alias for the SAMPLE database on AIX */%{:b5k2b4^3V;p3M"?
          connect to samplaix
5l!{"i U+w%w/t;m:N5T          Database Connection Information)K&Z0b.B;D$M"a(G
          Database server = DB2/6000 8.1.2!T0L3~7{*E
          SQL authorization ID = DB2INST15y%l,a(L6O+c*r
          Local database alias = SAMPLAIXTechWeb-技术社区8X!^/v Q,t.X8V1R3Z
          /* execute the host_name UDF against the remote database 鈥?
,[6^,L'{(] C+~          it returns the name of the computer of the client connection */
/S+e;`"E#J2p'`8]$g;@ Z          values host_name()&z(O;f0M!s)b
          1tech.techweb.com.cn0x*l*B3k2a*?1Q0b6g&v
          ------------------------------------------------TechWeb-技术社区*K6m!o7Q/j4p*_
          mycomputer
-P6E+v'\$@"e
&X%^-^1w3N$Rtech.techweb.com.cn程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛-O"v.G0P3I
        通过触发器或用户定义函数调用存储过程的 UDFTechWeb-技术社区8m;T)c,J4n T;x&D(r
tech.techweb.com.cn!B0r(Q5h8_ ^,z5B7I&|)w
        当迁移到 DB2 时,碰到的另一个普遍问题就是其他 RDBMS 可以通过触发器或函数调用存储过程。虽然 DB2 已经承诺在未来版本中包含该功能,但是我们将展示如何使用 DB2 的当前版本来实现该功能,即通过创建一个将对存储过程发出调用的 UDF 来实现。%_4q0|#M&X8x

3} D!_$N/O        清单5.中展示了用于该目的的用户定义函数 CALL_PROCEDURE 的签名。程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛:p(q"` g n

7C*X$K-~&k7`5V!Stech.techweb.com.cn        清单 5. 用户定义函数 CALL_PROCEDURE 的签名          >>--CALL_PROCEDURE--(--procedure_name--,--parameter_list--,----->0e+b(L+Z9V%k3q1E6r
        >-----database_name--,--user_name--,--password--)------------->< tech.techweb.com.cn"x(p4~6c:y+C)F"]

%U l1s5c%{:m-@/c8b程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛 ^(z1K5X5H)t9G#y
        VARCHAR(257) 类型的参数 procedure_name 指定要被调用的存储过程的全限定名 —— 在传递多个参数时,要用逗号进行分隔。该字符串将被粘贴到用于调用过程的 CALL 语句中,因此其语法需要符合 SQL CALL 语句的要求。 VARCHAR(8) 类型的参数 database_name 指定要执行该存储过程的数据库的别名。存储过程不一定要驻留在同一数据库中。 VARCHAR(128) 类型的参数 user_name 和 VARCHAR(200) 类型的参数 password 用于确定连接数据库以及执行该过程时所使用的注册信息。
+w9n8q3}+M P.W3j1Rtech.techweb.com.cn
;e)c*f6t;h-M,Q*c'E        该函数调用当前数据库中的存储过程。它建立新的连接之后就通过过程名和作为输入参数而提供的参数来执行 CALL 语句。该 UDF 返回 0(零)表明 CALL 语句(以及相应的 CONNECT 和 CONNECT RESET 语句)执行成功。否则,将返回 DB2 命令行处理器(Command Line Processor,CLP)的返回码和一条提供了更多信息的出错消息。清单 6 演示了函数 CREATE_PROCEDURE 的执行。可以在“下载”小节中找到该脚本( trig_calls_proc.db2)的源代码。

引用 回复 顶部
沙漠之狐
TW金牌会员
Rank: 6Rank: 6



UID 81206
精华 12
积分 1051
帖子 612
阅读权限 70
注册 2006-8-21
状态 离线
发表于 2008-7-28 12:27 资料 短消息 加为好友
清单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 和口令。

引用 回复 顶部
查看积分策略说明快速回复主题
选项 标题 Smilies
禁用 URL 识别
禁用 Smilies
禁用 Discuz!代码
使用匿名发帖
使用个人签名
接收新回复邮件通知
内容





当前时区 GMT+8, 现在时间是 2008-12-3 07:08
京ICP证060517号

本论坛支付平台由支付宝提供
携手打造安全诚信的交易社区 Powered by Discuz! 5.5.0 © 2001-2008 Comsenz Inc.
Processed in 0.076679 second(s), 8 queries

清除 Cookies - 联系我们 - TechWeb.com.cn - Archiver - WAP