DB2存储过程简单例子
db2存储过程循环写法
db2存储过程循环写法在DB2数据库中,存储过程可以使用`FOR`循环或`WHILE`循环来实现。
下面是一个简单的DB2存储过程示例,演示了使用`WHILE`循环的写法。
请注意,实际使用时需要根据具体需求进行适当修改:```sqlCREATE PROCEDURE SampleProcedure()LANGUAGE SQLBEGIN--声明变量DECLARE counter INT DEFAULT 1;DECLARE maxCounter INT DEFAULT 10;-- WHILE循环WHILE counter <= maxCounter DO--在这里执行循环体的操作--例如,可以进行数据操作、条件判断等--输出循环次数--注意:DB2中的PRINT语句可以使用CALL DBMS_OUTPUT.PUT_LINE替代CALL DBMS_OUTPUT.PUT_LINE('Iteration: ' || counter);--增加计数器SET counter = counter + 1;END WHILE;END```在上面的例子中,`counter` 是一个计数器,`maxCounter` 是循环的最大次数。
`WHILE` 循环在`counter` 小于等于`maxCounter` 时执行循环体中的操作。
你可以根据实际需求修改循环体内的操作,比如进行数据库操作、条件判断等。
请注意,DB2的具体版本和配置可能会影响存储过程的编写方式,上面的示例基于一般的SQL语法和通用的存储过程规范。
在实际使用中,请查阅相应的DB2文档以确保语法和功能的兼容性。
DB2存储过程使用动态游标的例子
本文将为您介绍一个DB2存储过程使用动态游标的例子,如果您对动态游标的使用感兴趣的话,不妨一看,对您学习DB2的使用会有所帮助。
CREATE PROCEDURE data_wtptest( IN in_taskid_timestamp varchar(30),OUT o_err_no int,OUT o_err_msg varchar(1024))LANGUAGE SQLP1: BEGIN ATOMIC--声明开始--临时变量出错变量DECLARE SQLCODE integer default 0;DECLARE SQLStmt varchar(1024) default '';DECLARE r_code integer default 0;DECLARE state varchar(1024) default 'AAA';--记录程序当前所作工作DECLARE at_end int DEFAULT 0;DECLARE t_destnetid int default 0;DECLARE t_recvid varchar(30) default '';DECLARE SP_Name varchar(50) default 'data_wtptest';--声明放游标的值--声明动态游标存储变量DECLARE stmt1 STATEMENT;DECLARE c1 CURSOR FOR stmt1;--声明出错处理DECLARE EXIT HANDLER FOR SQLEXCEPTIONbeginset r_code=SQLCODE;set o_err_no=1;set o_err_msg='处理['||state||']出错,'||'错误代码SQLCODE:['||CHAR(r_code) || '].';insert into fcc_sp_log(object,name,value)values(SP_Name,in_taskid_timestamp,o_err_msg);end;DECLARE continue HANDLER for not foundbeginset at_end = 1;set state='找到0行记录或已经到记录结尾.';end;--声明结束SET state='[add]单独测试中,统计条数';SET SQLStmt='SELECT count(*) FROM wtp_pre_download where task_timestamp = ?';PREPARE stmt1 FROM SQLStmt;OPEN c1 USING in_taskid_timestamp;FETCH c1 INTO t_destnetid;CLOSE c1;SET state='[add]查具体信息';SET at_end = 0;SET SQLStmt='SELECT recv_userid FROM wtp_pre_download where task_timestamp = ?';PREPARE c1 FROM SQLStmt;OPEN c1 USING in_taskid_timestamp;SET state='[add]************';FETCH c1 INTO t_recvid;SET state='[add]============';insert into fcc_sp_log(object,name,value) values(SP_Name,in_taskid_timestamp,t_recvid);END p1。
DB2存储过程精简教程
DB2存储过程精简教程DB2存储过程是一种在数据库服务器上执行的可重复使用的代码块,用于完成特定任务。
它可以接受输入参数,并返回结果。
存储过程有助于提高数据库性能和安全性。
在这篇文章中,我们将介绍如何创建和使用DB2存储过程。
一、创建存储过程要创建存储过程,您需要先登录到DB2数据库服务器。
然后,使用CREATEPROCEDURE语句指定存储过程的名称、输入参数和返回结果。
下面是一个示例:CREATE PROCEDURE get_employee(IN employee_id INT, OUT employee_name VARCHAR(255))BEGINSELECT 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)BEGINDECLARE 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 THENSET tax = monthly_salary * 0.2;ELSESET tax = monthly_salary * 0.1;ENDIF;SELECT monthly_salary, tax;END上面的代码创建了一个名为calculate_salary的存储过程。
DB2企业级SQL存储过程精品实例
DB2企业级SQL存储过程精品实例背景:这个企业级报表的存储过程,没有完全写完,但是大框架已经完成了,并且我稍作简化修改后,可以独立运行了,如果全部完成,大概有1500行的SQL 的代码,怕吓着读者了。
要运行此实例,你需要建立一个表(我已经给出了SQL,你需要执行一下)。
这个存储过程就是要经过一个双层循环,将数据数据写在一个临时表中,然后返回。
从中,你将学到如何定义临时表,游标,如何读取游标,如何控制流程,你也许会体会到如何给SQL分块。
SQL脚本:Drop table DM_HYML;Drop table DM_HY;Create table DM_HYML(HYML_DM CHAR(2) not null,HYML_MC VARCHAR(200) not null,XYBZ CHAR(1) not null);Alter table DM_HYMLadd primary key(HYML_DM);Comment on table DM_HYML is‘行业门类代码表’;Comment on column DM_HYML.HYML_DM is‘行业门类代码’;Comment on column DM_HYML.HYML_MC is‘行业门类名称’;Comment on column DM_HYML.XYBZ is‘选用标志’;create table DM_HY(HY_DM VARCHAR(6) not null,HY_MC VARCHAR(200) not null,MLBZ CHAR(1) not null,DLBZ CHAR(1) not null,ZLBZ CHAR(1) not null,XLBZ CHAR(1) not null,FQHY VARCHAR(6),XYBZ CHAR(1) not null);alter table DM_HYadd primary key (HY_DM);comment on table DM_HY is'行业代码表';comment on column DM_HY.HY_DM is'行业代码';comment on column DM_HY.HY_MC is'行业名称';comment on column DM_HY.MLBZ is'门类标志';comment on column DM_HY.DLBZ is'大类标志';comment on column DM_HY.ZLBZ is'中类标志';comment on column DM_HY.XLBZ is'小类标志';comment on column DM_HY.FQHY is'父亲类型';comment on column DM_HY.XYBZ is'选用标志';delete from DM_HYML;insert into DM_HYML (HYML_DM, HYML_MC, XYBZ) values ('01', '农、林、牧、渔业', 'Y');insert into DM_HYML (HYML_DM, HYML_MC, XYBZ) values ('03', '制造业', 'Y');insert into DM_HYML (HYML_DM, HYML_MC, XYBZ) values ('02', '采矿业', 'Y');insert into DM_HYML (HYML_DM, HYML_MC, XYBZ) values ('04', '电力、燃气及水的生产和供应业', 'Y'); insert into DM_HYML (HYML_DM, HYML_MC, XYBZ) values ('05', '建筑业', 'Y');insert into DM_HYML (HYML_DM, HYML_MC, XYBZ) values ('06', '交通运输、仓储和邮政业', 'Y');insert into DM_HYML (HYML_DM, HYML_MC, XYBZ) values ('07', '信息传输、计算机服务和软件业', 'Y'); insert into DM_HYML (HYML_DM, HYML_MC, XYBZ) values ('08', '批发和零售业', 'Y');insert into DM_HYML (HYML_DM, HYML_MC, XYBZ) values ('09', '住宿和餐饮业', 'Y');insert into DM_HYML (HYML_DM, HYML_MC, XYBZ) values ('10', '金融业', 'Y');insert into DM_HYML (HYML_DM, HYML_MC, XYBZ) values ('11', '房地产业', 'Y');insert into DM_HYML (HYML_DM, HYML_MC, XYBZ) values ('12', '租赁和商务服务业', 'Y');insert into DM_HYML (HYML_DM, HYML_MC, XYBZ) values ('13', '科学研究、技术服务和地质勘查业', 'Y'); insert into DM_HYML (HYML_DM, HYML_MC, XYBZ) values ('14', '水利、环境和公共设施管理业', 'Y'); insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)values ('15', '居民服务和其他服务业', 'Y');insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)values ('16', '教育', 'Y');insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)values ('17', '卫生、社会保障和社会福利业', 'Y');insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)values ('18', '文化、体育和娱乐业', 'Y');insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)values ('19', '公共管理和社会组织', 'Y');insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)values ('20', '国际组织', 'Y');commit;delete from DM_HY;insert into DM_HY (HY_DM, HY_MC, MLBZ, DLBZ, ZLBZ, XLBZ, FQHY, XYBZ) values ('01', '农、林、牧、渔业', 'Y', 'N', 'N', 'N', null, 'Y');insert into DM_HY (HY_DM, HY_MC, MLBZ, DLBZ, ZLBZ, XLBZ, FQHY, XYBZ) values ('010200', '林业', 'N', 'Y', 'Y', 'Y', '01', 'Y');insert into DM_HY (HY_DM, HY_MC, MLBZ, DLBZ, ZLBZ, XLBZ, FQHY, XYBZ) values ('010100', '农业', 'N', 'Y', 'Y', 'Y', '01', 'Y');insert into DM_HY (HY_DM, HY_MC, MLBZ, DLBZ, ZLBZ, XLBZ, FQHY, XYBZ) values ('010300', '畜牧业', 'N', 'Y', 'Y', 'Y', '01', 'Y');insert into DM_HY (HY_DM, HY_MC, MLBZ, DLBZ, ZLBZ, XLBZ, FQHY, XYBZ) values ('010400', '渔业', 'N', 'Y', 'Y', 'Y', '01', 'Y');insert into DM_HY (HY_DM, HY_MC, MLBZ, DLBZ, ZLBZ, XLBZ, FQHY, XYBZ) values ('010500', '农、林、牧、渔服务业', 'N', 'Y', 'Y', 'Y', '01', 'Y');insert into DM_HY (HY_DM, HY_MC, MLBZ, DLBZ, ZLBZ, XLBZ, FQHY, XYBZ) values ('02', '采矿业', 'Y', 'N', 'N', 'N', null, 'Y');insert into DM_HY (HY_DM, HY_MC, MLBZ, DLBZ, ZLBZ, XLBZ, FQHY, XYBZ) values ('020600', '煤炭开采和洗选业', 'N', 'Y', 'Y', 'Y', '02', 'Y');insert into DM_HY (HY_DM, HY_MC, MLBZ, DLBZ, ZLBZ, XLBZ, FQHY, XYBZ) values ('020700', '石油和天然气开采业', 'N', 'Y', 'Y', 'Y', '02', 'Y');insert into DM_HY (HY_DM, HY_MC, MLBZ, DLBZ, ZLBZ, XLBZ, FQHY, XYBZ) values ('020800', '黑色金属矿采选业', 'N', 'Y', 'Y', 'Y', '02', 'Y');insert into DM_HY (HY_DM, HY_MC, MLBZ, DLBZ, ZLBZ, XLBZ, FQHY, XYBZ) values ('020900', '有色金属矿采选业', 'N', 'Y', 'Y', 'Y', '02', 'Y');insert into DM_HY (HY_DM, HY_MC, MLBZ, DLBZ, ZLBZ, XLBZ, FQHY, XYBZ) values ('021000', '非金属矿采选业', 'N', 'Y', 'Y', 'Y', '02', 'Y');insert into DM_HY (HY_DM, HY_MC, MLBZ, DLBZ, ZLBZ, XLBZ, FQHY, XYBZ) values ('021100', '其他采矿业', 'N', 'Y', 'Y', 'Y', '02', 'Y');insert into DM_HY (HY_DM, HY_MC, MLBZ, DLBZ, ZLBZ, XLBZ, FQHY, XYBZ) values ('03', '制造业', 'Y', 'N', 'N', 'N', null, 'Y');insert into DM_HY (HY_DM, HY_MC, MLBZ, DLBZ, ZLBZ, XLBZ, FQHY, XYBZ) values ('031300', '农副食品加工业', 'N', 'Y', 'Y', 'Y', '03', 'Y');insert into DM_HY (HY_DM, HY_MC, MLBZ, DLBZ, ZLBZ, XLBZ, FQHY, XYBZ)。
db2 存储过程 out用法
db2 存储过程 out用法在DB2中,存储过程是一组预编译的SQL语句,它们被存储在数据库中,可以被多次调用。
存储过程可以包含输入参数、输出参数和返回值。
当我们在存储过程中定义输出参数时,我们可以使用OUT参数来实现。
在存储过程中使用OUT参数的基本语法如下所示:sql.CREATE PROCEDURE procedure_name (OUT out_parameter data_type)。
BEGIN.-存储过程的逻辑。
END.在上面的语法中,OUT关键字用于定义输出参数,out_parameter是输出参数的名称,data_type是输出参数的数据类型。
存储过程中可以使用该输出参数来传递数据给调用方。
在存储过程中,我们可以通过以下步骤来使用OUT参数:1. 定义存储过程,并在参数列表中使用OUT关键字来声明输出参数。
2. 在存储过程的逻辑中,为输出参数赋值。
3. 在调用存储过程时,可以接收输出参数的值。
下面是一个简单的示例,演示了如何在DB2存储过程中使用OUT参数:sql.CREATE PROCEDURE get_employee_count (OUT total_count INT)。
BEGIN.SELECT COUNT() INTO total_count FROM employees;END.在上面的示例中,我们创建了一个名为get_employee_count的存储过程,它接受一个OUT参数total_count,该参数的数据类型为INT。
在存储过程的逻辑中,我们使用SELECT COUNT() INTO语句来获取employees表中的记录数,并将结果赋给total_count参数。
当我们调用这个存储过程时,可以通过以下方式获取输出参数的值:sql.CALL get_employee_count(?);在这个调用中,我们可以通过问号来接收存储过程的输出参数值。
总之,在DB2存储过程中使用OUT参数可以帮助我们向调用方返回数据,从而实现更灵活和复杂的逻辑。
SQLSERVER和DB2存储过程规范实例
• 带输出存储过程示例
CREATE PROCEDURE titles_sum @@TITLE varchar(40) = \'%\', @@SUM money OUTPUT AS SELECT \'Title Name\' = title FROM titles WHERE title LIKE @@TITLE SELECT @@SUM = SUM(price) FROM titles WHERE title LIKE @@TITLE GO 说明 OUTPUT 变量必须在创建表和使用该变量时都进行定义。 参数名和变量名不一定要匹配,不过数据类型和参数位置必须匹配(除非使用 @@SUM = variable 形式)。
• 什么是SQL语言?
SQL语言是应用程序和SQL Server数据库之间的主要 编程接口。使用SQL语言编写代码时,可用两种方法 存储和执行代码。
① 第一种是在客户端存储代码,并创建向数据库管理系统发送S QL命令(或SQL语句)并处理返回结果给应用程序; ② 第二种是将这些发送的SQL语句存储在数据库管理系统中,这 些存储在数据库管理系统中的SQL语句就是存储过程。
• 使用 WITH ENCRYPTION 选项
WITH ENCRYPTION 子句对用户隐藏存储过程的文本。下例创建加密过程, 使用 sp_helptext 系统存储过程获取关于加密过程的信息,然后尝试直接从 sysco mments 表中获取关于该过程的信息。 GO USE pubs GO CREATE PROCEDURE encrypt_this WITH ENCRYPTION AS SELECT * FROM authors GO EXEC sp_helptext encrypt_this
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存储过程
USE_CUST_ID NUMBER(12),
ADDRESS_ID NUMBER(12),
COMMON_REGION_ID NUMBER(12),
BASIC_STATE VARCHAR2(10),
EXT_STATE VARCHAR2(3),
VOICE_AOC_TYPE CHAR(3),
DATA_AOC_TYPE CHAR,
ISMP_AOC_TYPE CHAR,
STOP_RENT_DATE DATE,
USE_LATN_ID NUMBER(9),
PAY_LATN_ID NUMBER(9)
)
insert into PROD_INST_919
(
CONTRACT_ID NUMBER(12),
ACCT_ID NUMBER(12),
INSTALL_DATE DATE,
ADDRESS_DESC VARCHAR2(250),
LAST_ORDER_ID NUMBER(12),
PHYSICAL_NBR VARCHAR2(20),
INSTALL_ADDR VARCHAR2(250),
EXT_PROD_INST_ID VARCHAR2(30),
BEGIN_RENT_DATE DATE,
tn_id LATN_ID --本地网标识
from
CIMM.V_USER_INFO_day a
left join det.ofr_prd_inst_main b on a.prd_inst_id=b.prd_inst_id
left join LCUST.SERV_ACCT c on b.serv_id=c.serv_id
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存储过程(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存储过程的写法示例:```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@`表示存储过程的结束。
请注意,这只是一个简单示例,实际的存储过程可能会更加复杂,根据具体需求来设计和实现存储过程的逻辑。
java调用db2存储过程例子
java调用db2存储过程例子java调用db2存储过程例子1. JAVA 调用db2存储过程最简单的例子:存储过程创建代码:<o:p></o:p>sql 代码1.SET SCHEMA IES ;2.3.Create procedure ies.test()4.NGUAGE SQL6.7.Update t_ryxx set xm =’xy’ where ryxxid=’xm’java 代码1.conn = DbMaster.getConn();2.System.out.println("begin………");3.proc = conn.prepareCall("{call test()}");4.proc.execute();<o:p></o:p>2. Java调用db2带输入参数存储过程的例子:<o:p></o:p>Db2创建存储过程的代码:<o:p></o:p>sql 代码5.Drop procedure ies.test();6.SET SCHEMA IES ;7.Create procedure ies.test(in i_ryxxid varchar(50))NGUAGE SQL9.Update t_ryxx set xm =’xy’ where ryxxid=i_ryxxid10.java 代码11.conn = DbMaster.getConn();12.System.out.println("begin");13.proc = conn.prepareCall("{call test(?)}");14.proc.setString(1,"RY0003");15.proc.execute();16.System.out.println("end:");3.有输入输出参数的代码:创建存储过程的代码:sql 代码17.SET SCHEMA IES ;18.CREATE PROCEDURE IES.test (IN in_ryxxid varchar(50),out out_xm varchar(50))NGUAGE SQL20.21.select xm into out_xm from ies.t_ryxx where ryxxid=in_ryxxid;java 代码22.proc = conn.prepareCall("{ call test(?,?)}");23.proc.setString(1, "011900380103");24.proc.registerOutParameter(2, Types.VARCHAR);25.proc.execute();26.String xm = proc.getString(2);27.System.out.println("end:"+xm);4.带有游标的存储过程(不知道这里的游标什么时候close的。
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存储过程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;。
DB2存储过程简单例子
DB2存储过程简单例⼦客户在进⾏短信服务这个业务申请时,需要填写⼀些基本信息,然后根据这些信息判断这个⽤户是否已经存在于业务系统中。
因为⽹上服务和业务系统两个项⽬物理隔离,⽽且⽹上数据库保存的客户信息不全,所以判断需要把数据交换到业务系统,在业务系统中判断。
解决⽅式是通过存储过程,以前也了解过存储过程,但没使⽤到项⽬中。
不过经过⼀番努⼒最后还是完成了,期间遇到了⼀些困难,特写此⽂让对DB2存储过程还不熟悉的童鞋避免⼀些⽆谓的错误。
DROP PROCEDURE "PLName"@CREATE PROCEDURE "PLName"(--存储过程名字IN IN_ID BIGINT , --以下全是输⼊参数IN IN_ENTNAME VARCHAR(200) ,IN IN_REGNO VARCHAR(50),IN IN_PASSWORD VARCHAR(20),IN IN_LEREP VARCHAR(300),IN IN_CERTYPE CHARACTER(1),IN IN_CERNO VARCHAR(50),IN IN_LINKMAN VARCHAR(50),IN IN_SEX CHARACTER(1),IN IN_MOBTEL VARCHAR(30),IN IN_REQDATE TIMESTAMP,IN IN_REMITEM VARCHAR(300),IN IN_STATE CHARACTER(1),IN IN_TIMESTAMP TIMESTAMP)BEGINdeclare V_RESULT BIGINT; --声明变量DELETE FROM TableNameA WHERE ID = IN_ID;SET V_RESULT =NULL; --为变量赋值--检查⽤户输⼊的信息是否合法select b.id INTO V_RESULT from TableNameB b,TableNameC c where正常的判断条件if(V_RESULT IS NOT NULL) then---如果合法,执⾏下⾯的insert语句INSERT INTO TableNameA(ID,ENTNAME,REGNO,PASSWORD,LEREP,CERTYPE,CERNO,LINKMAN,SEX,MOBTEL,REQDATE,REMITEM,STATE,TIMESTAMP)VALUES(IN_ID,IN_ENTNAME,IN_REGNO,IN_PASSWORD,IN_LEREP,IN_CERTYPE,IN_CERNO,IN_LINKMAN,IN_SEX,IN_MOBTEL,IN_REQDATE,IN_REMITEM,IN_STATE,IN_TIMESTAMP);end if;commit;END@功能说明:调⽤存储过程时会传⼊⼀些值(IN输⼊参数),然后根据传⼊的值查询数据库(select语句),根据查询结果执⾏操作(添加、删除、更新)有两种⽅式执⾏写好的存储过程:1.拷贝到DB2客户端⼯具中直接执⾏ 特别注意:执⾏时将改成@,之前很多错误都和它有关,⽐如:“该命令被当作 SQL语句来处理,因为它不是有效的命令⾏处理器命令”正是这个问题花费了很长时间,严重影响⼼情2.将上⾯的语句保存为test.db2⽂件放到任意⽬录下(⽐如D盘根⽬录),然后在cmd输⼊db2cmd 然后输⼊db2 -td@ -vf D:\test.db2即可执⾏后就可以测试存储过程写的是否正确直接写sql:call PLName(存储过程名字) (IN_ID,IN_ENTNAME,IN_REGNO,IN_PASSWORD,IN_LEREP,IN_CERTYPE,IN_CERNO,IN_LINKMAN,IN_SEX,IN_MOBTEL,IN_REQDATE,IN_REMITEM,IN_STATE,IN_TIMESTAMP对应的值)以上就是我今天所⽤到的存储过程,功能⾮常简单,⽐较复杂的操作也在摸索阶段,有什么疑问⼤家可以随时交流。
一个在AS400DB2下的存储过程示例
因程序需要,要在AS/400系统下建立DB2存储过程,参考了很多资料终于写完了一个可以运行的例子.
1CREATE PROCEDURE CIT003/LNAME VARCHAR(50),
4 IN STARTNO INT,
34
SCBCTM,SCSO,SCCDT,SCPRD)
35 VALUES ('SC','CF1',INTDATE,LINE,TRIM(BARCODE),INTTIME,LOTNO,
36
INTDATE,MODELNAME);
37 SET I=I+1;
38 SET STARTNO=STARTNO+1;
39 END WHILE;
5 IN QTY INT,
6 IN INTDATE INT,
7 IN INTTIME INT)
8 LANGUAGE SQL MODIFIES SQL DATA
9 P1:BEGIN
10 DECLARE I INT;
11 DECLARE ANAMNO CHAR(15);
12 DECLARE BARCODE CHAR(15);
13 DECLARE TMPSTR CHAR(15);
14 DECLARE FRISTNO CHAR(15);
15 DECLARE LASTNO CHAR(15);
16 DECLARE LINE INT;
17
18 DECLARE S11 CURSOR FOR SELECT SWRKC FROM BPCSFCT/FSO WHERE SORD=LOTNO;
40 END IF ;
41 END P1;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DB2存储过程简单例子
客户在进行短信服务这个业务申请时,需要填写一些基本信息,然后根据这些信息判断这个用户是否已经存在于业务系统中。
因为网上服务和业务系统两个项目物理隔离,而且网上数据库保存的客户信息不全,所以判断需要把数据交换到业务系统,在业务系统中判断。
解决方式是通过存储过程,以前也了解过存储过程,但没使用到项目中。
不过经过一番努力最后还是完成了,期间遇到了一些困难,特写此文让对DB2存储过程还不熟悉的童鞋避免一些无谓的错误。
DROP PROCEDURE "PLName"
@
CREATE PROCEDURE "PLName"(--存储过程名字
IN IN_ID BIGINT , --以下全是输入参数
IN IN_ENTNAME VARCHAR(200) ,
IN IN_REGNO VARCHAR(50),
IN IN_PASSWORD VARCHAR(20),
IN IN_LEREP VARCHAR(300),
IN IN_CERTYPE CHARACTER(1),
IN IN_CERNO VARCHAR(50),
IN IN_LINKMAN VARCHAR(50),
IN IN_SEX CHARACTER(1),
IN IN_MOBTEL VARCHAR(30),
IN IN_REQDATE TIMESTAMP,
IN IN_REMITEM VARCHAR(300),
IN IN_STATE CHARACTER(1),
IN IN_TIMESTAMP TIMESTAMP
)
BEGIN
declare V_RESULT BIGINT; --声明变量
DELETE FROM TableNameA WHERE ID = IN_ID;
SET V_RESULT =NULL; --为变量赋值
--检查用户输入的信息是否合法
select b.id INTO V_RESULT from TableNameB b,TableNameC c where正常的判断条件
if(V_RESULT IS NOT NULL) then---如果合法,执行下面的insert语句
INSERT INTO
TableNameA(ID,ENTNAME,REGNO,PASSWORD,LEREP,CERTYPE,CERNO,LINKMAN,SEX,MOBT EL,REQDATE,REMITEM,STATE,TIMESTAMP)
VALUES(IN_ID,IN_ENTNAME,IN_REGNO,IN_PASSWORD,IN_LEREP,IN_CERTYPE,IN_CERNO ,IN_LINKMAN,IN_SEX,IN_MOBTEL,IN_REQDATE,IN_REMITEM,IN_STATE,IN_TIMESTAMP);
end if;
commit;
END
@
功能说明:
调用存储过程时会传入一些值(IN输入参数),然后根据传入的值查询数据库(select 语句),根据查询结果执行操作(添加、删除、更新)
有两种方式执行写好的存储过程:
1.拷贝到DB2客户端工具中直接执行
特别注意:执行时将
改成@,之前很多错误都和它有关,比如:“该命令被当作 SQL
语句来处理,因为它不是有效的命令行处理器命令”正是这个问题花费了很长时间,严重影响心情
2.将上面的语句保存为test.db2文件放到任意目录下(比如D盘根目录),然后在cmd 输入db2cmd 然后输入db2 -td@ -vf D:\test.db2即可
执行后就可以测试存储过程写的是否正确
直接写sql:
call PLName(存储过程名字)
(IN_ID,IN_ENTNAME,IN_REGNO,IN_PASSWORD,IN_LEREP,IN_CERTYPE,IN_CERNO,IN_LI NKMAN,IN_SEX,IN_MOBTEL,IN_REQDATE,IN_REMITEM,IN_STATE,IN_TIMESTAMP对应的值)
以上就是我今天所用到的存储过程,功能非常简单,比较复杂的操作也在摸索阶段,有什么疑问大家可以随时交流。