DB2存储过程快速入门.
- 格式:doc
- 大小:44.50 KB
- 文档页数:22
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;。
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灵活性:函数返回值可以根据实际需求返回不同的结果,满足不同的业务场景。
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型。
一,编写存储过程。
[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系统管理命令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关键字的使用)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 存储过程联邦注意事项下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。
文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!本店铺为大家提供各种类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,想了解不同资料格式和写法,敬请关注!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数据库管理系统中,存储过程是一种经常用于执行一系列数据库操作的编程对象。
DB2学习总结(1)——DB2数据库基础⼊门DB2的特性完全Web使能的:可以利⽤HTTP来发送询问给服务器。
⾼度可缩放和可靠:⾼负荷时可利⽤多处理器和⼤内存,可以跨服务器地分布数据库和数据负荷;能够以最⼩的数据丢失快速地恢复,提供多种备份策略。
DB2数据库启停启动数据库:db2start停⽌数据库:db2stop检查存在的数据库LIST DATABASE DIRECTORY数据库连接、断开CONNECT TO databasenameCONNECT RESET创建、删除数据库CREATE DB databasename注:如果已经连着⼀个数据库的话,就创建不了数据库,会报“应⽤程序已经与⼀个数据库相连”的错DROP DB databasename第⼆节表数据类型可分为数值型(numeric)、字符串型(character string)、图形字符串(graphic string)、⼆进制字符串型(binary string)或⽇期时间型(datetime)。
还有⼀种叫做DATALINK的特殊数据类型。
DATALINK值包含了对存储在数据库以外的⽂件的逻辑引⽤。
数值型数据类型包括:⼩整型,SMALLINT:两字节整数,精度为5位。
范围从-32,768到32,767。
⼤整型,INTEGER或INT:四字节整数,精度为10位。
范围从-2,147,483,648到2,147,483,647。
巨整型,BIGINT:⼋字节整数,精度为19位。
范围从-9,223,372,036,854,775,808到9,223,372,036,854,775,807。
⼩数型,DECIMAL(p,s)、DEC(p,s)、NUMBERIC(p,s)或NUM(p,s):⼩数型的值是⼀种压缩⼗进制数,它有⼀个隐含的⼩数点。
压缩⼗进制数将以⼆-⼗进制编码(binary-coded decimal,BCD)记数法的变体来存储。
⼩数点的位置取决于数字的精度(p)和⼩数位(s)。
DB2的基础学习1、DB2数据库的逻辑结构分别为:实例-->数据库-->表空间-->表。
表是⼆维结构,由⾏和列组成,表数据存放在表空间⾥,表空间是数据库的逻辑存储层,每个数据库可以包含多个表空间,每个表空间只能归属于⼀个数据库,所以数据库和表空间的关系是⼀对多。
2、DB2的存储模型为:表空间---->容器---->extent------>page。
每个表空间由⼀个或多个容器组成,容器是映射到物理存储,容器可以是⽬录、⽂件、裸设备。
每个容器只能属于⼀个表空间。
DB2将表和索引存储在PAGE页⾥,page是db2中最⼩的物理分配单元,表中的每⾏数据只能包含在⼀页中,不能跨页。
DB2⽀持的页⼤⼩分为:4K、8K、16K、32K四种。
当DB2在读取数据的时候,不是按页读取,⽽是按照extent(块)读取,⼀个extent是由⼀组连续的页组成。
如果⼀个表空间有多个容器,为了数据均衡的分布,所以在写数据的时候,按照循环的⽅式在各个容器⾥写数据,当⼀个容器中写满⼀个extent的时候,将开始在第⼆个容器继续写extent,周⽽复始,可以提⾼读写的效率。
每个表空间由⼀个或多个容器组成,表空间为逻辑层次中,⽽真正的数据是存放在容器中的,容器是由多个extent组成。
3、主键的数据类型设置为不变长的,如char和varchar则建议选择⽤char.注意字段的默认长度:smallint——占⽤2个字节,表⽰的数值范围:-32768⾄+32767integer——占⽤4个字节,表⽰的数值范围:-2147483648⾄+2147483647bigint——占⽤8个字节,表⽰的数值范围:-9223372036854775808⾄+9223372036854775807decimal——占⽤的字节数与数据类型的精度相关,最⼤精度为31number,real,float这三种类型不常⽤。
varchar——占⽤N个字节,N的最⼤值为32672char——N的最⼤值为254long varchar不常⽤date——占⽤4个字节,表⽰的⽇期范围:0001-01-01⾄9999-12-31time——占⽤3个字节,表⽰的时间范围:00:00:00⾄23:59:59timestamp(N)[with time zone]——占⽤7-13个字节,N的取值范围为0-12,默认为6表⽰的数值范围:0001-01-01 00:00:00.000000 ⾄9999-12-31 23:59:59.9999994、随机抽样查询select * from table_name fetch first 10 rows only;5、如果有五张表关联,数据库⾥⾯同时参与关联的只能是两张表。
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系统管理命令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.如何从旧版本中把数据库迁移到新的安装版本中(在新版数据库种运行下列代码)i.验证数据库是否可以被迁移。
用db2ckmig命令,db2ckmig /e 数据库别名/l 验证信息保存路径/u 用户名/p 密码ii.执行数据库的迁移命令MIGRATE database 数据库别名user 用户名using 密码命令9.启动DB2服务器进入数据库安装目录下的bin目录:C:\Program Files\IBM\SQLLIB\BIN或db2操作环境中执行db2start命令10.关于命令行编辑器的使用使用命令行编辑器之前要连接到一个数据库。
使用 ibm data studio 开发调试 db2 存储过程IBM Data Studio 是一款免费的基于 Eclipse 的用于数据库开发的工具。
IBM Data Studio 包含了开发数据库存储过程的所有功能,同时提供了对 DB2 v9 的 XML 功能的支持。
本文将通过一个开发实例介绍 IBM Data Studio 是如何帮助我们进行存储过程开发的。
项目实例介绍在开始使用 IBM Data Studio 之前,让我们先来了解一下本文的项目实例。
该项目实例是一个简化版的软件开发管理系统。
系统主要管理 User Story 和Work Item 的信息。
User Story 就是以用户的角度编写的业务需求,是软件需要实现的功能。
我们需要记录 User Story 的具体内容和其状态。
这里的状态是指该User Story 是在草拟状态还是完成状态。
Work Item 用于记录软件开发的过程。
Work Item 可以是根据某个 User Story 编写的详细设计,也可以是一个编码任务,或者是一个 bug 报告。
我们需要记录其状态(未分配,处理中和完成等),结对编程人员的 Email 等信息。
本系统应该实现如下功能 ( 未列出所有功能 ):创建 User Story 。
修改 User Story 。
查询所有草拟状态的 User Story 。
创建 Work Item 。
修改 Work Item 。
查询属于某个 User Story 的所有 Work Item 。
为此我们设计了相应的数据库表:USER_STORY 和 WORK_ITEM 。
它们的详细定义如下表所示: 图 1. User story 和 Work item 的关系表 1. User Story 的定义 USER_STORY 列名称类型说明id INTEGER 表主键。
author VARCHAR 编写人的 Email 地址。
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是IBM一种分布式数据库解决方案。
说简单点:DB2就是IBM开发的一种大型关系型数据库平台.它支持多用户或应用程序在同一条SQL 语句中查询不同database甚至不同DBMS中的数据。
目前,DB2有如下一些版本:(比如DB2 for Unix,DB2 for Windows,DB2 for AS/400,DB2 for OS/390等)DB2是IBM公司开发的关系数据库管理系统,它有多种不同的版本,如:DB2工作组版(DB2Workgroup Edition)、DB2企业版(DB2 Enterprise Edition)、DB2个人版(DB2 Personal Edition)和DB2企业扩展版(DB2 Enterprise-Exended Edition)等,这些产品基本的数据管理功能是一样的,区别在于支持远程客户能力和分布式处理能力。
个人版适用于单机使用,即服务器只能由本地应用程序访问。
工作组版和企业版提供了本地和远程客户访问DB2的功能(当然远程客户要安装相应客户应用程序开发部件),企业版包括工作组版中的所有部件外再增加对主机连接的支持。
企业扩展版允许将一个大的数据库分布到同一类型的多个不同计算机上,这种分布式功能尤其适用于大型数据库的处理。
DB2可运行在OS/2、Windows NT、UNIX操作系统上,通常将运行在这些平台上的DB2产品统称为DB2通用数据库,这主要是强调这些产品运行环境类似,并共享相同的源代码。
DB2通用数据库主要组件包括数据库引擎(Dalabase Engine )应用程序接口和一组工具。
数据库引擎提供了关系数据库管理系统的基本功能,如管理数据、控制数据的访问(包括并发控制)、保证数据完整性及数据安全。
所有数据访问都通过SQL接口进行。
db2起源于system r和system r*。
他支持从pc到unix,从中小型机到大型机;从ibm到非ibm(hp及sun unix系统等)各种操作平台。
DB2存储过程语法规则如何声明⼀个存储过程CREATE PROCEDURE 存储过程名(IN 输⼊变量名输⼊变量类型,OUT 输出变量名输出变量类型)紧跟其后的是存储过程属性列表常⽤的有:LANGUAGE SQL、MODIFIES SQL DATA、RESULT SETS 1(返回结果集个数) l 存储过程体以begin开始l 存储过程体以end结束存储过程约束规则存储过程中调⽤存储过程CALL 存储过程名(参数1,参数2,参数n)例:call spco_init_custom(bankcode,errno,errmsg);GET DIAGNOSTICS retval=RETURN_STATUS;if(retval<>0) thenset errno=errno;set errmsg=errmsg;return errno;end if;变量的定义变量使⽤前必须先定义,⽅法为DECLARE 变量名变量类型(default 默认值)例:DECLARE SQLCODE INTEGER DEFAULT 0;DECLARE inum INTEGER DEFAULT 0;DECLARE curtime char(8);DECLARE bcode char(6);DECLARE sqlstate char(5);if 表达式if 条件1 then逻辑体;elseif 条件2 then逻辑体;else逻辑体;end if;例:IF rating = 1 THENUPDATE employeeSET salary = salary * 1.10, bonus = 1000WHERE empno = employee_number;ELSEIF rating = 2 THENUPDATE employeeSET salary = salary * 1.05, bonus = 500WHERE empno = employee_number;ELSEUPDATE employeeSET salary = salary * 1.03, bonus = 0WHERE empno = employee_number;END IF;case表达式case 变量名 when变量值1 then. . .when变量值2 then- - -else. . .end case;或case when变量名=变量值1 then. . .when变量名=变量值2 then- - -else. . .end case;例⼀:CASE v_workdeptWHEN 'A00'THEN UPDATE departmentSET deptname = 'DATA ACCESS 1';WHEN 'B01'THEN UPDATE departmentSET deptname = 'DATA ACCESS 2';ELSE UPDATE departmentSET deptname = 'DATA ACCESS 3';END CASE;例⼆:CASEWHEN v_workdept = 'A00'THEN UPDATE departmentSET deptname = 'DATA ACCESS 1';WHEN v_workdept = 'B01'THEN UPDATE departmentSET deptname = 'DATA ACCESS 2';ELSE UPDATE departmentSET deptname = 'DATA ACCESS 3';END CASE;for 表达式for 循环名 as游标名或select 表达式dosql表达式;end for;例:1)DECLARE fullname CHAR(40);FOR vl ASSELECT firstnme, midinit, lastname FROM employee DOSET fullname = lastname || ',' || firstnme ||' ' || midinit; INSERT INTO tnames VALUE (fullname);END FOR2)for loopcs1 as cousor1 cursor asselect market_code as market_codefrom tb_market_codefor updatedoend for;goto表达式goto 标⽰名;标⽰名:逻辑体;例:GOTO FAIL;...SUCCESS: RETURN 0FAIL: RETURN -200while表达式while 条件表达式 do逻辑体;end while;LOOP表达式LOOP... END LOOP;例:OPEN c1;ins_loop:LOOPFETCH c1 INTO v_dept, v_deptname, v_admdept;IF at_end = 1 THENLEAVEins_loop; --中断循环ELSEIF v_dept = 'D11' THENITERATEins_loop; --下⼀个循环END IF;INSERT INTO department (deptno, deptname, admrdept)VALUES ('NEW', v_deptname, v_admdept);END LOOP;CLOSE c1;关于游标定义游标:DECLARE 游标名 CURSOR FORSelect 语句;打开游标:OPEN 游标名;取值: FETCH 游标名 INTO 变量列表例:DECLARE c1 CURSOR FORSELECT CAST(salary AS DOUBLE)FROM staffWHERE DEPT = deptNumberORDER BY salary;DECLARE EXIT HANDLER FOR NOT FOUNDSET medianSalary = 6666;SET medianSalary = 0;SELECT COUNT(*) INTO v_numRecordsFROM staffWHERE DEPT = deptNumber;OPEN c1;WHILE v_counter < (v_numRecords / 2 + 1) DOFETCH c1 INTO medianSalary;SET v_counter = v_counter + 1;END WHILE;CLOSE c1;注:游标的申明如果放在中间段,要⽤”begin。
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;