将定制的和巨大的营业逻辑集成到 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 文档。
版权声明:
原创作品,允许转载,转载时请务必以超链接编制标明文章 原始理由 、作者信息和本声明。不然将清查法令责任。