亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

DB2 V9.5版本中數據庫應用程序移植的改進

瀏覽:4日期:2023-11-09 08:16:54
版本9.5中改進的應用程序可移植性增加了與現有代碼的兼容性,并且不再需要遷移使用其他供應商的數據庫的應用程序。版本 9.5 包含以下增強功能:

• 支持在過程和調用過程的應用程序中使用 ARRAY 數據類型。

• 支持全局變量。全局變量是已命名的內存變量,您可以通過 SQL 語句訪問和修改此變量。版本 9.5 支持已創建的會話全局變量,這些變量與特定會話相關聯并包含該會話獨有的值。

• 支持其他供應商的 SQL 方言。版本 9.5 包含對 DECODE、NVL、LEAST 和 GREATEST 函數的支持。

數組數據類型

在以前的DB2版本,碰到數據集合處理的程序移植,我們只能通過臨時表或游標來處理,這是非常麻煩的。

版本 9.5 支持 ARRAY 集合數據類型。您可以在存儲過程和應用程序中對它們進行處理,此功能使從其他數據庫供應商移植已支持數組的應用程序和存儲過程更容易。

您可以使用數組以在應用程序與存儲過程之間更有效率地傳遞數據以及存儲和處理 SQL 過程中的瞬態數據集合,而不必使用關系表。SQL 過程中可用的數組運算符允許更有效率地存儲和檢索數據。

版本 9.5 中對數組數據類型的支持允許您執行以下操作:

• 根據數組創建用戶定義的類型;例如,CREATE TYPE INT10 AS INTEGER ARRAY[10] 定義最多 10 個整數值的數組的類型;

• 在存儲過程和應用程序中聲明數組類型的變量和參數;

• 創建和處理數組值,數組處理的基本部分包括數組構造方法、設置子下標、元素計數和整理;

• 在 JDBC 和 CLI 應用程序與 SQL 和 Java 存儲過程之間來回傳遞數組;

• 將數組轉換為表(每個表行一個數組元素)以及將聚集列轉換為數組,以便更容易在數組與 SQL 之間通過接口進行連接;

• 使用輸入和輸出數組參數從命令行處理器調用過程。

ARRAY 數據類型定義:

CREATE TYPE type-name AS data-type ARRAY [integer-constant]

其中:data-type 不支持LONG VARCHAR, LONG VARGRAPHIC, LOB, XML類型, integer-constant 最大值2147483647

與ARRAY相關的函數:

ARRAY_AGG 將行數據集聚集成數組

UNNEST 將數組數據轉成行數據

CARDINALITY 返回數組中的元素號,類型 BIGINT

MAX_CARDINALITY 返回數組中所含的最大元素號,類型 BIGINT

注意,這些函數只用于SQL procedure

SELECT T.PHONE, T.ID, T.INDEX FROM UNNEST(PHONES, IDS)

WITH ORDINALITY AS T(PHONE, ID, INDEX)

ORDER BY T.INDEX

Example 1

這個例子包含2個存儲過程, sum 和 main. 存儲過程 main 建立一個含有6個元素(integer)的數組。傳遞這個數組給存儲過程sum, 計算出所有元素值的和并返回給調用存儲過程 main. 存儲過程 sum 說明了array subindexing 和CARDINALITY 函數的用法.

create type intArray as integer array[100] @

create procedure sum(in numList intArray, out total integer)

begin

declare i, n integer;

set n = CARDINALITY(numList);

set i = 1;

set total = 0;

while (i < n) do

set total = total + numList[i];

set i = i + 1;

end while;

end @

create procedure main(out total integer)

begin

declare numList intArray;

set numList = ARRAY[1,2,3,4,5,6];

call sum(numList, total);

end @

Example 2

這個例子,我們使用2個數組類型(intArray 和 stringArray),使用一個包含列(id 和 name)的 persons 表。 存儲過程 processPersons 添加3個人到 persons表, 并返回person名字的數組,按id排序,名字中包含字母 'o'。 3個persons 的 id 和 name 作為數組元素(ids 和 names)添加到數組中。這些數組使用UNNEST 函數,將數組數據以包含2列數據的表的表達形式表達,并插入到persons 表中。最后使用ARRAY_AGG函數將數據匯集返回給輸出參數。

create type intArray as integer array[100] @

create type stringArray as varchar(10) array[100] @

create table persons (id integer, name varchar(10)) @

insert into persons values(2, 'Tom') @

insert into persons values(4, 'Jill') @

insert into persons values(1, 'Joe') @

insert into persons values(3, 'Mary') @

create procedure processPersons(out witho stringArray)

begin

declare ids intArray;

declare names stringArray;

set ids = ARRAY[5,6,7];

set names = ARRAY['Bob', 'Ann', 'Sue'];

insert into persons(id, name) (select T.i, T.n from UNNEST(ids, names) as T(i, n));

set witho = (select array_agg(name order by id)

from persons

where name like '%o%');

end @

Example 3

這個例子說明在java代碼中如何調用含有數組參數的存儲過程,本例子中存儲過程bonus_calculate含有2個輸入參數,一個是數組projs,一個是整形percentage

………

String sql = 'CALL bonus_calculate(?, ?)';

CallableStatement callStmt = con.prepareCall(sql);

// Create an SQL Array

projects[0] = 'AD3111';

projects[1] = 'IF1000';

projects[2] = 'MA2111';

java.sql.Array projectArray=con.createArrayOf('VARCHAR',projects);

// set IN parameters

callStmt.setArray(1, projectArray);

callStmt.setInt(2,percentage);

// call the procedure

callStmt.execute();

…………

CREATE PROCEDURE bonus_calculate (IN projs projects, IN percentage integer)

BEGIN

DECLARE emp_array employees;

DECLARE bonus_array bonus;

SELECT cast(array_agg(employee.empno) AS employees),

cast(array_agg(.10*salary) AS bonus) INTO emp_array,bonus_array

FROM vempprojact, unnest(projs) AS P(id), employee

WHERE P.id=vempprojact.projno AND employee.empno=vempprojact.empno;

INSERT INTO bonus_temp

SELECT T.empno, T.bonus

FROM unnest(emp_array, bonus_array)

WITH ORDINALITY AS T(empno,bonus, idx);

END@

全局變量

在以前的DB2版本,碰到含全局變量處理的移植程序移植,我們只能通過全局臨時表來處理,使用起來非常麻煩。

全局變量改進了 SQL 語句之間的數據共享。版本 9.5 引入了全局變量的概念,它們是命名的內存變量,可以通過 SQL 語句訪問和修改這些變量。全局變量使您能夠在運行于同一會話(或連接)的不同 SQL 語句之間共享數據,而不需要應用程序邏輯來支持此數據傳輸。

應用程序不再需要發出這種語句來將值從一個語句的輸出自變量(如主機變量)復制到另一個語句的輸入自變量。此外,包含在數據庫系統本身中的 SQL 語句(如定義觸發器和視圖的語句)現在可以訪問此共享信息。

全局變量有助于您為數據庫本身中的數據傳輸實現更復雜的交互式模型,以便您不必在應用程序或 SQL 過程中放置支持邏輯。與全局變量相關聯的已定義特權確保所傳送數據的安全性不會升高到強制通過應用程序邏輯。如果安全性存在問題,那么您可以通過 GRANT 和 REVOKE 語句來控制對全局變量的訪問。

存儲靜態的、在會話期間很少更改的或者進行了管理控制的數據時,全局變量特別有用。用于將警報發送至 DBA 的尋呼機號以及指示是啟用還是禁用某些觸發器的指示器就是這種數據的示例。

版本 9.5 支持已創建的會話全局變量。會話全局變量與特定會話相關聯并包含該會話獨有的值。已創建的會話全局變量可用于任何正在您定義該變量的數據庫上運行的活動 SQL 語句。系統目錄包含已創建的會話全局變量的定義以及與這些全局變量相關聯的特權。

例子:

創建全局變量:

CREATE VARIABLE myjob_current varchar (10) DEFAULT ('soft-engg');

獲取全局變量信息:

SELECT substr (varschema, 1, 10) as varschema,

substr (varname, 1, 10) AS varname,

varid, substr(owner,1,10) AS owner,

ownertype, create_time,

substr(typeschema,1,10) AS typeschema,

substr(typename,1,10) AS typename, length

FROM syscat.variables

WHERE varname = 'MYJOB_CURRENT';

給用戶praveen 和 sanjay 讀和寫權限,剝奪用戶sanjay寫權限:

GRANT READ, WRITE ON VARIABLE myjob_current TO USER praveen, USER sanjay;

REVOKE WRITE ON VARIABLE myjob_current FROM USER sanjay;

獲取用戶 praveen 和 sanjay 的全局變量權限信息:

SELECT substr (varschema, 1, 10) AS schema,

substr (varname, 1, 10) AS name,

substr(grantor,1,10) AS grantor, grantortype AS Rtype,

substr(grantee,1,10) AS grantee, granteetype AS Etype,

readauth, writeauth

FROM syscat.variableauth

WHERE varname ='MYJOB_CURRENT'; ]

在觸發器中使用全局變量,本例是設計一個disable觸發器示例:

CREATE VARIABLE disable_trigger char (1) DEFAULT ('N');

CREATE TRIGGER validate_t BEFORE INSERT ON EMPLOYEE

REFERENCING NEW AS n FOR EACH ROW

WHEN (disable_trigger = 'N' AND n.empno > '10000')

SIGNAL SQLSTATE '38000'

SET message_text = 'EMPLOYEE NUMBER TOO BIG and INVALID';

SET disable_trigger = 'Y'; 使觸發器失效

簡化用戶權限檢索:

CREATE VARIABLE schema1.gv_workdept CHAR

DEFAULT ((SELECT workdept FROM employee

WHERE firstnme = SESSION_USER));

CREATE VIEW schema1.emp_filtered AS

SELECT * FROM employee

WHERE workdept = schema1.gv_workdept;

在存儲過程,嵌入C,java程序中都可使用全局變量。

新的函數

新的函數簡化了應用程序移植,版本 9.5 包含一些與其他數據庫供應商使用的標量函數同名的新標量函數。當您將現有應用程序移植到版本 9.5 中時,您可以繼續使用其他供應商使用的函數名稱,而無需更改代碼。

提供了以下新的標量函數:

• NVL(現有的 COALESCE 和 VALUE 函數的同義詞)

• LEAST 或 MIN(互為同義詞)

• GREATEST 或 MAX(互為同義詞)

• DECODE(類似于現有的 CASE 表達式)

標簽: DB2 數據庫
主站蜘蛛池模板: 国产精品青草久久久久婷婷 | 亚洲日韩精品欧美一区二区一 | 国产高清视频网站 | 暧暧视频在线观看免费 | 国产一级特黄毛片 | 97国产在线播放 | 国产精品无码专区在线观看 | 欧美成人免费草草影院视频 | 日一区二区 | 国产福利一区二区在线观看 | 国产精品色婷婷在线观看 | 丝袜超薄交口足456免费视频 | 啪啪国产| 毛片中文字幕 | 麻豆日韩区久久综合 | 久久91精品国产一区二区 | 美国一级毛片片aaa 美国一级毛片片aa久久综合 | 丝袜诱惑一区二区 | 久久九色综合九色99伊人 | 中文字幕日韩精品在线 | 亚洲丁香 | 久久这里只有精品免费播放 | 午夜一区 | 亚洲精品亚洲九十七页 | 欧美成人一级视频 | 99久久精品免费看国产麻豆 | 亚洲国产高清一区二区三区 | 亚洲国产欧美日韩一区二区三区 | 给个网站可以在线观看你懂的 | 国产一区 在线视频 | 中文在线观看永久免费 | 综合久青草视频 | 久久久久综合国产 | 五月国产综合视频在线观看 | 98精品国产高清在线xxxx | 国产一区二区三区四区波多野结衣 | 玖玖激情| 女人被狂躁的视频免费一一 | 色综合亚洲综合网站综合色 | 欧美亚洲综合在线 | 免费国产网站 |