电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

瀏覽:7日期: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 數據庫
主站蜘蛛池模板: 跨境物流_美国卡派_中大件运输_尾程派送_海外仓一件代发 - 广州环至美供应链平台 | 一航网络-软件测评官网| 反渗透水处理设备|工业零排放|水厂设备|软化水设备|海南净水设备--海南水处理设备厂家 | 包塑丝_高铁绑丝_地暖绑丝_涂塑丝_塑料皮铁丝_河北创筹金属丝网制品有限公司 | 酒万铺-酒水招商-酒水代理 | 咖啡加盟-咖啡店加盟-咖啡西餐厅加盟-塞纳左岸咖啡西餐厅官网 | 12cr1mov无缝钢管切割-15crmog无缝钢管切割-40cr无缝钢管切割-42crmo无缝钢管切割-Q345B无缝钢管切割-45#无缝钢管切割 - 聊城宽达钢管有限公司 | 明渠式紫外线杀菌器-紫外线消毒器厂家-定州市优威环保 | 餐饮加盟网_特色餐饮连锁加盟店-餐饮加盟官网 | 吹塑加工_大型吹塑加工_滚塑代加工-莱力奇吹塑加工有限公司 | 磨煤机配件-高铬辊套-高铬衬板-立磨辊套-盐山县宏润电力设备有限公司 | 国产频谱分析仪-国产网络分析仪-上海坚融实业有限公司 | 玻璃瓶厂家_酱菜瓶厂家_饮料瓶厂家_酒瓶厂家_玻璃杯厂家_徐州东明玻璃制品有限公司 | 上海橡胶接头_弹簧减震器_金属软接头厂家-上海淞江集团 | 深圳激光打标机_激光打标机_激光焊接机_激光切割机_同体激光打标机-深圳市创想激光科技有限公司 深圳快餐店设计-餐饮设计公司-餐饮空间品牌全案设计-深圳市勤蜂装饰工程 | 成都珞石机械 - 模温机、油温机、油加热器生产厂家 | 河南空气能热水器-洛阳空气能采暖-洛阳太阳能热水工程-洛阳润达高科空气能商行 | 注塑_注塑加工_注塑模具_塑胶模具_注塑加工厂家_深圳环科 | 仓储笼_金属箱租赁_循环包装_铁网箱_蝴蝶笼租赁_酷龙仓储笼租赁 测试治具|过炉治具|过锡炉治具|工装夹具|测试夹具|允睿自动化设备 | 对夹式止回阀_对夹式蝶形止回阀_对夹式软密封止回阀_超薄型止回阀_不锈钢底阀-温州上炬阀门科技有限公司 | 浙江富广阀门有限公司| 细沙回收机-尾矿干排脱水筛设备-泥石分离机-建筑垃圾分拣机厂家-青州冠诚重工机械有限公司 | 安全光栅|射频导纳物位开关|音叉料位计|雷达液位计|两级跑偏开关|双向拉绳开关-山东卓信机械有限公司 | 学叉车培训|叉车证报名|叉车查询|叉车证怎么考-工程机械培训网 | 黑龙江「京科脑康」医院-哈尔滨失眠医院_哈尔滨治疗抑郁症医院_哈尔滨精神心理医院 | 广州网站建设_小程序开发_番禺网站建设_佛山网站建设_粤联网络 | 破碎机锤头_合金耐磨锤头_郑州宇耐机械工程技术有限公司 | ◆大型吹塑加工|吹塑加工|吹塑代加工|吹塑加工厂|吹塑设备|滚塑加工|滚塑代加工-莱力奇塑业有限公司 | 分光色差仪,测色仪,反透射灯箱,爱色丽分光光度仪,美能达色差仪维修_苏州欣美和仪器有限公司 | 上海小程序开发-上海小程序制作公司-上海网站建设-公众号开发运营-软件外包公司-咏熠科技 | 自动化生产线-自动化装配线-直流电机自动化生产线-东莞市慧百自动化有限公司 | 南溪在线-南溪招聘找工作、找房子、找对象,南溪综合生活信息门户! | 苏州伊诺尔拆除公司_专业酒店厂房拆除_商场学校拆除_办公楼房屋拆除_家工装拆除拆旧 | 金属切削液-脱水防锈油-电火花机油-抗磨液压油-深圳市雨辰宏业科技发展有限公司 | 西点培训学校_法式西点培训班_西点师培训_西点蛋糕培训-广州烘趣西点烘焙培训学院 | 恒温恒湿箱(药品/保健品/食品/半导体/细菌)-兰贝石(北京)科技有限公司 | 西点培训学校_法式西点培训班_西点师培训_西点蛋糕培训-广州烘趣西点烘焙培训学院 | 挤塑板-XPS挤塑板-挤塑板设备厂家[襄阳欧格]| 中式装修设计_室内中式装修_【云臻轩】中式设计机构 | 量子管通环-自清洗过滤器-全自动反冲洗过滤器-北京罗伦过滤技术集团有限公司 | 单机除尘器 骨架-脉冲除尘器设备生产厂家-润天环保设备 |