DB2 9 使用拓荒(733 测验)认证指南,第 9 部分: 用户定义的例程(4)
将定制的和巨大的营业逻辑集成到 SQL 语句中
![]()
内部用户定义函数
运用内部函数
经过议定以函数的编制引用内部法式,SQL 语句可以变得很弱小。经过议定运用 C 和 Java 等编程措辞编写函数,可以实行特殊很是初级的使命,比方字符串垄断,这些使命正本可以需求在一个 SQL UDF 中运用多个(看上去比较隐晦的)SQL 语句。其余,还可以在这些编程措辞中处置内部数据源或许实行内部勾当。
内部函数可以定义为以两种差别的形式运转,一种是 NOT FENCED 形式 —— 也即是说在数据库引擎中运转,另一种是 FENCED 形式 —— 也即是说在数据库引擎之外的内存中运转。运用 NOT FENCED 函数的好处是,它与数据库引擎共享内存,可以更快地与数据库引擎通讯。但是,如果没有正确地编写 NOT FENCED 函数,那么可以出现内存漏洞。如果是这样,内存漏洞会末尾掩盖与 DB2 引擎相干的内存,这会形成一些恶劣的影响,比方使 DB2 解体。如果是编写 C 或 C 函数,那么剧烈建议将函数编写为 FENCED 函数,而且在决议将它们从新创设为 NOT FENCED 之前举行少量的练习。
![]()
![]()
![]()
![]()
回页首
创设内部函数
清单 19 表现了注册内部函数的一个简化语法图:
清单 19. 注册内部标量函数的语法图
>>-CREATE FUNCTION--function-name------------------------------->
>--(-- ---------------------------------------------------- --)-->
| .-,----------------------------------------------. |
| V | |
'--- ---------------- --data-type1-- ------------ - -'
'-parameter-name-' '-AS LOCATOR-'
>--*------------------------------------------------------------>
>--RETURNS-- -data-type2-- ------------ ------------------------ -->
| '-AS LOCATOR-' |
'-data-type3--CAST FROM--data-type4-- ------------ -'
'-AS LOCATOR-'
>--*-- ------------------------- --*---------------------------->
'-SPECIFIC--specific-name-'
>--EXTERNAL-- ---------------------- --*------------------------>
'-NAME-- -'string'--- -'
'-identifier-'
>--LANGUAGE-- -C---- -------*----------------------------------->
-JAVA-
-CLR--
'-OLE--'
.-NOT DETERMINISTIC-.
>--PARAMETER STYLE-- -DB2GENERAL- --*--------------------------->
-JAVA-------
'-SQL--------'
.-NOT DETERMINISTIC-.
>-- ------------------------------ --*-- ------------------- --->
'-PARAMETER CCSID-- -ASCII--- -' '-DETERMINISTIC-----'
'-UNICODE-'
.-FENCED------------------------.
>--*-- ------------------------------- --*---------------------->
-FENCED--*-- -THREADSAFE----- -
| '-NOT THREADSAFE-' |
| .-THREADSAFE-. |
'-NOT FENCED--*-- ------------ -'
.-RETURNS NULL ON NULL INPUT-. .-READS SQL DATA-.
>-- ---------------------------- --*-- ---------------- --*----->
'-CALLED ON NULL INPUT-------' -NO SQL---------
'-CONTAINS SQL---'
.-STATIC DISPATCH-. .-EXTERNAL ACTION----.
>-- ----------------- --*-- -------------------- --*------------>
'-NO EXTERNAL ACTION-'
.-NO SCRATCHPAD----------. .-NO FINAL CALL-.
>-- ------------------------ --*-- --------------- --*---------->
| .-100----. | '-FINAL CALL----'
'-SCRATCHPAD-- -------- -'
'-length-'
.-NO DBINFO-.
>-- ------------------- --*-- ----------- --*------------------->
-ALLOW PARALLEL---- '-DBINFO----'
'-DISALLOW PARALLEL-'
在上一节中,您曾经看到了 CREATE FUNCTION 语句中最重要的组成部分。着实,尚有一些组成部分是内部函数特有的:
LANGUAGE: 指定用于编写函数的措辞。可用于编写内部函数的措辞有 C、Java 措辞、CLR 和 OLE。PARAMETER STYLE: 该子句用于指定函数传递参数和前去值的约定。EXTERNAL ACTION: 确定该函数可否可以实行内部勾当。SCRATCHPAD: 高速暂存(scratchpad)用作在函数调用间隙存储数据的一个内存块。FINAL CALL: 用于开释函数所占用的内存,并实行其他清理勾当。
要见解探问更多关于 CREATE FUNCTION 语句的这些子句和其他子句的信息,请参阅 DB2 文档。
![]()
![]()
![]()
![]()
回页首
内部函数例子
清单 20 是一个注册名为 NTEST1 的标量用户定义函数(用 C 编写)的例子:
清单 20. 注册一个内部标量 C 函数
CREATE FUNCTION ntest1 (SMALLINT)
RETURNS SMALLINT
EXTERNAL NAME 'ntest1!nudft1'
LANGUAGE C
PARAMETER STYLE SQL
DETERMINISTIC
NOT FENCED
NULL CALL
NO SQL
NO EXTERNAL ACTION
该函数接纳一个 SMALLINT 类型的输入参数,并前去一个 SMALLINT 值。函数体中没有运用 SQL。需求寄望的是,无论函数中实践的 C 代码可否经过正确的编译,发生的库(DLL)文件可否被放在恰当的职位地方,下面的 CREATE FUNCTION 语句都会乐成地实行。 如果库文件没有放在恰当的职位地方,此时若实行上述函数,虽然函数能注册乐成,但是会收到一个错误,标明没有创作发明函数库。由于这个启事,在运用内部函数时,必需遵循正确的步调编译函数,将函数库放入恰当的职位地方,并运用 CREATE FUNCTION 语句注册函数。欲取得更多关于这些步调的信息,请参阅 DB2 文档。
版权声明:
原创作品,允许转载,转载时请务必以超链接编制标明文章 原始理由 、作者信息和本声明。不然将清查法令责任。

浙公网安备 33010602011771号