DB2 针对 CLI 应用程序的标量函数介绍

概述

在数据库应用开发中不可避免会遇到大量的函数需求,而在 DB2 中提供了以下函数,它由 ODBC 通过供应商转义子句(vendor escape clauses)定义。可以使用转义子句语法或调用等价的 DB2 函数来调用每一个函数。

这些函数可划分为以下几类:

  • 字符串函数
  • 数值函数
  • 日期和时间函数
  • 转换函数

以下小节提供了若干表格,展示了从使用 DB2 CLI 的应用程序中调用这些函数时,哪些服务器(及最早版本)可以支持这些函数访问。

当连接到 DB2 Version 5 或更高版本时,以下函数检测到的所有错误将返回 SQLSTATE 38552。消息的文本部分采用 SYSFUN:nn 的形式,其中 nn 表示以下错误原因的代码:

  • 01 数字值超出范围
  • 02 除数为 0
  • 03 算法溢出或下溢
  • 04 数据格式无效
  • 05 时间格式无效
  • 06 时间戳格式无效
  • 07 时间戳持续时间(timestamp duration)的字符表示无效
  • 08 时间间隔类型无效(必须为 1、2、4、8、16、32、64、128、256 中的一个)
  • 09 字符串太长
  • 10 字符串函数中的长度或位置超出范围
  • 11 浮点数的字符表示无效

    字符串函数

    本节介绍的字符串函数受 DB2 CLI 支持并由 ODBC 通过供应商转义子句定义。

    • 充当标量函数参数的字符串字母必须使用单引号括起。
    • 使用 String_exp 表示的参数可以是列名、一串字符或者另一标量函数的结果,其中底层数据类型可表示为 SQL_CHAR、SQL_VARCHAR、SQL_LONGVARCHAR 或 SQL_CLOB。
    • 使用 start、length、code 或 count 表示的参数可以是数字字符或其他标量函数的结果,其中底层数据类型基于整型(SQL_SMALLINT、SQL_INTEGER)。
    • 字符串中第一个字符串的位置为位置 1。

    表 1. 字符串标量函数
    字符串标量函数 说明 支持该函数的服务器
    ASCII( string_exp ) 将 string_exp 的最左侧字符的 ASCII 码值作为整数返回。 面向工作站的 DB2
    CHAR( code ) 返回其 ASCII 码值由 code 指定的字符。Code 的值应该介于 0 和 255 之间;否则,返回空值。 面向工作站的 DB2
    CONCAT( string_exp1, string_exp2 ) 返回将 string_exp2 连接到 string_exp1 后产生的字符字符串。 面向工作站、MVS、VM/VSE、AS/400 的 DB2
    DIFFERENCE( string_exp1, string_exp2 ) 返回一个整数值,该值表示 SOUNDEX 函数针对 string_exp1 和 string_exp2 的返回值之间的差异。 面向工作站、AS/400 的 DB2
    INSERT( string_exp1, start, length, string_exp2 ) 返回一个字符字符串,使用包含 length 个字符的 string_exp2 代替从 start 开始的 length 个字符。 面向工作站、MVS、VM/VSE、AS/400 的 DB2
    LCASE( string_exp ) 将 string_exp 中的所有大写字符转换为小写字符。 面向工作站、MVS、VM/VSE 的 DB2
    LEFT( string_exp,count ) 返回 string_exp 最左侧的 count 个字符。 面向工作站、MVS、VM/VSE、AS/400 的 DB2
    LENGTH( string_exp ) 返回 string_exp 中的字符数量,不包括结尾空白和字符串终止符。注意:在面向 MVS/ESA 的 DB2 中包含结尾空白。 面向工作站、MVS、VM/VSE、AS/400 的 DB2
    LOCATE( string_exp1, string_exp2 [ ,start ]) 返回在 string_exp2 内 string_exp1 首次出现的初始位置。如果没有指定可选参数 start,则从 string_exp2 的第一个字符处开始搜索string_exp1 首次出现的位置。如果指定了 start 的值,将从 start 值指定的字符位置开始搜索。string_exp2 中的第一个字符位置使用值 1 表示。如果在 string_exp2 中没有找到 string_exp1,则返回 0。 面向工作站、MVS、AS/400 的 DB2
    LTRIM( string_exp ) 返回 string_exp 的字符,同时删除前导空白。 面向工作站、MVS、AS/400 的 DB2
    REPEAT( string_exp, count ) 返回由 string_exp 构成的重复了 count 次的字符字符串。 面向工作站、MVS、VM/VSE、AS/400 的 DB2
    REPLACE( string_exp1, string_exp2, string_exp3 ) 使用string_exp3 替换 string_exp1 中出现的所有 string_exp2。 面向工作站、MVS 的 DB2
    RIGHT( string_exp, count ) 返回string_exp 中最右侧的 count 个字符。 面向工作站、MVS、VM/VSE、AS/400 的 DB2
    RTRIM( string_exp ) 返回 string_exp 的字符并删除结尾空白。 面向工作站、MVS、VM/VSE、AS/400 的 DB2
    SOUNDEX( string_exp1 ) 返回一个 4 字符代码表示 string_exp1 的发音。注意,不同的数据源使用不同的算法表示 string_exp1 的发音。 面向工作站、AS/400 的 DB2
    SPACE( count ) 返回由 count 个空格组成的字符字符串。 面向工作站、MVS、AS/400 的 DB2
    SUBSTRING( string_exp, start, length ) 返回 string_exp 中的一个字符字符串,该字符串由从 start 指定的字符处开始的 length 个字符组成。 面向工作站、MVS、VM/VSE 、AS/400 的DB2
    UCASE( string_exp ) 将 string_exp 中的所有小写字符转换为大写字符。 面向工作站、MVS、VM/VSE 、AS/400 的 DB2

    数值函数

    本节介绍的数值函数受 DB2 CLI 支持并由 ODBC 通过供应商转义子句定义。

    • 使用 numeric_exp 表示的参数可以为列名、另一标量函数的结果或一个数字字符,其中底层数据类型可以基于浮点型(SQL_NUMERIC、SQL_DECIMAL、SQL_FLOAT、SQL_REAL、SQL_DOUBLE),也可以基于整型(SQL_SMALLINT, SQL_INTEGER)。
    • 使用 double_exp 表示的参数可以是列名、另一标量函数的结果或一个数字值,其中底层数据类型可以基于浮点型。
    • 使用 integer_exp 表示的参数可以是列名、另一标量函数的结果或一个数字字符,其中底层数据类型基于整型。

    表 2. 数值标量函数
    数值标量函数 说明 支持该函数的服务器
    ABS( numeric_exp ) 返回 numeric_exp 的绝对值 面向工作站、MVS、AS/400 的 DB2
    ACOS( double_exp ) 返回弧度为 double_exp 的角的反余弦。 面向工作站、MVS、AS/400 的 DB2
    ASIN( double_exp ) 返回弧度为 double_exp 的角的反正弦。 面向工作站、MVS、AS/400 的 DB2
    ATAN( double_exp ) 返回弧度为 double_exp 的角的反正切。 面向工作站、MVS、AS/400 的 DB2
    ATAN2( double_exp1, double_exp2 ) 返回弧度分别为 double_exp1 和 double_exp2 的 x 和 y 坐标的反正切。 面向工作站、MVS、AS/400 的 DB2
    CEILING( numeric_exp ) 返回大于或等于 numeric_exp 的最小整数。 面向工作站、MVS、AS/400 的 DB2
    COS( double_exp ) 返回 double_exp 的余弦,其中 double_exp 是使用弧度表示的角。 面向工作站、MVS、AS/400 的 DB2
    COT( double_exp ) 返回 double_exp 的余切,其中 double_exp 是使用弧度表示的角。 面向工作站、MVS、AS/400 的 DB2
    DEGREES( numeric_exp ) 返回对 numeric_exp 弧度换算后的度数。 面向工作站、MVS、AS/400 的 DB2
    EXP( double_exp ) 返回 double_exp 的指数值。 面向工作站、MVS、AS/400 的 DB2
    FLOOR( numeric_exp ) 返回小于或等于 numeric_exp 的最大整数。 面向工作站、MVS、AS/400 的 DB2
    LOG( double_exp ) 返回 double_exp 的自然对数。 面向工作站、MVS、AS/400 的 DB2
    LOG10( double_exp ) 返回 double_exp 以 10 为基数的对数。 面向工作站、MVS、AS/400 的 DB2
    MOD( integer_exp1, integer_exp2 ) 返回 integer_exp1 被 integer_exp2 除的余数(模数)。 面向工作站、MVS、AS/400 的 DB2
    PI() 以浮点值形式返回 pi 的常量值。 面向工作站、MVS、AS/400 的 DB2
    POWER( numeric_exp, integer_exp ) 返回 numeric_exp 的 integer_exp 次幂的值。 面向工作站、MVS、AS/400 的 DB2
    RADIANS( numeric_exp ) 返回由 numeric_exp 度数换算得到的弧度值。 面向工作站、MVS、AS/400 的 DB2
    RAND( [integer_exp ] ) 使用 integer_exp 作为种子值返回一个随机浮点值。 面向工作站、MVS、AS/400 的 DB2
    ROUND( numeric_exp, integer_exp. ) 返回将 numeric_exp 四舍五入到小数点右边第 integer_exp 位后的值。如果 integer_exp 为负数,则将 numeric_exp 四舍五入到小数点右边第 |integer_exp| 位。 面向工作站、MVS、AS/400 的 DB2
    SIGN( numeric_exp ) 返回 numeric_exp 的指示符或正负号。如果 numeric_exp 小于 0,则返回 -1。如果numeric_exp 等于 0,则返回 0。如果 numeric_exp 大于 0,则返回 1。 面向工作站、MVS、AS/400 的 DB2
    SIN( double_exp ) 返回 double_exp 的正弦,其中 double_exp 是以弧度表示的角。 面向工作站、MVS、AS/400 的 DB2
    SQRT( double_exp ) 返回 double_exp 的平方根。 面向工作站、MVS、AS/400 的 DB2
    TAN( double_exp ) 返回 double_exp 的正切,其中 double_exp 是以弧度表示的角。 面向工作站、MVS、AS/400 的 DB2
    TRUNCATE( numeric_exp, integer_exp ) 返回将 numeric_exp 截至小数点右第 integer_exp 位后的值。如果 integer_exp 为负数,则将 numeric_exp 截至小数点左边第 |integer_exp| 位。 面向工作站、MVS、AS/400 的 DB2

    日期和时间函数

    本节介绍的日期和时间函数受 DB2 CLI 支持并由 ODBC 通过供应商转义子句定义。

    • 使用 timestamp_exp 表示的参数可以是列名、另一标量函数的结果,或者是某个时间、日期或时间戳字符。
    • 使用 date_exp 表示的参数可以是列名、另一标量函数的结果,或是日期或时间戳字符,其中底层数据类型可以基于字符,或者基于日期或时间戳。
    • 使用 time_exp 表示的参数可以是列名、另一标量函数的结果,或是时间或时间戳字符,其中底层数据类型可以基于字符,也可以基于时间或时间戳。

    表 3. 日期和时间标量函数
    日期和时间标量函数 说明 支持该函数的服务器
    CURDATE() 以日期值形式返回当前日期。 面向工作站、MVS、VM/VSE、AS/400 的 DB2
    CURTIME() 以时间值形式返回当前的本地时间。 面向工作站、MVS、VM/VSE、AS/400的 DB2
    DAYNAME( date_exp ) 返回一个字符字符串,其中包含 date_exp 的日期部分表示的星期名(星期日、星期一、星期二、星期三、星期四、星期五、星期六)。 面向工作站的 DB2
    DAYOFMONTH ( date_exp ) 返回 date_exp 内表示一月中某一天的值,使用 1-31 中的整数值表示。 面向工作站、MVS、VM/VSE、AS/400 的 DB2
    DAYOFWEEK( date_exp ) 返回 date_exp 内表示一周内某一天的值,使用 1-7 中的整数值表示,其中 1 表示星期日。 面向工作站、AS/400 (3.6) 的 DB2
    DAYOFWEEK_ISO( date_exp ) 返回 date_exp 内表示一周之内某一天的值,使用 1-7 中的整数值表示,其中 1 表示星期一。 注意该函数与 DAYOFWEEK() 函数之间的区别,后者使用 1 表示星期日。 面向工作站、MVS、AS/400 的 DB2
    DAYOFYEAR( date_exp ) 返回 date_exp 内表示一年内某一天的值,使用 1-366 中的整数值表示。 面向工作站、AS/400 的 DB2
    HOUR( time_exp ) 返回 time_exp 中的时刻,使用 0-23 中的整数值表示。 面向工作站、MVS、VM/VSE、AS/400 的 DB2
    JULIAN_DAY( date_exp ) 返回 date_exp 和公元前 4712 年 1 月 1 日(儒略日期历法的起始时间)之间间隔的天数。 面向工作站、AS/400 的 DB2
    MINUTE( time_exp ) 返回 time_exp 内表示的分钟,使用 0-59 中的整数值表示。 面向工作站、MVS、VM/VSE、AS/400 的 DB2
    MONTH( date_exp ) 返回 date_exp 内表示的月份,使用 1-12 中的整数值表示。 面向工作站、MVS、VM/VSE、AS/400 的 DB2
    MONTHNAME( date_exp ) 返回一个字符字符串,其中包含 date_exp 的月份部分表示的月份名(一月、二月、三月、四月、五月、六月、七月八月、九月、十月、十一月、十二月)。 面向工作站的 DB2
    NOW() 以时间戳值的形式返回当前的日期和时间。 面向工作站、MVS、VM/VSE、AS/400 的 DB2
    QUARTER( date_exp ) 返回 date_exp 中表示的季度,使用 1-4 中的整数值表示。 面向工作站、AS/400 的 DB2
    SECOND( time_exp ) 返回 time_exp 中表示的秒,使用 1-59 中的整数值表示。 面向工作站、MVS、VM/VSE、AS/400 的 DB2
    SECONDS_SINCE_MIDNIGHT( time_exp ) 返回 time_exp 中相对于午夜的秒数,使用 0-86400 中的整数值表示。如果 time_exp 包括秒的小数部分,则将去掉小数部分。 面向工作站的 DB2
    TIMESTAMPADD( interval, integer_exp, timestamp_exp ) 向 timestamp_exp 添加类型为 interval、值为 integer_exp 的时间间隔,返回计算得到的时间戳。有效的时间间隔值包括:
    • SQL_TSI_FRAC_SECOND
    • SQL_TSI_SECOND
    • SQL_TSI_MINUTE
    • SQL_TSI_HOUR
    • SQL_TSI_DAY
    • SQL_TSI_WEEK
    • SQL_TSI_MONTH
    • SQL_TSI_QUARTER
    • SQL_TSI_YEAR
    其中秒的小数部分使用十亿分之一秒的级别表示。如果 timestamp_exp 指定了一个时间值,并且 interval 指定了天数、周数、月份数、季度数或年数,则在计算结果时间戳之前,timestamp_exp 的日期部分将设置为当前日期。如果 timestamp_exp 是一个日期值,并且 interval 指定了秒的小数部分、秒数、分钟数或小时数,则在计算结果时间戳之前,timestamp_exp 的时间部分将设置为 00:00:00.000000。通过使用 SQL_TIMEDATE_ADD_INTERVALS 选项调用SQLGetInfo(),应用程序可以确定支持哪些时间间隔。
    面向工作站的 DB2
    TIMESTAMPDIFF( interval, timestamp_exp1, timestamp_exp2 ) 返回 interval 类型的时间间隔的整数值,其中 timestamp_exp2 大于 timestamp_exp1。有效的时间间隔值包括:
    • SQL_TSI_FRAC_SECOND
    • SQL_TSI_SECOND
    • SQL_TSI_MINUTE
    • SQL_TSI_HOUR
    • SQL_TSI_DAY
    • SQL_TSI_WEEK
    • SQL_TSI_MONTH
    • SQL_TSI_QUARTER
    • SQL_TSI_YEAR
    其中秒的小数部分使用十亿分之一秒的级别表示。如果其中任一个时间戳表示为一个时间值,并且 interval 指定了天数、周数、月份数、季度数或年数,则在计算时间戳之差前,时间戳的日期部分将设置为当前日期。如果其中任一个时间戳表示是一个日期值,并且 interval 指定了秒的小数部分、秒、分和小时,则在计算时间戳之差以前,时间戳的时间部分将设置为 0。通过使用 SQL_TIMEDATE_DIFF_INTERVALS 选项调用 SQLGetInfo(),应用程序可以确定支持哪些时间间隔。
    面向工作站的 DB2
    WEEK( date_exp ) 返回 date_exp 中一年之内的某一周,使用 1-54 中的整数值表示。 面向工作站、AS/400 的 DB2
    WEEK_ISO( date_exp ) 返回 date_exp 中表示一年内某一周,使用 1-53 中的整数值表示。第一周被定义为一年之中包含星期四的第一个星期。因此,第一周就是包含 1 月 4 日的第一个星期,因为星期一被认为是一周的第一天。 注意,WEEK_ISO() 不同于当前定义的 WEEK(),后者返回的最大值为 54。对于 WEEK() 函数,一年之中的第一周指包含第一个星期六的星期,相当于包含1月1日的星期,即使这一星期只包含一天。 面向工作站的 DB2
    YEAR( date_exp ) 返回 date_exp 中表示某一年的值,使用 1-9999 中的整数值表示。 面向工作站、MVS、VM/VSE、AS/400 的 DB2

    对于返回的字符字符串中包含星期名或月份名的函数,将对这些字符字符串启用国家语言支持(National Language Support)。对于在 DB2 Version 7 或更高版本中创建的数据库,将自动获得 DAYOFWEEK_ISO() 和 WEEK_ISO() 支持。如果数据库使用 Version 7 之前的版本创建,则无法使用这些函数。要在这类数据库中使用 DAYOFWEEK_ISO() 和 WEEK_ISO() 函数,需要使用 db2updb 系统命令。


    系统函数

    本节介绍的系统函数受 DB2 CLI 支持并由 ODBC 通过供应商转义子句定义。

    • 使用 exp 表示的参数可以是列名、另一标量函数的结果或是一个字符。
    • 使用 value 表示的参数可以是一个字面常量。

    表 4. 系统标量函数
    系统标量函数 说明 支持该函数的服务器
    DATABASE() 返回与连接句柄(connection handle,hdbc)相对应的数据库的名称(通过指定信息类型 SQL_DATABASE_NAME,也可借助 SQLGetInfo() 获得数据库名)。 面向工作站、MVS、VM/VSE、AS/400 的 DB2
    IFNULL( exp, value ) 如果 exp 为空值,则返回 value。如果 exp 为非空值,则返回 exp。可能的 Value 数据类型必须与 exp 的数据类型兼容。 面向工作站、MVS、VM/VSE、AS/400 的 DB2
    USER() 返回用户的授权名称(通过指定信息类型 SQL_USER_NAME,也可借助 SQLGetInfo() 获得用户的授权名)。 面向工作站、MVS、VM/VSE、AS/400 的 DB2

    转换函数

    转换函数受 DB2 CLI 支持并由 ODBC 通过供应商转义子句定义。

    每个驱动程序和数据源可以确定两种可能的数据类型之间可以进行哪些有效转换。当驱动程序将 ODBC 语法转换为本地语法(native syntax)时,它将拒绝执行不受数据源支持的转换,即使 ODBC 语法有效。

    使用 SQLGetInfo() 函数以及合适的转换函数掩码(mask)可以确定哪些转换受数据源支持。


    表 5. 转换函数
    转换标量函数 说明 支持该函数的服务器
    CONVERT( expr_value, data_type )
    • data_type 表示经过转换的 expr_value 表示的数据类型,其值可以是 SQL_CHAR 或 SQL_DOUBLE。
    • expr_value 是将要进行转换的值。可以是多种类型,具体取决于受驱动程序和数据源支持的转换。使用 SQLGetInfo() 函数以及合适的转换函数掩码可以确定哪些转换受数据源支持。
    面向工作站的 DB2

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15082138/viewspace-591943/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/15082138/viewspace-591943/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值