首頁 培訓計劃 培訓課程 企業內訓 學員論壇 技術文章 成功案例 師資簡介 關于我們 在線留言  
數據庫資料
DB2 針對 CLI 應用程序的標量函數介紹

文章來源: 作者: 發布日期:2008-07-29
打 印】【關 閉

本文以表格的形式展示了 DB2 CLI 應用程序中常用的一些函數,并且介紹調用這些函數時,各種面向工作站、MVS、VM/VSE、AS/400 的 DB2 數據庫服務器中,哪些服務器(及最早版本)可以支持這些函數訪問。

概述

在數據庫應用開發中不可避免會遇到大量的函數需求,而在 DB2 中提供了以下函數,它由 ODBC 通過供應商轉義子句(vendor escape clauses)定義??梢允褂棉D義子句語法或調用等價的 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 是將要進行轉換的值??梢允嵌喾N類型,具體取決于受驅動程序和數據源支持的轉換。使用 SQLGetInfo() 函數以及合適的轉換函數掩碼可以確定哪些轉換受數據源支持。
面向工作站的 DB2

打 印】【關 閉

上一篇:Java編程那些事兒
下一篇:Ajax優于JSF的幾個原因討論
相關新聞
版權所有©威課網 粵ICP備13058727號