DB2存储过程快速入门.

合集下载

DB2存储过程4类循环简单实例

DB2存储过程4类循环简单实例

DB2存储过程4类循环简单实例SET SCHEMA = 'DB2ADMIN';SET CURRENT PATH = "SYSIBM","SYSFUN","SYSPROC","SYSIBMADM","DB2ADMIN"; CREATE PROCEDURE "DB2ADMIN"."TEST_CIRCULATION" ( )DYNAMIC RESULT SETS 1LANGUAGE SQLNOT DETERMINISTICEXTERNAL ACTIONMODIFIES SQL DATAOLD SAVEPOINT LEVELp1: begindeclare aa varchar(10);declare bb varchar(10);declare a integer DEFAULT 0;-- 定义⼀个全局临时表tmp_hydeclare global temporary table session.tmp_hy(dm varchar(10),mc varchar(10))with replace -- 如果存在此临时表,则替换not logged; -- 不在⽇志⾥纪录-- 给临时表插⼊三条数据insert into session.tmp_hy values('1','01');insert into session.tmp_hy values('2','02');insert into session.tmp_hy values('3','03');--for隐式循环for cur1 as select dm,mc from session.tmp_hydoif cur1.dm='1' or cur1.dm='2' or cur1.dm='3' theninsert into session.tmp_hy values(cur1.mc,'隐式循环');end if;update session.tmp_hy set mc='0'||''||cur1.mc||'' where dm=cur1.dm;end for;p2: begin--简单循环declare cursor2 cursor forselect dm,mc from session.tmp_hy;OPEN cursor2;FETCH_LOOP: LOOPFETCH cursor2 INTO aa,bb;IF a >= 3 THEN -- loop until last row of the cursorLEAVE FETCH_LOOP;END IF;if aa='1' or aa='2' or aa='3' theninsert into session.tmp_hy values(bb,'简单循环');end if;set a=a+1;END LOOP FETCH_LOOP;close cursor2;end p2;set a=0;p3: begin--进⼊前检查条件declare cursor2 cursor forselect dm,mc from session.tmp_hy;OPEN cursor2;FETCH cursor2 INTO aa, bb;while a<3doif aa='1' or aa='2' or aa='3' theninsert into session.tmp_hy values(bb,'while循环');end if;set a=a+1;FETCH cursor2 INTO aa, bb;end while;close cursor2;end p3;set a=0;p4: begin--退出前检查条件declare cursor2 cursor forselect dm,mc from session.tmp_hy;OPEN cursor2;REPEATFETCH cursor2 INTO aa, bb;if aa='1' or aa='2' or aa='3' theninsert into session.tmp_hy values(bb,'REPEAT循环'); end if;set a=a+1;UNTIL a>=3end REPEAT;close cursor2;end p4;p5: begin--声明游标declare cursor1 cursor with return forselect * from session.tmp_hy;--游标对客户机应⽤程序保持打开open cursor1;end p5;end p1;。

第10章 DB2 函数、存储过程和触发器

第10章  DB2 函数、存储过程和触发器

2.聚集函数 . 聚集函数(也称为列函数)也返回一个标量值,这个值是一组输入值的计算 结果。通常情况下,这组输入值来自表中的一列,或来自VALUES子句中的元组。 聚集函数的示例包括内置函数MAX( )和MIN( )(参见本书第5章)。 3.表函数 . 表函数向引用它的 SQL 语句返回一个表。只能在SELECT语句的FROM子句中 引用表函数。但是,在能够应用于只读视图的任何操作(例如,联接、分组操作 以及UNION和INTERSECT等集操作)中,都可以使用表函数返回的表(参见本书 第5章)。 4.行函数 . 行函数返回单一表行。行函数只能供用户定义的结构化类型使用;不能单独 使用行函数,也不能在抽象数据类型的上下文之外的SQL语句中使用。 通常,行函数用于把结构化类型属性映射到由内置数据类型值组成的行,以 便能够在查询或SQL操作中访问结构化类型属性。例如,假设数据库有一个用户 定义的结构化数据类型“Manager”,此类型扩展另一个结构化数据类型 “Employee”,其中包含“Employee”和“Manager”特有的属性。如果希望在 查询中引用属性值,那么可以创建一个行函数,它把属性值转换为查询可以引用 的数据行。
【例10.4】 将“课程表”中的“成绩”的值转换为带2个小数位的格式并返 回。
SELECT 学号, 课程号, COALESCE( 成绩,0.00) AS 成绩 FROM puser.成绩表
8.日期函数 . 下面是几个常用的日期函数及其用法说明。 (1)day(date_expression) 返回date_expression中的日期值。 (2)month(date_expression) 返回date_expression中的月份值。 (3)year(date_expression) 返回date_expression中的年份值。 (4)DATEADD (datepart_expression, number, date_expression) 返回指定日期date_expression加上指定的额外日期间隔number 产生的新日 期。 (5)DATEDIFF (datepart_expression, date_expression1, date_expression2) 返回两个指定日期在datepart_expression方面的不同之处,即 date_expression2超过date_expression1的差距值,其结果值是一个带有正负号的 整数值。 (6)DATENAME (datepart_expression, date_expression) 以字符串的形式返回日期的指定部分,此部分由datepart_expression来指定。 (7)DATEPART (datepart_expression, date_expression) 以整数值的形式返回日期的指定部分,此部分由datepart_expression来指定。

db2存储过程动态游标及函数返回值总结

db2存储过程动态游标及函数返回值总结

db2存储过程动态游标及函数返回值总结DB2存储过程是一种在数据库服务器上执行的事务处理程序,它可以包含SQL语句、控制结构和变量。

在存储过程中,我们经常会使用动态游标和函数返回值来实现一些特定的功能。

下面是关于DB2存储过程中动态游标和函数返回值的总结。

一、动态游标1.动态游标是在存储过程中动态定义的一种游标,它可以根据不同的条件进行查询,并返回满足条件的结果集。

动态游标的定义和使用步骤如下:1.1定义游标:使用DECLARECURSOR语句定义游标,并指定游标的名称和返回结果集的查询语句。

1.2打开游标:使用OPEN语句打开游标,并执行查询语句,将结果集保存在游标中。

1.3获取数据:使用FETCH语句获取游标中的数据,并进行相应的处理。

1.4关闭游标:使用CLOSE语句关闭游标,释放资源。

2.动态游标的优势:2.1灵活性:动态游标可以根据不同的条件查询不同的结果集,满足特定的业务需求。

2.2可读性:通过使用动态游标,可以使存储过程的代码更加清晰和易于理解。

2.3性能优化:动态游标可以根据实际情况进行优化,提高查询性能。

3.动态游标的注意事项:3.1游标的生命周期:动态游标的生命周期是在存储过程执行期间,一旦存储过程结束,游标也会自动关闭。

3.2游标的维护成本:动态游标的使用需要消耗一定的系统资源,所以在使用动态游标时需要注意资源的管理。

二、函数返回值1.函数返回值是存储过程中的一个重要特性,它可以将计算结果返回给调用者。

DB2支持返回多个值的函数,可以通过函数返回表、游标或者多个标量值来实现。

2.函数返回值的定义和使用步骤如下:2.1定义函数返回值:在存储过程中使用RETURNS子句定义函数返回的数据类型。

2.2设置函数返回值:在存储过程中使用SET语句设置函数返回的值。

2.3使用函数返回值:在调用存储过程时,可以使用SELECT语句或者VALUES语句获取函数返回的值。

3.函数返回值的优势:3.1灵活性:函数返回值可以根据实际需求返回不同的结果,满足不同的业务场景。

db2基础入门

db2基础入门

1DB2基础,入门一.安装DB2有三个选择,可以企业版,也可以只安装客户端。

安装完成后,打开”控制中心”可以操作整个DB2,打开”信息中心”可以查看相应的帮助文档.,二.安装Quest Central for DB2这两个软件都不需要配置,只要不断点下一步就可以安装成功,安装完成后会在桌面上生成一个Knowledge Xpert for DB2快捷方式.这就是它的帮助文档.三.在按制中心创建一个实例1.首先打开DB2“控制中心”,右击“我以编目的系统”,再选择添加,会出现如下页面,单击“发现”然后选择相应主机,会自动填入如下项,最后确定。

2.设置主机:右击刚才新建的实例,出现如下页面,节点名为随意字符,不过必须为1-8个字节,我们这里假设为TEST,创建实例服务名可以不填,端口是50000(DB2默认的端口),然后确定。

3,连接相应的数据库实例:右击TEST,添加,选择相应的数据库实例,点击发选择你需要的数据库,当要操作相应数据库时会提示输入用户名,密码.四.创建数据库1.选择数据库,右击选择”创建”选择”使用向导创建数据库”(注意“建库时务必工”区域“中选择编码方式为utf-8,否则当插入中文时,会有意想不到的错误提示,最典型的就是提示JDK版本不兼容)2.分别填入数据名称,用户表,也可以直接填入数据库名称,点完成.3.创建表的方式和数据库创建类似,其中显示表的时候可以创建过虑器.如果我想隐藏系统表,设置表名为not like sys%五.Quest Central for DB2使用1.简介:Quest Central for Databases 是一种集成化、图形化、跨平台的数据库管理解决方案,可以管理异构环境下的 Oracle、DB2数据库。

Quest Central for Databases 消除了企业IT 人员管理多种数据库时面临的技术障碍,提高了IT人员工作效率,改善了数据库性能和数据库应用的可用性2.使用SQL Editor: 打开Quest Central for db2,点击菜单栏的Tools,选择SQL Editor3.使用Edit tools: Edit除了菜单栏分为两个主要模块,上面用于执行的SQL语句,下面用于显示执行情况以及输出信息,点击左上角的执行按钮,执行SQL六.数据类型说明自己的一些总结:1.DB2没有Boolean型。

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

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

一,编写存储过程。

[db2inst1@db2lab ~]$ cat test.sqlcreate procedure sales_status(in quota integer)dynamic result sets 2language sqlbegindeclare SQLSTATE char(5);declare rs cursor with return forselect * from t1;open rs;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'0100000000000000BE0100000000000001000000010020140415004624839232' 1 record(s) selected.五,利用EXECUTABLE_ID,获取SQL语句[db2inst1@db2lab ~]$ db2 "SELECT STMT_TEXT FROMTABLE(MON_GET_PKG_CACHE_STMT> (null,x'0100000000000000BE0100000000000001000000010020140415004624839232', null, -2))"STMT_TEXT-------------------------------------------------------DECLARE RS cursor with return forselect * from T1 where ID = :HV00008 :HI000081 record(s) selected.六,查看package_name信息,valid列信息需要重点关注,信息中心解释如下:•N = Needs rebinding•V = Validate at run time•X = 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 -i P0462483Bound 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 <anchID>,<stmtUID>,<envID>,<varID>= Retrieve the statement identified by the given IDsfrom the dynamic SQL cache. (The IDs can beobtained by running db2pd with the -dynamicoption.。

DB2使用手册

DB2使用手册

DB2使⽤⼿册第⼀部分DB2系统管理命令1. Db2有域,实例,和数据库三层的概念。

2.查看数据库服务器中有⼏个数据库。

包括⽹络中数据库的引⽤。

进⼊数据库安装⽬录下的bin⽬录:C:\Program Files\IBM\SQLLIB\BIN执⾏db2 list database directory命令3.查看命令选项说明list command options4.查看运⾏的数据库服务器中关联了多少个引⽤程序对数据库的访问。

进⼊数据库安装⽬录下的bin⽬录:C:\Program Files\IBM\SQLLIB\BINdb2 list applications命令可以通过db2 force application(进程id) 杀死对应的进程。

5.如何强制断开应⽤程序和数据库的连接。

进⼊数据库安装⽬录下的bin⽬录:C:\Program Files\IBM\SQLLIB\BIN⾏下列的命令 db2 force applications 可以强制断开应⽤程序和数据库的连接。

6.如何备份数据库进⼊db2的操作环境,然后运⾏backup database 数据库别名 user ⽤户名 using 密码命令7.停⽌数据库的服务器。

进⼊数据库安装⽬录下的bin⽬录:C:\Program Files\IBM\SQLLIB\BIN或db2操作环境中,如果在db2操作环境中必须通过的db2 terminate命令终结db2操作环境中启动的所有⼦进程(即停⽌所有命令⾏处理器回话)再执⾏db2stop命令。

注意:在执⾏此命令的时候,必须没有应⽤程序或⽤户和数据库连接。

可以在执⾏停⽌命令之前查看于db2服务器连接的应⽤程序和⽤户。

然后执⾏牵制断开命令断开连接的数据库和⽤户。

8.如何从旧版本中把数据库迁移到新的安装版本中(在新版数据库种运⾏下列代码)1. 验证数据库是否可以被迁移。

⽤db2ckmig命令,db2ckmig /e 数据库别名 /l 验证信息保存路径 /u ⽤户名 /p 密码1. 执⾏数据库的迁移命令MIGRATE database 数据库别名 user ⽤户名 using 密码命令9.启动DB2服务器进⼊数据库安装⽬录下的bin⽬录:C:\Program Files\IBM\SQLLIB\BIN或db2操作环境中执⾏db2start命令10.关于命令⾏编辑器的使⽤使⽤命令⾏编辑器之前要连接到⼀个数据库。

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 存储过程联邦注意事项下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。

文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!本店铺为大家提供各种类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you! In addition, this shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!DB2存储过程联邦注意事项在使用DB2数据库管理系统中,存储过程是一种经常用于执行一系列数据库操作的编程对象。

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

1.1 SQL过程的结构 命名规则: 1、清洗过程名称命名: PROC_业务主题_目标表(PROC_JY_KJYRLJB 交易主题的卡交易日类聚表) 2、函数名称命名: PROC_业务主题_函数名(PROC_JY_GETYWZL 交易主题取得卡业务种类函数)

3、变量命名: VAR_变量描述(VAR_YWZL 业务种类变量) 4、游标命名: CUR_游标描述(CUR_KJYB 对卡交易表进行游标处理) 语法: CREATE PROCEDURE 过程名称 (参数列表 DYNAMIC RESULT SETS 结果集数量 是否允许SQL LANGUAGE SQL BEGIN SQL 过程体 END 范例“资产负债.sql ”中 第1行:Create Procedure admin.BalanceSheetDayly定义了过程名称 参数列表为Out ProcState varchar(100 其定义SQL 过程从客户应用获取,或返回客户应用的0个或多个参数,参数列表使用逗号侵害各个参数

参数类型有三种: l IN 从客户应用检索值。其不能够在SQL 过程体中修改 l OUT 向客户应用返回值 l INOUT 从客户应用检索值,并返回值 省略了结果集数量的定义,default 为0。即表示不返回结果集。 省略了是否允许SQL 的说明。其值指出了存储过程是否会使用SQL 语句,如果使用,其类型如何:

l NO SQL 不能够执行任何SQL 语句 l COTAINS SQL 可以执行不会读取SQL 数据,也不会修改SQL 数据的SQL 语句

l READS SQL DATA 可以包含不会修改SQL 数据的SQL 语句 l MODIFIES SQL DATA 可以执行任何SQL 语句,除了不能够在存储过程中支持的语句以外。 第3~7行,为注释,标明此为SQL 过程,编写、最后修改时间。注释为“--”开始的行。 第8行和最后一行199共同标识出SQL 过程体

过程体存储过程的逻辑内容,包括变量声明、条件控制、流控制语句、以及通过SQL

语句处理数据的过程。 另例: CREATE PROCEDURE bbgs_to_testinfo (IN var0 INTEGER , out ret INTEGER , out ret_str varchar(5, OUT errorLabel CHAR(32

SPECIFIC bbgs_to_testinfo RESULT SETS 1 LANGUAGE SQL 此定义为创建名为bbgs_to_testinfo的存储过程。它有4个参数:第一个IN 参数是INTEGER 类型,第一个OUT 参数是INTEGER 类型,第二个OUT 参数是VARCHAR(5类型,第三个OUT 参数是CHAR(32类型。指定的别名为bbgs_to_testinfo,将返回一个结果集。

1.2 SQL过程体 1.2.1 声明、设置变量 第9~61行。 必须在SQL 过程体的第一部分中声明变量。必须指定惟一的标识符,声明SQL 数据类型、并且可以先把指定变量的初始值。变量声明的语法如下:

DECLARE 标识符 SQL 数据类型 [DEFAULT 默认值] 1、SQLCODE 、SQLSTATE 变量 13~14行。 用于在SQL 过程中处理错误和排错问题。它们的值代表了SQL 过程体中最后使用的SQL 过程体中最后使用的SQL 语句的返回值。

2、游标申明 37~49行。 declare curAsset cursor with hold for 3、条件处理器 50~61行。 当SQL 语句返回超过00000的SQLSTATE 值时,会产生一个条件,表示出现了错误、数据没有找到或者警告。

条件处理器可以决定SQL 过程将如何响应一个或多个已定义的条件或预定义条件组。其语法如下:

DECALRE 数据类型 HANDLER FOR 条件[,…] 其有三种处理类型: l CONTINUE 处理器操作完成后,继续执行产生这个条件的语句之后的下一条语句。 l EXIT 处理器操作完成后,SQL 过程将终止,并将控制返回给调用者。

l UNDO 处理器操作执行之前,DB2将回滚SQL 过程中执行的SQL 操作。完成后,SQL 过程将终止,并将控制返回给调用者。

其预定义了3个类的条件: l NOT FOUND 标识导致SQLCODE 值为+100或SQLSTATE 值为02000的条件。一般在使用SELECT 语句时出现。

l SQLEXCEPTION 标识导致SQLCODE 值为负的条件 l SQLWARNING 警告条件或导致SQLCODE>100的条件 1.2.2 控制结构流 常用的结构: 1、 SET 为输出参数或者SQL 变量赋值。 例如: set at_end=0;(66行 set vProcState=char(0||'00000 Success'; (164行 set vBal302=vBal302+vBal;(89行 2、 IF IF 条d … ELSEIF 条件2 THEN … ELSE … END IF; 3、 LOOP 多次执行一个代码块,直到LEAVE(跳出循环 、ITERATE(跳至标签循环的开始 、GOTO(跳至指定标签块 。

例如: 76~161行,请注意其中的76、77、152、153、161行,它们与51~55行的条件处理器一同控制着循环流程。

4、 WHILE WHILE 条件 DO … END WHILE; 5、 CASE 基于一个或多个条件的评估选择执行路径,WHEN 子句将直接值与CASE 表达式中规定的变量进行比较。

例如: 87~128行 1.2.3 在SQL 过程体中使用SQL 语句 1、 直接使用 过程体中可以直接使用SQL 语句。 例如: 第62行:select date(days(admin.SystemState.dtTransDate+1 into today from admin.SystemState;

查询得到的结果将通过into 的方式赋给SQL 过程变量today 。 第90行:insert into admin.fSubjectBalanceSheet values ( vDateCode ,vNodeCode, vCurrencyCode, '01170', vBal ;

向表插入一条记录。 2、 使用结果集 具体步骤如下: 1 声明游标 语法: DECLARE 游标名 CURSOR WITH HOLD FOR SELECT 语句; WITH HOLD表示打开游标保留打开状态,且这个游标定位在结果表的下一逻辑行的前面; 还可以用WITH RETURN指定此游标用作存储过程中返回的结果集合。

例如: 37~49行,declare curAsset cursor with hold for…;定义了curAsset 游标。 2 为结果集打开游标 打开游标,以便于它可以用于从其结果表中提取行。 语法: OPEN 游标名; 例如: 69行,open curAsset; 3 从结果集中取得查询数据 使用FETCH 语句,它将游标定位在其结果表中的下一行上,并给主机变量分配这个行的值。 语法:

FETCH 游标名 INTO 主机变量 例如: 70~72行 FETCH curAsset INTO vNodeCode,vCurrencyCode,vBalSubjItemCode,vBal; if at_end<>0 then goto Exit1; end if; 此例应与51~55行的条件处理器一起理解。 当正常取到数据时,将游标的结果表中的数据赋给INTO 后的主机变量列表中的对应变量。 如果游标定位于结果表的未端(结果表为空时也是 时,将产生一个NOT FOUND条件,根据51~55行的声明,将在处理器操作中改变vProcState 和at_end的值。处理器操作完成后,继续处理下面的语句71行。

4 关闭结果集 当游标使用完后,需要将其关闭。 语法: CLOSE 游标名 例如: 162行,close curAsset; 如果CREATE PROCEDURE语句中的定义的返回结果集个数不为0,且此结果集需要被返回给调用者时,则不能够被关闭。

3、 使用动态SQL 语句 具体步骤如下: 1 通过DECLARE 语句声明VARCHAR 类型变量作为SQL 语句字符串 例如:第9行,declare stmt varchar(1000; declare stmt1 varchar(1000; 2 给SQL 语句字符串 赋值。用户不能够在语句字符串中直接包含变量,相反,必须使用?作为在语句中所使用的变量的参数标记符。

例如: 第63行,set stmt='delete from admin.fSubjectBalanceSheet'; set stmt1 = 'insert into test_info values( ? ,? '; 3 使用PREPARE 语句从语句字符串中生成经过准备的语句。 例如: 第64行,prepare DelStmt from stmt; prepare ps from stmt;

相关文档
最新文档