DB2存储过程精简教程

合集下载

4、DB2官方存储过程开发教程

4、DB2官方存储过程开发教程

DB2 9.5 SQL Procedure Developer第1 部分: SQL Procedural Language 入门变量声明SQL 过程允许使用本地变量赋予和获取SQL 值,以支持所有SQL 逻辑。

在SQL 过程中,在代码中使用本地变量之前要先进行声明。

清单1 中的图演示了变量声明的语法:SQL-variable-name定义本地变量的名称。

该名称不能与其他变量或参数名称相同,也不能与列名相同。

图1 显示了受支持的DB2 数据类型:图1. DB2 数据类型DEFAULT值–如果没有指定,在声明时将赋值为NULL。

下面是变量声明的一些例子:∙DECLARE v_salary DEC(9,2) DEFAULT 0.0;∙DECLARE v_status char(3) DEFAULT ‗YES‘;∙DECLARE v_descrition VARCHAR(80);∙DECLARE v1, v2 INT DEFAULT 0;请注意,从DB2 version 9.5 开始才支持在一个DECLARE 语句中声明多个相同数据类型的变量。

数组数据类型SQL 过程从9.5 版开始支持数组类型的变量和参数。

要定义一个数组类型的变量,需要先在数据库中创建该类型,然后在过程或应用程序中声明它。

数组是临时的值,可以在存储过程和应用程序中操纵它,但是不能将它存储到表中。

DB2 支持以下创建数组数据类型的语法:数组类型的名称应该用模式加以限定,并且在当前服务器上应该是惟一的。

LONG VARCHAR、LONG VARGRPAHIC、XML 和用户定义类型不能作为数组元素的数据类型。

请注意,整数―constant‖ 指定数组的最大基数,它是可选的。

数组元素可以通过ARRAY-VARIABLE(subindex) 来引用,其中subindex 必须介于1 到数组的基数之间。

现在可以在SQL 过程中使用这个数据类型:DB2 支持一些操作数组的方法。

DB2 SQLJ 存储过程开发宝典,第 1 部分_216_IT168文库

DB2 SQLJ 存储过程开发宝典,第 1 部分_216_IT168文库

DB2 SQLJ 存储过程开发宝典,第1 部分简介: SQLJ 存储过程开发宝典将分为 2 个部分。

本文是第 1 部分,在介绍SQLJ 的基础知识的基础上,结合实例,详细介绍如何一步步开发SQLJ 存储过程以及常用的调试方法。

在第2 部分中,我们将集中介绍开发SQLJ 存储过程的常见问题及其解决方法。

SQLJ 的基础知识1. 基本概念SQLJ 是 Java 应用程序与数据库进行数据传递的一种方式,它是将静态 SQL 语句嵌入在 Java 代码中的一种非过程语言。

SQLJ 为标准的 Java 程序提供了一种访问数据库的扩展能力,程序员只需要在 Java 代码中添加以特定符号标记的SQL 语句,Java 程序就可以从数据库获取数据,插入、更新或删除数据库中的数据。

不过,我们把这种嵌入了 SQL 语句的 Java 代码为 SQLJ 源代码。

下面是一段简单的 SQLJ 代码示例,我们可以一睹 SQLJ 代码的“芳容”。

清单1. SQLJ 代码片段示例try{// Retrieve Info from database tableString hostVar = null;#sql[ctx]{SELECT col INTO :hostvar FROM tablename WHERE objID=:objectID};} catch(SQLException e){logf("Error: Cannot execute SQL statement.");e.printStackTrace();}回到 SQLJ 技术本身,它是由 IBM、Oracle 和 Sybase 等数据库厂商于 1997 年提出的技术规范,确定了如何在 Java 变成语言中使用静态 SQL 语句。

同年 12 月,Oracle 提供了 SQL 嵌入于 Java 代码中的参考实现,该参考实现可以运行在任何支持 JDK1.1 的平台。

DB2 存储过程开发最佳实践

DB2 存储过程开发最佳实践

DB2 存储过程开发最佳实践COALESCE函数会依次检查输入的参数,返回第一个不是NULL的参数,只有当传入COALESCE函数的所有的参数都是NULL的时候,函数才会返回NULL。

例如, COALESCE(piName,''),如果变量piName为NULL,那么函数会返回'',否则就会返回piName本身的值。

下面的例子展示了如何对参数进行检查何初始化。

Person表用来存储个人的基本信息,其定义如下:表1: Person下面是用于向表Person插入数据的存储过程的参数预处理部分代码:表Person中num、name和age都是非空字段。

对于name字段,多个空格我们也认为是空值,所以在进行判断前我们调用RTRIM和COALESCE对其进行处理,然后使用 piName = '',对其进行非空判断;对于Rank 字段,我们希望如果用户输入的NULL,我们把它设置成"0",对其我们也使用COALESCE进行初始化;对于"Age"和"Num" 我们直接使用 IS NULL进行非空判断就可以了。

如果输入参数没有通过非空判断,我们就对输出参数poGenStatus设置一个确定的值(例子中为 34100)告知调用者:输入参数错误。

下面是对参数初始化规则的一个总结,供大家参考:1. 输入参数为字符类型,且允许为空的,可以使用COALESCE(inputParameter,'')把NULL转换成'';2. 输入类型为整型,且允许为空的,可以使用COALESCE(inputParameter,0),把空转换成0;3. 输入参数为字符类型,且是非空非空格的,可以使用COALESCE(inputParameter,'')把NULL转换成'',然后判断函数返回值是否为'';4. 输入类型为整型,且是非空的,不需要使用COALESCE函数,直接使用IS NULL进行非空判断。

db2 v9的自动存储管理详细教程

db2 v9的自动存储管理详细教程

IBM的DB2 V9 引入了自动存储器管理,使用自动存储功能可以帮助您简化表空间的存储管理,新创建的使用自动存储功能的表空间,其容器和空间分配完全由 DB2数据库管理器确定。

本文重点介绍使用DB2® V9 自动存储功能的数据库如何进行非增量重定向还原。

简介数据库可能会因为软件或硬件故障而不可用,可能会遇到存储问题、断电、应用程序故障或误操作等各种需要采取不同恢复措施的故障情况。

本文重点介绍使用了DB2® V9 的自动存储功能,不允许增量备份的数据库如何进行重定向还原。

由于使用自动存储器功能的数据库在还原方面和以往有了很大区别,客户在实际使用的过程中容易出现各种问题,所以本文对自动存储功能会有详细的阐述。

自动存储特性最初是在DB2 V8.2.2中引入的,DB2 V9扩展了这一特性,使用自动存储功能可以帮助您简化表空间的存储管理,新创建的使用自动存储功能的表空间,其容器和空间分配完全由 DB2数据库管理器确定。

自动存储管理自动存储器跨磁盘和文件系统自动增大数据库大小。

因此,在保持数据库管理的存储器性能和灵活性的同时,不再需要管理存储器容器。

在DB2 V9.1中,已对多分区数据库增加了自动存储器支持。

如果您使用的是带DPF(Data Partitioning Feature,数据库分区功能)的企业服务器版,那您可以使用支持自动存储器功能的多分区数据库。

在DB2 V9中创建新数据库的时候,默认启用自动存储功能,主要目的是简化表空间的存储管理,使用自动存储功能的数据库有一个或多个相关联的存储器路径,在创建表空间的时候不用指定存储的路径等特性。

对使用自动存储器功能的数据库,其表空间可以使用自动存储管理,也可以不使用自动存储管理。

对于不使用自动存储器功能的数据库,则其表空间不能使用自动存储管理。

自动存储器简化了存储管理,它使您能够指定用于数据库管理器存放表空间数据以及为各种用途分配空间的存储路径。

DB2存储过程(Merge关键字的使用)

DB2存储过程(Merge关键字的使用)

DB2存储过程(Merge关键字的使用)CREATE PROCEDURE COPY_OCJ_LIST_TO_SHIPMENT(IN P_SESSION_ID VARCHAR(40), --当前用户的session ID IN P_IS_REPEAT VARCHAR(20), --如果导入新数据传入值:YES,如果导入全部数据传入值:ALLIN P_IS_SAME VARCHAR(20), --是否保存IN P_ORDER_TYPE VARCHAR(20), --客户发货入库IN P_ORDER_ID VARCHAR(20), --入库编号IN P_ORDER_TIME VARCHAR(30), --入库时间IN P_VENDOR_ID VARCHAR(20), --发货客户IN P_WAREHOUSE_ID VARCHAR(20),--分拨中心IN P_CREATE_BY VARCHAR(20) --创建者)MODIFIES SQL DATA --表示存储过程可以执行任何 SQL 语句LANGUAGE SQL-------------------------------------------------------------------------- SQL 存储过程------------------------------------------------------------------------P1: BEGIN ATOMIC--声明一个变量,用来保存入库计划明细中未失效运单的数量DECLARE D_ODRER_COUNT INTEGER;DECLARE D_ORDER_ID VARCHAR(20);--------------------------- 保存OCJ正式表数据 ---------------------------MERGE INTO OCJ_SHIPMENT OSUSING(--查询OCJ导入的临时表数据SELECTSHIPMENT_ID, --IDSHIPMENT_PLAN_NO, --运单号RECEIVE_DATE, --提货日期VENDOR_ID, --发货客户WAREHOUSE_ID, --原分拨中心IS_CHECK, --是否审核CAR_LICENSE_NO, --车辆牌号DRIVER_NAME, --司机名称STATE, --状态CREATE_BY, --创建者CREATE_DATE, --创建日期LAST_UPDATE_BY, --修改者LAST_UPDATE_DATE, --修改日期SESSION_ID, --用户IDSERIAL_ID, --序列号IS_REPEAT, --是否重复FROM_WAREHOUSE_ID, --来源分拨中心IS_SAME_WAREHOUSE --是否同一分拨中心FROM OCJ_SHIPMENT_TEMPWHERE SESSION_ID = P_SESSION_ID AND IS_REPEAT != P_IS_REPEAT)OSTON(OST.IS_REPEAT != P_IS_REPEAT ANDOS.SHIPMENT_PLAN_NO=OST.SHIPMENT_PLAN_NO ANDOS.VENDOR_ID=OST.VENDOR_ID) --如果临时表中标记为YS_Yes的,则修改WHEN MATCHED THEN--如果指定的条件匹配,则执行修改动作UPDATE SETOS.SHIPMENT_PLAN_NO=OST.SHIPMENT_PLAN_NO, --运单号OS.RECEIVE_DATE=OST.RECEIVE_DATE, --提货日期OS.VENDOR_ID=OST.VENDOR_ID, --发货客户OS.WAREHOUSE_ID =OST.WAREHOUSE_ID, --原分拨中心OS.FROM_WAREHOUSE_ID=OST.FROM_WAREHOUSE_ID, --来源分拨中心OS.IS_CHECK=OST.IS_CHECK, --是否审核OS.CAR_LICENSE_NO=OST.CAR_LICENSE_NO, --车辆编号OS.DRIVER_NAME=OST.DRIVER_NAME, --司机名称OS.STATE=OST.STATE, --状态ST_UPDATE_BY=ST_UPDATE_BY, --修改者ST_UPDATE_DATE=ST_UPDATE_DATE --修改日期WHEN NOT MATCHED THEN--如果指定的条件不匹配,则执行添加动作INSERT(SHIPMENT_ID, --IDSHIPMENT_PLAN_NO, --运单号RECEIVE_DATE, --提货日期VENDOR_ID, --发货客户WAREHOUSE_ID, --原分拨中心 IS_CHECK, --是否审核CAR_LICENSE_NO, --车辆牌号DRIVER_NAME, --司机名称STATE, --状态CREATE_BY, --创建者CREATE_DATE, --创建日期LAST_UPDATE_BY, --修改者LAST_UPDATE_DATE, --修改日期FROM_WAREHOUSE_ID --来源分拨中心 )VALUES(OST.SHIPMENT_ID,OST.SHIPMENT_PLAN_NO,OST.RECEIVE_DATE,OST.VENDOR_ID,OST.WAREHOUSE_ID,OST.IS_CHECK,OST.CAR_LICENSE_NO,OST.DRIVER_NAME,OST.STATE,OST.CREATE_BY,OST.CREATE_DATE,ST_UPDATE_BY,ST_UPDATE_DATE,OST.FROM_WAREHOUSE_ID);-------------------------------- 保存导入数据状态表状态 --------------------------------MERGE INTO SHIPMENT_STATE SSUSING(--查询OCJ导入的临时表数据SELECTSHIPMENT_ID, --IDSHIPMENT_PLAN_NO, --运单号RECEIVE_DATE, --提货日期VENDOR_ID, --发货客户WAREHOUSE_ID, --原分拨中心--IS_CHECK, --是否审核--CAR_LICENSE_NO, --车辆牌号--DRIVER_NAME, --司机名称--STATE, --状态--CREATE_BY, --创建者--CREATE_DATE, --创建日期--LAST_UPDATE_BY, --修改者--LAST_UPDATE_DATE, --修改日期--SESSION_ID, --用户ID--SERIAL_ID, --序列号IS_REPEAT --是否重复--FROM_WAREHOUSE_ID, --来源分拨中心--IS_SAME_WAREHOUSE --是否同一分拨中心FROM OCJ_SHIPMENT_TEMPWHERE SESSION_ID = P_SESSION_ID AND IS_REPEAT != P_IS_REPEAT)OSTON(OST.IS_REPEAT != P_IS_REPEAT ANDSS.SHIPMENT_PLAN_NO=OST.SHIPMENT_PLAN_NO ANDSS.VENDOR_ID=OST.VENDOR_ID) --如果临时表中标记为YS_Yes的,则修改WHEN MATCHED THEN--如果指定的条件匹配,则执行修改动作UPDATE SETSS.RECEIVE_DATE=OST.RECEIVE_DATE --提货日期WHEN NOT MATCHED THEN--如果指定的条件不匹配,则执行添加动作INSERT(SHIPMENT_STATE_ID, --状态表ID(唯一的) SHIPMENT_PLAN_NO, --运单号RECEIVE_DATE, --提货日期VENDOR_ID, --发货客户WAREHOUSE_ID --原分拨中心--CREATE_BY, --创建者--CREATE_DATE --创建日期)VALUES('SS' || OST.SHIPMENT_ID,OST.SHIPMENT_PLAN_NO,OST.RECEIVE_DATE,OST.VENDOR_ID,OST.WAREHOUSE_ID--OST.CREATE_BY, --创建者--OST.CREATE_DATE --创建日期);------------------------------------- 保存导入数据Other状态表状态 -------------------------------------MERGE INTO SHIPMENT_OTHER_STATE SOSUSING(--查询OCJ导入的临时表数据SELECTSHIPMENT_ID, --IDSHIPMENT_PLAN_NO, --运单号RECEIVE_DATE, --提货日期VENDOR_ID, --发货客户--WAREHOUSE_ID, --原分拨中心--IS_CHECK, --是否审核--CAR_LICENSE_NO, --车辆牌号--DRIVER_NAME, --司机名称--STATE, --状态--CREATE_BY, --创建者--CREATE_DATE, --创建日期--LAST_UPDATE_BY, --修改者--LAST_UPDATE_DATE, --修改日期IS_REPEAT, --是否重复FROM_WAREHOUSE_ID, --来源分拨中心IS_SAME_WAREHOUSE --是否同一分拨中心FROM OCJ_SHIPMENT_TEMPWHERE SESSION_ID = P_SESSION_ID AND IS_REPEAT !=P_IS_REPEAT)OSTON(OST.IS_REPEAT != P_IS_REPEAT ANDSOS.SHIPMENT_PLAN_NO=OST.SHIPMENT_PLAN_NO ANDSOS.VENDOR_ID=OST.VENDOR_ID) --如果临时表中标记为YS_Yes的,则修改WHEN MATCHED THEN--如果指定的条件匹配,则执行修改动作UPDATE SETSOS.PLAN_WAREHOUSE_ID=OST.FROM_WAREHOUSE_ID, --来源分拨中心SOS.PLAN_IMPORT='YS_Yes', --可导入SOS.OCJ_IMPORT='YS_Yes', --可导入SOS.OCJ_CHECK='YS_Yes', --可审核SOS.INCOME_ORDER='YS_Yes', --可入库SOS.BOOK_LOC='YS_Yes' --可预排库位ST_UPDATE_BY=ST_UPDATE_BY, --修改者ST_UPDATE_DATE=ST_UPDATE_DATE --修改日期WHEN NOT MATCHED THEN--如果指定的条件不匹配,则执行添加动作INSERT(SHIPMENT_STATE_ID, --状态表ID(唯一的) SHIPMENT_PLAN_NO, --运单号VENDOR_ID, --发货客户PLAN_WAREHOUSE_ID, --来源分拨中心PLAN_IMPORT, --可导入OCJ_IMPORT, --可导入OCJ_CHECK, --可审核INCOME_ORDER, --可入库BOOK_LOC --可预排库位--CREATE_BY, --创建者--CREATE_DATE --创建日期)VALUES('SOS' || OST.SHIPMENT_ID,OST.SHIPMENT_PLAN_NO,OST.VENDOR_ID,OST.FROM_WAREHOUSE_ID,'YS_Yes','YS_Yes','YS_Yes','YS_Yes','YS_Yes'--OST.CREATE_BY, --创建者--OST.CREATE_DATE --创建日期);---------------------------- 保存计划入库头信息 ----------------------------INSERT INTO WMS_INCOMING_ORDER_PLAN (ORDER_ID, --入库计划ID ORDER_NO, --入库计划单号ORDER_TIME, --入库时间ORDER_TYPE, --类型ENTER_TYPE, --自动STATE, --状态CREATE_BY, --创建者CREATE_DATE, --创建时间WAREHOUSE_ID, --分拨中心VENDOR_ID --发货客户)VALUES(P_ORDER_ID,'JHRKD' || P_ORDER_ID,P_ORDER_TIME,P_ORDER_TYPE,'AUTO','State_All_Y',P_CREATE_BY,P_ORDER_TIME,P_WAREHOUSE_ID,P_VENDOR_ID);------------------------------ 修改计划入库明细信息 ------------------------------MERGE INTO WMS_INCOMING_ORDER_ITEM_PLAN WIOIUSING(--查询OCJ导入的临时表数据SELECTSHIPMENT_ID, --IDSHIPMENT_PLAN_NO, --运单号RECEIVE_DATE, --提货日期VENDOR_ID, --发货客户WAREHOUSE_ID, --原分拨中心--IS_CHECK, --是否审核--CAR_LICENSE_NO, --车辆牌号--DRIVER_NAME, --司机名称--STATE, --状态--CREATE_BY, --创建者--CREATE_DATE, --创建日期--LAST_UPDATE_BY, --修改者--LAST_UPDATE_DATE, --修改日期IS_REPEAT, --是否重复FROM_WAREHOUSE_ID, --来源分拨中心IS_SAME_WAREHOUSE --是否同一分拨中心FROM OCJ_SHIPMENT_TEMPWHERE SESSION_ID = P_SESSION_ID AND IS_REPEAT !=P_IS_REPEAT AND IS_SAME_WAREHOUSE='YS_No' --查询当前用户下不同分拨中心的运单信息)OSTON(1=1 AND OST.IS_SAME_WAREHOUSE = 'YS_No' AND WIOI.SHIPMENT_PLAN_NO=OST.SHIPMENT_PLAN_NO ANDWIOI.VENDOR_ID=OST.VENDOR_ID --指定条件)WHEN MATCHED THEN--如果指定的条件匹配,则执行修改动作UPDATE SETSTATE = 'State_All_N';------------------------------ 保存计划入库明细信息 ------------------------------MERGE INTO WMS_INCOMING_ORDER_ITEM_PLAN WIOI USING(--查询OCJ导入的临时表数据SELECTSHIPMENT_ID, --IDSHIPMENT_PLAN_NO, --运单号RECEIVE_DATE, --提货日期VENDOR_ID, --发货客户WAREHOUSE_ID, --原分拨中心--IS_CHECK, --是否审核--CAR_LICENSE_NO, --车辆牌号--DRIVER_NAME, --司机名称--STATE, --状态--CREATE_BY, --创建者--CREATE_DATE, --创建日期--LAST_UPDATE_BY, --修改者--LAST_UPDATE_DATE, --修改日期IS_REPEAT, --是否重复FROM_WAREHOUSE_ID, --来源分拨中心IS_SAME_WAREHOUSE --是否同一分拨中心 FROM OCJ_SHIPMENT_TEMPWHERE SESSION_ID = P_SESSION_ID AND IS_REPEAT != P_IS_REPEAT AND IS_SAME_WAREHOUSE IS NOT NULL)OSTON(1 <> 1 --指定条件)WHEN NOT MATCHED THEN--如果指定的条件不匹配,则执行添加动作INSERT(ORDER_ITEM_ID, --明细IDORDER_ID, --头信息IDSHIPMENT_PLAN_ID, --配送计划IDSHIPMENT_PLAN_NO, --运单号CHECK_STATE, --VENDOR_ID, --发货客户WAREHOUSE_ID, --分拨中心LOC_ID, --库位IDQUANTITY, --数量STATE, --状态CREATE_BY, --创建者CREATE_DATE --创建日期)VALUES('WOIO' || SHIPMENT_ID,P_ORDER_ID,'-',OST.SHIPMENT_PLAN_NO,'YS_No',OST.VENDOR_ID,OST.WAREHOUSE_ID,'-',1,'State_All_Y',P_CREATE_BY,P_ORDER_TIME);------------------------- 修改计划入库信息 ---------------------------如果在入库计划明细中当前ORDER_ID下,不存在状态为State_All_Y,则更新头部信息为State_All_N--查询入库计划表表中有效运单的数据,根据ORDER_ID分组,如果该ORDER_ID下没有有效的入库计划明细,则头部信息失效FOR V ASSELECT count(*) AS count,WIOIP.order_id FROMWMS_INCOMING_ORDER_ITEM_PLAN WIOIPWHERE 1 = 1 AND WIOIP.STATE = 'State_All_Y' --状态为有效的GROUP BY WIOIP.order_id --根据ORDER_ID分组FOR READ ONLYDOSET D_ORDER_ID = V.order_id;SET D_ODRER_COUNT = V.COUNT;--如果有效运单为0,更新头部信息为失效IF D_ODRER_COUNT = 0 THENUPDATE WMS_INCOMING_ORDER_PLAN SET STATE ='State_All_N' WHERE ORDER_ID = D_ORDER_ID;END IF;END FOR;---------------------------------- 添加操作历史初始导入记录 ----------------------------------INSERT INTO ACTION_HISTORY (HISTORY_ID --操作历史ID, REFRENCE_ID --引用ID, REFRENCE_TYPE --操作类型, REFRENCE_OPERATOR --, WAREHOUSE_ID --分拨中心, SUB_WAREHOUSE_ID --, LOC_ID --库位, BEGIN_TIME --开始时间, STATE --状态, COMMENTS --备注, CREATE_BY --创建者, CREATE_DATE --创建时间, LAST_UPDATE_BY --最后修改者, LAST_UPDATE_DATE --最后修改时间, DRIVER_NAME --司机名称, CAR_LICENSE_NO --车辆编号, SHIPMENT_PLAN_ID --配送计划ID , VENDOR_ID --发货客户, SHIPMENT_PLAN_NO --运单号)SELECT 'AHO' || SHIPMENT_ID --操作历史ID, SHIPMENT_ID --引用ID, 'OPERATOR_SHIPMENT_OCJ_IMPORT' --操作类型, 'NEW_OCJ_IMPORT' --, FROM_WAREHOUSE_ID --, '-' --库位, CREATE_DATE --开始时间, 'State_All_Y' --状态, '' --备注, CREATE_BY --创建者, CREATE_DATE --创建时间, CREATE_BY --最后修改者, CREATE_DATE --最后修改时间, DRIVER_NAME --司机名称, CAR_LICENSE_NO --车辆编号, '-' --配送计划ID, VENDOR_ID --发货客户, SHIPMENT_PLAN_NO --运单号FROM OCJ_SHIPMENT_TEMPWHERE SESSION_ID = P_SESSION_ID AND IS_REPEAT = 'YS_No';--初始导入---------------------------------- 添加操作历史覆盖导入记录 ----------------------------------INSERT INTO ACTION_HISTORY(HISTORY_ID --操作历史ID, REFRENCE_ID --引用ID , REFRENCE_TYPE --操作类型, REFRENCE_OPERATOR --, WAREHOUSE_ID --分拨中心, LOC_ID --库位 , BEGIN_TIME --开始时间, STATE --状态 , COMMENTS --备注 , CREATE_BY --创建者 , CREATE_DATE --创建时间, LAST_UPDATE_BY --最后修改者, LAST_UPDATE_DATE --最后修改时间, DRIVER_NAME --司机名称, CAR_LICENSE_NO --车辆编号, SHIPMENT_PLAN_ID --配送计划ID, VENDOR_ID --发货客户, SHIPMENT_PLAN_NO --运单号 )SELECT 'AHO' || SHIPMENT_ID --操作历史ID, SHIPMENT_ID --引用ID, 'OPERATOR_SHIPMENT_OCJ_IMPORT' --操作类型, 'AGAIN_OCJ_IMPORT' --, WAREHOUSE_ID --分拨中心, FROM_WAREHOUSE_ID --, '-' --库位, CREATE_DATE --开始时间, 'State_All_Y' --状态, '' --备注, CREATE_BY --创建者, CREATE_DATE --创建时间, CREATE_BY --最后修改者, CREATE_DATE --最后修改时间, DRIVER_NAME --司机名称, CAR_LICENSE_NO --车辆编号, '-' --配送计划ID, VENDOR_ID --发货客户, SHIPMENT_PLAN_NO --运单号FROM OCJ_SHIPMENT_TEMPWHERE SESSION_ID = P_SESSION_ID AND IS_REPEAT = 'YS_Yes';--覆盖导入END P1本文来自CSDN博客,转载请标明出处:/soft_luo/archive/2009/12/01/4915477.aspx。

db2存储过程写法

db2存储过程写法

DB2是一种关系型数据库管理系统,支持使用存储过程进行数据处理和业务逻辑的封装。

下面是一个简单的DB2存储过程的写法示例:```sqlCREATE OR REPLACE PROCEDURE sp_example(IN param1 INT, OUT param2 VARCHAR(50))LANGUAGE SQLBEGIN-- 存储过程逻辑代码DECLARE var1 INT;SET var1 = param1 + 10;-- 查询数据SELECT column_name INTO param2FROM table_nameWHERE condition;-- 更新数据UPDATE table_nameSET column_name = var1WHERE condition;-- 返回结果SET param2 = 'Success';END@```上述示例定义了一个名为`sp_example`的存储过程,接受一个输入参数`param1`(整型)和一个输出参数`param2`(字符型)。

在存储过程中,可以编写逻辑代码来处理数据,包括声明变量、查询数据、更新数据等操作。

需要注意几点:- `LANGUAGE SQL`指定了存储过程使用的语言为SQL。

- `DECLARE`关键字用于声明局部变量,这里的`var1`是一个整型变量。

- 使用`SELECT INTO`语句将查询结果赋值给输出参数`param2`。

- 使用`UPDATE`语句更新表中的数据。

- 最后,使用`SET`语句将结果赋给输出参数`param2`。

最后,`END@`表示存储过程的结束。

请注意,这只是一个简单示例,实际的存储过程可能会更加复杂,根据具体需求来设计和实现存储过程的逻辑。

DB2存储过程

DB2存储过程

--CURSOR---------->
>--FOR--+-select-statement
-+-------------><
.-WITHOUT HOLD-.
|--+--------------+---------------------------------------------|
DB2 支持以下创建数组数据类型的语法:
清单 2. 创建数组数据类型的语法
Sql代码
>>-CREATE TYPE—array-type-name--AS--| data-type |--ARRAY--[---------->
.-2147483647-------.
若要更改默认函数路径,则需要更新专用寄存器 CURRENT PATH。
游标
声明
SQL PL 提供 DECLARE cursor 语句来定义一个游标,并提供其他语句来支持返回其他结果集和游标处理。
下面是游标声明的语法: Leabharlann 清单 7. 游标声明的语法
>>-DECLARE--cursor-name
现在可以在 SQL 过程中使用这个数据类型:
清单 3. 在过程中使用数组数据类型
Sql代码
CREATE PROCEDURE PROC_VARRAY_test (out mynames names)
BEGIN
DECLARE v_pnumb numbers;
'-WITH HOLD----'
.-WITHOUT RETURN-------------.
|--+----------------------------+-------------------------------|

DB2简易教程

DB2简易教程

DB2简易教程DB2简易教程吴天星2013/01/14目录1 DB2数据库的安装 (3)1.1安装过程 (3)1.2自动安装 (3)1.3安装要点 (4)2.DB2数据库的基础知识 (5)2.1 DB2的实例 (5)2.2 DB2的数据库操作 (5)2.3表空间 (6)2.4 DB2数据类型 (6)2.5 自增长标识 (7)2.5.1 标识列 (7)2.5.2 序列对象 (7)3.DB2脚本 (7)3.1 SQL脚本 (8)3.2 操作系统脚本 (8)1 DB2数据库的安装1.1安装过程DB2数据库的安装比较简单,在Windows下安装DB2数据库,运行安装包中的Setup.exe。

在Linux系统下,先到db2目录下,然后再运行db2setup命令。

然后再按照安装向导安装即可。

1.2自动安装自动化安装使用的是DB2的响应文件。

更改响应文件,然后再运行即可自动安装。

DB2的响应文件样例保存在db2/platform/samples文件夹中。

响应文件是一种文本文件,后缀是.rsp,可以使用记事本打开。

新建一个响应文件test.rsp。

然后将样例响应文件中的内容复制到其中,修改其中的配置信息。

示例1:PROD=EXPRESS_CLIC_AGREEMENT=ACCEPTFILE=D:\Program Files\IBM\SQLLIB\INSTALL_TYPE=CUSTOMCOMP=APPLICATION_DEVELOPMENT_TOOLSCOMP=BASE_CLIENTCOMP=DOTNET_DATA_PROVIDERCOMP=FIRST_STEPSCOMP=SPATIAL_EXTENDER_SERVER_SUPPORTCOMP=DB2_UPDATE_SERVICECOMP=JAVA_RUNTIME_SUPPORTCOMP=JDBC_SUPPORTCOMP=LDAP_EXPLOITATIONCOMP=ODBC_SUPPORTCOMP=OLE_DB_SUPPORTCOMP=DB2_SAMPLE_DATABASECOMP=SQLJ_SUPPORTCOMP=SSH_SERVERCOMP=TEXT_SEARCHCOMP=WMI_PROVIDERLANG=ENLANG=CNDAS_CONTACT_LIST=LOCALINSTANCE=DB2/doc/519881501.html,=DB2DEFAULT_INSTANCE=DB2DB2.SVCENAME=db2c_DB2DB2.DB2COMM=TCPIPDB2_OLEDB_GUID={F51E07DF-9151-4E00-AF9F-31B741126FB4}DB2_OLEDB_ADVANCED_PAGE_GUID={317C0BDF-8B0E-47EF-BF96-9B62E4D5B D59}DB2_OLEDB_CONNECTION_PAGE_GUID={C9E29CB4-B664-45DA-9F09-ED79FFCF 150F}DB2_OLEDB_ENUMERA TOR_GUID={5F5BB51A-EBF1-4593-BA48-BB6768EAEC41 }DB2_OLEDB_ERROR_LOOKUP_GUID={FC9D6B10-B3A1-41B5-8C14-7F86A97A6D 46}DB2.PORT_NUMBER=50000DB2.CONFIGURE_TEXT_SEARCH=YESDB2.TEXT_SEARCH_HTTP_SERVICE_NAME=db2j_DB2DB2.TEXT_SEARCH_HTTP_PORT_NUMBER=55000SSH_SERVER_INSTALL_DIR=D:\Program Files\IBM\IBM SSH Server\AUTOSTART_SSH_SERVER=YESDB2.AUTOSTART=YES/doc/519881501.html,ERNAME=LocalSyste mDAS_USERNAME=LocalSystemCREATE_DAS=YESDB2_EXTSECURITY=NODB2_COMMON_APP_DATA_TOP_PATH=D:\AllUsers\Application Data\RSP_FILE_NAME=D:\db2rsp\PROD_EXPC.rspDB2_COPY_NAME=DB2COPY1DEFAULT_COPY=YESDEFAULT_CLIENT_INTERFACE_COPY=YES进行自动化安装,在Windows下使用setup –u ,如setup –u test.rsp。

DB2数据库SQL存储过程

DB2数据库SQL存储过程

DB2数据库SQL存储过程高性能的SQL过程是数据库开发人员所追求的,我将不断把学到的,或在实际开发中用到的一些提高SQL过程性能的技巧整理出来,温故而知新.1,在只使用一条语句即可做到时避免使用多条语句让我们从一个简单的编码技巧开始。

如下所示的单个 INSERT 行序列:INSERT INTO tab_comp VALUES (item1, price1, qty1);INSERT INTO tab_comp VALUES (item2, price2, qty2);INSERT INTO tab_comp VALUES (item3, price3, qty3);可以改写成:INSERT INTO tab_comp VALUES (item1, price1, qty1),(item2, price2, qty2),(item3, price3, qty3);执行这个多行 INSERT 语句所需时间大约是执行原来三条语句的三分之一。

孤立地看,这一改进看起来似乎是微乎其微的,但是,如果这一代码段是重复执行的(例如该代码段位于循环体或触发器体中),那么改进是非常显著的。

类似地,如下所示的 SET 语句序列:SET A = expr1;SET B = expr2;SET C = expr3;可以写成一条 VALUES 语句:VALUES expr1, expr2, expr3 INTO A, B, C;如果任何两条语句之间都没有相关性,那么这一转换保留了原始序列的语义。

为了说明这一点,请考虑:SET A = monthly_avg * 12;SET B = (A / 2) * correction_factor;将上面两条语句转换成:VALUES (monthly_avg * 12, (A / 2) * correction_factor) INTO A, B;不会保留原始的语义,因为是以“并行”方式对 INTO 关键字之前的表达式进行求值的。

DB2存储过程创建、系统表

DB2存储过程创建、系统表

DB2存储过程创建、系统表前段时间做了数据表拆分,进⾏数据迁移,⽤到⼀些SQL命令,语句记录下来db2look是DB2⽤于⽣成数据库DDL语句的⼀个⼯具:命令:db2look -d DBname -a -e -p -i userID -w password -o d:\sample.sqldb2look -d:数据名称 -e:抽取复制数据库所需DDL -t:⽣成指定表统计信息 pjnl参数⽐较多这边就没列举,主要⽤到以上就可以查询到DDL。

DB2 系统表⽬录视图描述查询实例SYSCAT.CHECKS检查约束包含⼀⾏记录select constname, tabname, text from syscat.checksSYSCAT.COLCHECKS检查约束所引⽤的每⼀列包含⼀⾏记录select constname, tabname, colname, usage from syscat.colchecksSYSCAT.COLUMNS指明⼀列是可为空(Y)还是不可为空(N)select tabname, colname, nulls from syscat.columns where nulls = 'N'select sum(length) from syscat.columns where tabname='';查看列⼤⼩SYSCAT.CONSTDEP为某些其他对象上的约束的每个依赖性包含⼀⾏记录select constname, tabname, btype, bname from syscat.constdepSYSCAT.INDEXES为每个索引包含⼀⾏记录select tabname, uniquerule, made_unique, system_required from syscat.indexesSYSCAT.KEYCOLUSE查看表主键select constname, tabname, colname, colseq from syscat.keycoluseSYSCAT.REFERENCES为每个参照约束包含⼀⾏记录select constname, tabname, refkeyname, reftabname, colcount, deleterule, updaterule from syscat.referencesSYSCAT.TABCONST为每个惟⼀(U)主键(P)外键(F)或表检查(K)约束包含⼀⾏记录select constname, tabname, type from syscat.tabconstSYSCAT.TABLES该表的⽗表数⽬(该表在其中充当⼦表的参照约束数⽬)select tabname, parents from syscat.tables where parents > 0SYSCAT.TABLES该表的⼦表数⽬(该表在其中充当⽗表的参照约束数⽬)select tabname, children from syscat.tables where children > 0SYSCAT.TABLES该表的⾃引⽤参照约束数⽬(该表在其中既充当⽗表⼜充当⼦表的参照约束数⽬)select tabname, selfrefs from syscat.tables where selfrefs > 0SYSCAT.TABLES在该表上所定义的惟⼀约束(除了主键)的数⽬select tabname, keyunique from syscat.tables where keyunique > 0SYSCAT.TABLES在该表上所定义的检查约束的数⽬select tabname, checkcount from syscat.tables where checkcount > 0db2存储过程创建如果是在DBVisualizer⼯具创建需要这样--/CREATE PROCEDURE PROC_JNL(IN IN_TRANSDATE DATE,IN NUM INTEGER)LANGUAGE SQLP1: BEGINDECLARE V_MAX_PJNL INTEGER;DECLARE V_MIN_PJNL INTEGER;DECLARE V_COUNT INTEGER;SELECT MAX(JNLNO),MIN(JNLNO) INTO V_MAX_PJNL,V_MIN_PJNL FROM PJNL_HIS WHERE TRANSDATE > IN_TRANSDATE;SET V_COUNT= V_MIN_PJNL;P2: BEGINWHILE V_MIN_PJNL<=V_MAX_PJNL DOSET V_COUNT=V_MIN_PJNL+NUM;--每次进来检查是否⼤于最⼤值IF V_MIN_PJNL > V_MAX_PJNL THENSET V_COUNT=V_MAX_PJNL+1;END IF;INSERT INTO PJNL SELECT*FROM PJNL_HIS WHERE JNLNO >=V_MIN_PJNL and JNLNO < V_COUNT;commit;INSERT INTO PJNLDATA SELECT*FROM PJNLDATA_HIS WHERE JNLNO >=V_MIN_PJNL and JNLNO <V_COUNT;commit;SET V_MIN_PJNL=V_MIN_PJNL+NUM;END WHILE;END P2;END P1/执⾏⽅式: CALL PROC_JNL('2017-10-10',50000);DB2有五种约束:NOT NULL 约束是这样⼀种规则,它防⽌在表的⼀列或多列中输⼊空值。

DB2存储过程学习笔记资料

DB2存储过程学习笔记资料

创建:db2-td@-vf createSQLproc.db2--end@ (此处的@可替换成其他符号)调用:db2call过程名(参数)1 基础--声明变量:DECLARE<variable-name><data-type><DEFAULT constant>--赋值:SET x=10;SET y=(SELECT SUM(c1)from T1);VALUES10INTO x;SELECT SUM(c1)INTO y from T1;--会话全局变量:CREATE VARIABLE var_name DATATYPE[DEAFULT value];2 、数组2.1定义CREATE TYPE mynames as VARCHAR(30)ARRAY[];--定义数组2.2声明DECLARE nameArr mynames;--声明数组2.3赋值SET TESTARR=ARRAY[1,2,3,4,5,6,7,8,9,10];SET TESTARR=ARRAY[VALU ES(1),(2)];--方法1,使用SET语句SELECT SUM(NUM)INTO TESTARR[1]FROM(VALUES(1),(2))AS TEMP(NU M);--方法2,使用VALUES INTO语句VALUES1INTO TESTARR[1];--方法3,使用SELECT INTO语句SET TESTARR[1]=1;--方法4,使用ARRAY构造函数2.4操作数组的函数ARRAY_DELETE:删除数组元素TRIM_ARRAY:从右开始删除指定数目个元素ARRAY_FIRST:返回数组中第一个元素ARRAY_LAST:返回数组中最后一个元素ARRAY_NEXT:返回数组下一个元素ARRAY_PRIOR:返回数组前一个元素ARRAY_VARIABLE:返回参数指定的元素ARRAY_EXISTS:判断数组是否有元素CARDINALITY:返回数组中元素的个数MAX_CARDINALITY:返回数组中元素的个数UNNEST:将数组转换为表3 复合语句语法:label:BEGIN[ATOMIC|NOT ATOMIC]--ATOMIC关键字封装的复合语句被当作一个处理单元--变量声明、过程逻辑等END label4流程控制--条件判断IFIF<condition>THEN<SQL procedure statement>;ELSEIF<condition>THEN<SQL procedure statement>;ELSE<SQL procedure statement>;END IF;IF FRIEND='张三'THENSET MSG='你好,张三';ELSEIF FRIEND='李四'THENSET MSG='你好,李四';ELSESET MSG='对不起,我不认识你';END IF;--循环WhileWHILE<condition>DO<sql statements>;END WHILE;WHILE I<=10DOSET NUM=NUM+I;SET I=I+1;END WHILE;--循环forFOR<loop_name>AS<sql statements>DO<sql statements>;END FOR;FOR TEST AS SELECT I FROM(VALUES(1),(2),(3))AS TEMP(I)DOSET NUM=NUM+I;END FOR;--循环LOOPLABEL:LOOP<sql statements>;LEAVE LABEL;END LOOP LABEL;TEST_LOOP:LOOPSET NUM=NUM+I;SET I=I+1;IF I>10THENLEAVE TEST_LOOP;END IF;END LOOP TEST_LOOP;--循环RepeatREPEAT<sql statements>;UNTIL<condition>END REPEAT;REPEATSET NUM=NUM+I;SET I=I+1;UNTIL I>10END REPEAT;--其他关键字ITERATE label--。

DB2编程序技巧(doc20)10页

DB2编程序技巧(doc20)10页

DB2编程序技巧1 DB2编程1.1 建存储过程时CREATE 后一定不要用TAB键 3 1.2 使用临时表 31.3 从数据表中取指定前几条记录 31.4 游标的使用 4注意commit和rollback 4游标的两种定义方式 4修改游标的当前记录的方法 51.5 类似DECODE的转码操作 51.6 类似CHARINDEX查找字符在字串中的位置 5 1.7 类似DATEDIF计算两个日期的相差天数 51.8 写UDF的例子 51.9 创建含IDENTITY值(即自动生成的ID)的表 6 1.10 预防字段空值的处理 61.11 取得处理的记录数 61.12 从存储过程返回结果集(游标)的用法 61.13 类型转换函数 81.14 存储过程的互相调用 81.15 C存储过程参数注意 81.16 存储过程FENCE及UNFENCE 81.17 SP错误处理用法 91.18 IMPORT用法 91.19 VALUES的使用 91.20 给SELECT 语句指定隔离级别 101.21 ATOMIC及NOT ATOMIC区别 102 DB2编程性能注意 102.1 大数据的导表 102.2 SQL语句尽量写复杂SQL 102.3 SQL SP及C SP的选择 102.4 查询的优化(HASH及RR_TO_RS) 112.5 避免使用COUNT(*) 及EXISTS的方法 113 DB2表及SP管理 123.1 看存储过程文本 123.2 看表结构 123.3 查看各表对SP的影响(被哪些SP使用) 123.4 查看SP使用了哪些表 123.5 查看FUNCTION被哪些SP使用 123.6 修改表结构 124 DB2系统管理 134.1 DB2安装 134.2 创建DATABASE 144.3 手工做数据库远程(别名)配置 144.4 停止启动数据库实例 144.5 连接数据库及看当前连接数据库 144.6 停止启动数据库HEAD 154.7 查看及停止数据库当前的应用程序 154.8 查看本INSTANCE下有哪些DATABASE 154.9 查看及更改数据库HEAD的配置 164.9.1 改排序堆的大小 164.9.2 改事物日志的大小 164.9.3 出现程序堆内存不足时修改程序堆内存大小 164.10 查看及更改数据库实例的配置 164.10.1 打开对锁定情况的监控。

DB2编程序技巧(doc 20页)

DB2编程序技巧(doc 20页)

DB2编程序技巧(doc 20页)DB2编程序技巧1 DB2编程1.1 建存储过程时CREATE 后一定不要用TAB键 3 1.2 使用临时表 31.3 从数据表中取指定前几条记录 31.4 游标的使用 4注意commit和rollback 4游标的两种定义方式 4修改游标的当前记录的方法 51.5 类似DECODE的转码操作 51.6 类似CHARINDEX查找字符在字串中的位置 5 1.7 类似DATEDIF计算两个日期的相差天数 51.8 写UDF的例子 51.9 创建含IDENTITY值(即自动生成的ID)的表 6 1.10 预防字段空值的处理 61.11 取得处理的记录数 61.12 从存储过程返回结果集(游标)的用法 61.13 类型转换函数 81.14 存储过程的互相调用 84 DB2系统管理 134.1 DB2安装 134.2 创建DATABASE 144.3 手工做数据库远程(别名)配置 144.4 停止启动数据库实例 144.5 连接数据库及看当前连接数据库 144.6 停止启动数据库HEAD 154.7 查看及停止数据库当前的应用程序 154.8 查看本INSTANCE下有哪些DATABASE 154.9 查看及更改数据库HEAD的配置 164.9.1 改排序堆的大小 164.9.2 改事物日志的大小 164.9.3 出现程序堆内存不足时修改程序堆内存大小 16 4.10 查看及更改数据库实例的配置 164.10.1 打开对锁定情况的监控。

164.10.2 更改诊断错误捕捉级别 174.11 DB2环境变量 174.12 DB2命令环境设置 174.13 改变隔离级别 174.14 管理DB\INSTANCE的参数 184.15 升级后消除版本问题 184.16 查看数据库表的死锁 181 DB2编程1.1 建存储过程时Create 后一定不要用TAB键create procedure的create后只能用空格,而不可用tab健,否则编译会通不过。

DB2 SQLJ 存储过程开发宝典,第 2 部分_217_IT168文库

DB2 SQLJ 存储过程开发宝典,第 2 部分_217_IT168文库

DB2 SQLJ 存储过程开发宝典,第 2 部分简介: 在第 1 部分,我们已经介绍了 SQLJ 存储过程的基本知识,如何逐步完成开发和调试。

现在,我们将总结说明在运行 SQLJ 存储过程时,经常遇到的错误,并对这些错误产生的原因进行分析,并给出相应的修正方法。

此外,在开发过程中,有一些值得考虑或者需要进一步说明的问题,我们也将他们罗列出来,予以探讨。

引言在第 1 部分,我们已经介绍了 SQLJ 存储过程的基本知识,如何逐步完成开发和调试。

现在,我们将总结说明在运行 SQLJ 存储过程时,经常遇到的错误,并对这些错误产生的原因进行分析,并给出相应的修正方法。

此外,在开发过程中,有一些值得考虑或者需要进一步说明的问题,我们也将他们罗列出来,予以探讨。

常见错误总结由于程序代码本身、运行环境、参数配置等原因,SQLJ 存储过程在被调用时,可能会发生各种错误。

对这些错误进行分析,明确其产生的原因,找到相应的应对措施,并加以归纳总结,对我们提高开发水平、保证产品质量和提高工作效率等方面具有重要的意义。

这些信息对于 SQLJ 应用开发的初学者尤为重要,能够直接的帮助他们解决开发实际工作中遇到的问题,表 1 列出了常见的 SQLJ 存储过程运行错误,原因以及相应措施。

表 1. 常见错误错误原因措施SQL4306N Java 存储过程或用户定义的函数 名称(特定名称 特定名称)不能调用 Java 方法 方法,特征符为 字符串 DB2 通过 JAR 包名、类名、方法名和签名(Signature )无法找到创建存储过程时指定的被调用的方法。

可能是引用的类不存在、jar 包没有安装、方法声明的参数列表与数据库期望的参数列表不匹配或者不是“public”实例方法 1.查看 Java 代码中的方法名和类名,检查存储过程DDL 中 Java 方法名、类名和 jar 包名是否有误; 2.检查 jar/calss 文件是否在指定位置,如 sqllib/function 目录下; 3.检查存储过程 DDL 中的方法参数列表是否与 Java 代码匹配(使用 javap – s class_id 可以查看类中方法的签名),并且 Java 代码中该方法是 public的。

DB2存储过程精简教程

DB2存储过程精简教程

如果没有明确声明 allowed-SQL,其默认值是 MODIFIES SQL D ATA。不同类型的存储过程执行的效率是不同的,其中 NO SQL 效率最好,MODIFIES SQL DATA 最差。如果存储过程只是读取 数据,但是因为没有声明 allowed-SQL 使其被当作对数据进行修 改的存储过程来执行,这显然会降低程序的执行效率。因此创建存 储过程时,应当明确声明其 allowed-SQL。
数据类型使用存储过程的优点储存过程的结构参数定义变量定义赋值语句条件控制语句循环语句常用操作符异常处理游标使用动态游标使用session临时表使用定长型字符串char变长型字符串varchar整数类型smallintintegerbigint带小数点的数字类型decimalrealdouble时间类型datetimetimestamp对象类型blobclobdbclob减少客户机与服务器之间的网络使用率
20
异常处理4
若SQL PROCEDURE语句执行后出错,引起SQLEXCEPTION条件,且 定义了相应条件的handler,则DB2将控制交给相应handler,若handler运 行成功,则SQLCODE及SQLSTATE重置为0及’00000’;若未定义handl er,则DB2中止PROCEDURE并返回CLIENT。 需要注意的是,任何语句的成功执行都会将SQLCODE、SQLSTATE重 置为0,’00000’。若需要截获出错代码,唯一的方法是在handler的第一条 语句将其中的一个值保存在变量中,如: DECLARE CONTINUE HANDLER for SQLEXCEPTION SET Saved_SQLCODE = SQLCODE; 若PROCEDURE中需要向客户端返回用户错误信息,可使用SIGNAL:

DB2_存储过程执行计划的查看及监控方法

DB2_存储过程执行计划的查看及监控方法

DB2_存储过程执行计划的查看及监控方法一,编写存储过程。

[db2inst1@db2lab ~]$ cattest.sqlcreate procedure sales_status(in quota integer)dynamic result sets 2languagesqlbegindeclare SQLSTATE char(5);declarers cursor with return forselect * from t1;openrs;end@二,建立存储过程[db2inst1@db2lab~]$**************DB20000I The SQL command completed successfully.三,执行存储过程[db2inst1@db2lab ~]$ db2 "call sales_status(1)"Result set 1--------------ID-------1.1 record(s) selected.Return Status = 0四,利用表函数MON_GET_PKG_CACHE_STMT抓取static的信息,获取PACKAGE_NAME及SQL语句[db2inst1@db2lab ~]$ db2 "selectPACKAGE_NAME,SECTION_NUMBER,EXECUTABLE_IDfrom TABLE(MON_GET_PKG_CACHE_STMT ( 'S', NULL, NULL, -1)) as T" PACKAGE_NAMESECTION_NUMBER EXECUTABLE_ID -------------------------------------------------------------------------------------------------------------------------------- -------------------- -------------------------------------------------------------------P04624831x'0100000000000000BE01000000000000010000000100201 40415004624839232' 1 record(s) selected.五,利用EXECUTABLE_ID,获取SQL语句[db2inst1@db2lab ~]$ db2 "SELECT STMT_TEXT FROMTABLE(MON_GET_PKG_CACHE_STMT> (null,x'0100000000000000BE01000000000000010000000100201 40415004624839232', null, -2))"STMT_TEXT-------------------------------------------------------DECLARE RS cursor with return forselect * from T1 where ID = :HV00008 :HI000081 record(s) selected.六,查看package_name信息,valid列信息需要重点关注,信息中心解释如下:N = Needs rebindingV = Validate at run timeX = Package is inoperative because some function instance on which it depends has been dropped; explicit rebind is needed Y = Valid[db2inst1@db2lab ~]$ db2 list packages for all |grep -iP0462483Bound Total Isolation Package Schema Version by sections Valid Format level Blocking----------- --------- ----------- --------- ------------- ------- -------- --------- --------P0462483 DB2INST1 DB2INST1 1Y 0 CS U七,获取该package_name的执行计划信息[db2inst1@db2lab ~]$ db2expln -d pos -g -c db2inst1 -p P0462483 -s 0 -tDB2 Universal Database Version 9.7, 5622-044 (c) Copyright IBM Corp. 1991, 2008 Licensed Material - Program Property of IBMIBM DB2 Universal Database SQL and XQUERY Explain Tool ******************** PACKAGE ***************************************Package Name = "DB2INST1"."P0462483" Version =Prep Date = 2014/04/15Prep Time = 00:46:24Bind Timestamp = 2014-04-15-00.46.24.839232Isolation Level = Cursor StabilityBlocking = Block Unambiguous CursorsQuery Optimization Class = 5Partition Parallel = NoIntra-Partition Parallel = NoSQL Path = "SYSIBM", "SYSFUN", "SYSPROC", "SYSIBMADM", "DB2INST1"-------------------- SECTION ---------------------------------------Section = 1Statement:DECLARE RS cursorwith returnforselect *from T1where ID =:HV00008 :HI00008Section Code Page = 1208Estimated Cost = 7.569436Estimated Cardinality = 1.000000Access Table Name = DB2INST1.T1 ID = 2,4| #Columns = 1| Skip Inserted Rows| Evaluate Block/Data Predicates Before Locking Committed Row| May participate in Scan Sharing structures| Scan may start anywhere and wrap, for completion| Fast scan, for purposes of scan sharing management| Scan can be throttled in scan sharing management| Relation Scan| | Prefetch: Eligible| Lock Intents| | Table: Intent Share| | Row : Next Key Share| Sargable Predicate(s)| | #Predicates = 1| | Return Data to Application| | | #Columns = 1Return Data CompletionEnd of sectionOptimizer Plan:RowsOperator(ID)Cost1RETURN( 1)7.56944|1TBSCAN( 2)7.56944|1Table:DB2INST1T1总结:DB2的执行计划变化较多,不经常runstats和rebind的时候,有可能本地执行计划很好,但在实际生产环境上执行计划较差,这需要DBA能抓取实时SQL执行计划,静态sql通过上述方式抓取,动态sql需要借助db2expln的cache选项抓取,来分析sql的消耗情况Dynamic Statement Options:-cache ,,,= Retrieve the statement identified by the given IDsfrom the dynamic SQL cache. (The IDs can beobtained by running db2pd with the -dynamicoption.。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

DB2存储过程精简教程
DB2存储过程是一种在数据库服务器上执行的可重复使用的代码块,用于完成特定任务。

它可以接受输入参数,并返回结果。

存储过程有助于提高数据库性能和安全性。

在这篇文章中,我们将介绍如何创建和使用DB2存储过程。

一、创建存储过程
要创建存储过程,您需要先登录到DB2数据库服务器。

然后,使用CREATEPROCEDURE语句指定存储过程的名称、输入参数和返回结果。

下面是一个示例:
CREATE PROCEDURE get_employee(IN employee_id INT, OUT employee_name VARCHAR(255))
BEGIN
SELECT name INTO employee_name FROM employees WHERE id = employee_id;
END
上面的代码创建了一个名为get_employee的存储过程。

它接受一个输入参数employee_id,并通过输出参数employee_name返回相应的员工姓名。

二、执行存储过程
要执行存储过程,您可以使用CALL语句,如下所示:
CALL get_employee(1001, ?);
上面的代码将调用get_employee存储过程,并将1001作为输入参数传递。

由于我们使用了输出参数,所以使用问号来表示它。

调用语句将返回存储过程中定义的输出参数的值。

三、存储过程中的控制结构
存储过程可以包含各种控制结构,如条件语句和循环语句。

下面是一个示例:
CREATE PROCEDURE calculate_salary(IN employee_id INT)
BEGIN
DECLARE monthly_salary DECIMAL(10, 2);
DECLARE tax DECIMAL(10, 2);
SELECT salary / 12 INTO monthly_salary FROM employees WHERE id = employee_id;
IF monthly_salary > 5000 THEN
SET tax = monthly_salary * 0.2;
ELSE
SET tax = monthly_salary * 0.1;
ENDIF;
SELECT monthly_salary, tax;
END
上面的代码创建了一个名为calculate_salary的存储过程。

它接受一个输入参数employee_id,并计算出相应员工的月薪和税金。

通过使用DECLARE语句,我们可以声明变量用于存储计算结果。

使用IF语句根据月薪的大小来计算税金。

四、存储过程的安全性
存储过程可以增加数据库的安全性,因为它们可以帮助限制用户对数据库的直接访问权限。

存储过程可以由只有相应权限的用户访问,并隐藏底层表的细节。

这使得数据更加安全,并且可以更好地控制用户对数据库的访问。

为了实现存储过程的安全性,您可以给存储过程的创建者分配适当的权限,并使用GRANT语句控制其他用户对存储过程的访问权限。

总结:
DB2存储过程是一种在数据库服务器上执行的可重复使用的代码块,用于完成特定任务。

它可以接受输入参数,并返回结果。

创建存储过程需要使用CREATEPROCEDURE语句,执行存储过程使用CALL语句。

存储过程可以包含各种控制结构,如条件语句和循环语句。

存储过程可以增加数据库的安全性,因为它们可以帮助限制用户对数据库的直接访问权限。

相关文档
最新文档