DB2 9 使用拓荒(733 测验)认证指南,第 9 部分: 用户定义的例程(4)

将定制的和巨大的营业逻辑集成到 SQL 语句中
developerWorks








内部用户定义函数

运用内部函数

经过议定以函数的编制引用内部法式,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 文档。




版权声明: 原创作品,允许转载,转载时请务必以超链接编制标明文章 原始理由 、作者信息和本声明。不然将清查法令责任。

原文地址:https://www.cnblogs.com/zgqjymx/p/1972813.html