zoukankan      html  css  js  c++  java
  • 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 文档。




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

  • 相关阅读:
    Ubuntu oracle SDK替换OpenJDK
    用update-alternatives管理java版本
    安卓配置
    CS 159: Advanced Topics in Machine Learning: Structured Prediction
    ros bag 代码操作
    vim 方式快捷编辑代码
    文件权限
    操作系统连不上网
    github权限管理
    nmap基本命令使用
  • 原文地址:https://www.cnblogs.com/zgqjymx/p/1972813.html
Copyright © 2011-2022 走看看