DB2存储过程基本语法

合集下载

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 存储过程 out用法

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参数可以帮助我们向调用方返回数据,从而实现更灵活和复杂的逻辑。

DB2SQL存储过程语法

DB2SQL存储过程语法

DB2SQL存储过程语法
1.简介
DB2SQL存储过程是一种可以把一系列SQL语句和DB2例程指令存储在数据库对象中,以便便于多次执行的一种程序。

这些存储过程的本质就是用SQL语言编写的程序,它们可以用于执行复杂的嵌套处理、访问数据库,以及控制DB2的活动,如创建表,修改行等等。

(1)DB2SQL存储过程语法的结构
•DECLARE:定义程序的参数,变量和游标。

•BEGIN:请求存储过程开始执行。

•DECLARE:以及定义的变量,参数的赋值等。

•SET:将一个变量的值设置为另一个变量或值。

•IF-THEN-ELSE:根据条件执行不同的操作。

•LOOP:满足条件时,循环执行SQL指令。

•OPEN:打开一个游标,以便DB2可以提取游标中的数据记录。

•FETCH:从指定的游标中提取记录。

•CLOSE:关闭游标。

•COMMIT:提交当前事务。

•ROLLBACK:回滚当前事务,以便可以撤消先前的操作。

•RETURN:返回一个值,该值可以由调用存储过程的程序来接收。

•END:告诉DB2,程序开发完成。

DB2存储过程基本语法

DB2存储过程基本语法

DB2存储过程基本语法存储过程的基本语法如下:1.创建存储过程:```sqlCREATE PROCEDURE procedure_name [ (parameter_name parameter_data_type [, ...]) ]BEGIN-- SQL statementsEND;```存储过程使用`CREATEPROCEDURE`语句来创建,指定存储过程的名称以及可选的参数。

然后使用`BEGIN`和`END`之间的SQL语句来定义过程的操作。

2.存储过程参数:存储过程可以接收参数,并且可以设置参数的初始值。

```sqlCREATE PROCEDURE procedure_name (IN parameter_name parameter_data_type [DEFAULT default_value])BEGIN-- SQL statementsEND;```参数可以设置为输入(IN)参数或者输出(OUT)参数,用于接收过程内部的数据或者返回数据。

3.存储过程返回结果:存储过程可以返回结果集或者只是执行一些操作而不返回结果。

```sqlCREATE PROCEDURE procedure_nameDYNAMIC RESULT SETS integerBEGIN-- SQL statementsEND;```使用`DYNAMICRESULTSETS`关键字来指定结果集的数量。

如果存储过程不返回结果集,可以省略这一行。

4.存储过程操作:存储过程可以包含SQL语句,例如SELECT、INSERT、UPDATE和DELETE等操作。

可以使用条件判断、循环等控制流语句来实现复杂的逻辑。

```sqlCREATE PROCEDURE procedure_nameBEGINDECLARE variable_name data_type [DEFAULT value];-- Variable declarationSET variable_name = value;-- Variable assignment-- SQL statementsIF condition THEN-- StatementsELSEIF condition THEN-- StatementsELSE-- StatementsENDIF;WHILE condition DO-- StatementsENDWHILE;FOR variable_name [AS] data_type [DEFAULT value] TO value DO -- StatementsENDFOR;REPEAT-- StatementsUNTIL condition END REPEAT;-- Other control flow statementsEND;```使用`DECLARE`关键字声明变量,使用`SET`关键字为变量赋值。

db2基础语法

db2基础语法

db2基础语法⼀、db2 基础基本语法注释:“--”(两个减号)字符串连接:“||”如set msg=’aaaa’||’bbbb’,则msg为’aaaabbbb’字符串的引⽤:‘’(⼀定⽤单引号),如果需要输⼊单引号,输⼊两个单引号即可。

语句结束:“;”语法来源:PASCLE转义字符如果你想查询字符串中包含‘%’或‘_’ ,就得使⽤转义字符(Escape Characters)。

⽐如,要想查询book_title中包含字符串’99%’的纪录:select * from books where book_title like ‘%99!%%’ escape ‘!’后⾯的escape ‘!’是定⼀个转义字符‘!’, 指明紧跟着转义字符’!'后的%不再是统配符。

DB2命令参数选项db2 list command options 可以查看-a 显⽰ SQLCA OFF-c ⾃动落实 ON-e 显⽰ SQLCODE/SQLSTATE OFF-f 读取输⼊⽂件 OFF-l 将命令记录到历史⽂件中 OFF-n 除去换⾏字符 OFF-o 显⽰输出 ON-p 显⽰交互式输⼊提⽰ ON-r 将输出保存到报告⽂件 OFF-s 在命令出错时停⽌执⾏ OFF-t 设置语句终⽌字符 OFF-v 回送当前命令 OFF-w 显⽰ FETCH/SELECT 警告信息 ON-x 不打印列标题 OFF-z 将所有输出保存到输出⽂件 OFF这些选项的具体功能及其缺省设置为:.a 显⽰ SQLCA 的数据,缺省为 OFF。

.c 是否⾃动落实 SQL 命令,缺省为 ON。

.e {c|s} 显⽰ SQLCODE 或 SQLSTATE,缺省为 OFF。

.f ⽂件名将命令的输⼊从标准输⼊指定到某⼀⽂件,缺省为 OFF。

注:命令“db2 < ⽂件名”与“db2 -f ⽂件名”作⽤相同。

.l ⽂件名将命令记录到历史⽂件中,缺省为 OFF。

DB2存储过程学习总结

DB2存储过程学习总结

Db2 存储过程学习总结●在命令窗口执行存储过程,可以方便看出存储过程在哪一行出现错误,方便修改。

●db2 存储过程常用语句格式----定义DECLARE CC VARCHAR(4000);DECLARE SQLSTR VARCHAR(4000);DECLARE st STATEMENT;DECLARE CUR CURSOR WITH RETURN TO CLIENT FOR CC;----执行动态SQL不返回PREPARE st FROM SQLSTR;EXECUTE st;----执行动态SQL返回PREPARE CC FROM SQLSTR;OPEN CUR;----判断是否为空,使用值替代COALESCE(判断对象,替代值)----定义临时表DECLARE GLOBAL TEMPORARY TABLE SESSION.TempResultTable(Organization int,OrganizationName varchar(100),AnimalTypeName varchar(20),ProcessType int,OperatorName varchar(100),OperateCount int)WITH REPLACE -- 如果存在此临时表,则替换NOT LOGGED;DB2 9.x临时表使用总结1). DB2的临时表需要用命令Declare Temporary Table来创建,并且需要创建在用户临时表空间上;2). DB2在数据库创建时,缺省并不创建用户临时表空间,如果需要使用临时表,则需要用户在创建临时表之前创建用户临时表空间;3). 临时表的模式为SESSION,SESSION即基于会话的,且在会话之间是隔离的。

当会话结束时,临时表的数据被删除,临时表被隐式卸下。

对临时表的定义不会在SYSCAT.TABLES中出现 .;4). 缺省情况下,在Commit命令执行时,DB2临时表中的所有记录将被删除; 这可以通过创建临时表时指定不同的参数来控制;5). 运行ROLLBACK命令时,用户临时表将被删除;下面是DB2临时表定义的一个示例:DECLARE GLOBAL TEMPORARY TABLE results(RECID VARCHAR(32) , --idXXLY VARCHAR(100), --信息来源LXDH VARCHAR(32 ), --信息来源联系电话FKRQ DATE --反馈时间) ON COMMIT PRESERVE ROWS WITH REPLACE NOT LOGGED;----字符串函数Substr----隐形游标迭代for 游标名as select....... do使用游标名.字段名内容区块end for;----直接返回值或变量declare rs1 cursor with return to caller for select 0 from sysibm.sysdummy1;----判断表是否存在select count(*) into @exists from syscat.tables where tabschema = current schema and tabname='ZY_PROCESSLOG';----取前面N条记录select * from 表名FETCH FIRST N ROWS ONLY----定义返回值declare rs0 cursor with return to caller for select 0 from sysibm.sysdummy1;declare rs1 cursor with return to caller for select 1 from sysibm.sysdummy1;----得到插入的自增长列最大值VALUES IDENTITY_VAL_LOCAL() INTO 变量Merge into [A] using [B] on 条件when ***通过这个merge你能够在一个SQL语句中对一个表同时执行inserts和updates操作. 当然是update还是insert是依据于你的指定的条件判断的,Merge into可以实现用B表来更新A表数据,如果A表中没有,则把B表的数据插入A表. MERGE命令从一个或多个数据源中选择行来updating或inserting到一个或多个表语法如下MERGE INTO [your table-name] [rename your table here]USING ( [write your query here] )[rename your query-sql and using just like a table]ON ([conditional expression here] AND [...]...)WHEN MATHED THEN [here you can execute some update sql or something else ] WHEN NOT MATHED THEN [execute something else here ! ]我们先看看一个简单的例子,来介绍一个merge into的用法merge into products p using newproducts np on (p.product_id = np.product_id)when matched thenupdate set p.product_name = np.product_namewhen not matched theninsert values(np.product_id, np.product_name, np.category)在这个例子里。

DB2存储过程语法

DB2存储过程语法

DB2存储过程语法语法:CREATE PROCEDURE <schema-name>.<procedure-name> (参数) [属性] <语句>--参数:SQL PL 存储过程中有三种类型的参数:IN:输入参数(默认值,也可以不指定)OUT:输出参数INOUT:输入和输出参数--属性1、LANGUAGE SQL指定存储过程使用的语言。

LANGUAGE SQL 是其默认值。

还有其它的语言供选择,比如Java 或者C,可以将这一属性值分别设置为LANGUAGE JAVA 或者LANGUAGE C。

2、DYNAMIC RESULT SETS <n>如果您的存储过程将返回n 个结果集,那么需要填写这一选项。

3、SPECIFIC my_unique_name赋给存储过程一个唯一名称,如果不指定,系统将生成一个惟一的名称。

一个存储过程是可以被重载的,也就是说许多个不同的存储过程可以使用同一个名字,但这些存储过程所包含的参数数量不同。

通过使用SPECIFIC 关键字,您可以给每一个存储过程起一个唯一的名字,这可以使得我们对于存储过程的管理更加容易。

例如,要使用SPECIFIC 关键字来删除一个存储过程,您可以运行这样的命令:DROP SPECIFIC PROCEDURE。

如果没有使用SPECIFIC 这个关键字,您将不得不使用DROP PROCEDURE 命令,并且指明存储过程的名字及其参数,这样DB2 才能知道哪个被重载的存储过程是您想删除的。

4、SQL 访问级别NO SQL:存储过程中不能有SQL 语句CONTAINS SQL:存储过程中不能有可以修改或读数据的SQL 语句READS SQL:存储过程中不能有可以修改数据的SQL 语句MODIFIES SQL:存储过程中的SQL 语句既可以修改数据,也可以读数据默认值是MODIFIES SQL,一个存储过程不能调用具有更高SQL 数据访问级别的其他存储过程。

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存储过程-基础详解2010-12-20 来源:网络简介DB2 SQL Procedural Language(SQL PL)是SQL Persistent Stored Module 语言标准的一个子集。

该标准结合了SQL 访问数据的方便性和编程语言的流控制。

通过SQL PL 当前的语句集合和语言特性,可以用SQL 开发综合的、高级的程序,例如函数、存储过程和触发器。

这样便可以将业务逻辑封装到易于维护的数据库对象中,从而提高数据库应用程序的性能。

SQL PL 支持本地和全局变量,包括声明和赋值,还支持条件语句和迭代语句、控制语句的转移、错误管理语句以及返回结果集的方法。

这些话题将在本教程中讨论。

变量声明SQL 过程允许使用本地变量赋予和获取SQL 值,以支持所有SQL 逻辑。

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

清单1 中的图演示了变量声明的语法:清单1. 变量声明的语法.-,-----------------.V ||--DECLARE----SQL-variable-name-+------------------------------->.-DEFAULT NULL------.>--+-data-type--+-------------------+-+-------------------------|| '-DEFAULT--constant-' |SQL-variable-name 定义本地变量的名称。

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

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

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

DB2存储过程快速入门.

DB2存储过程快速入门.

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 结果集数量是否允许SQLLANGUAGE SQLBEGINSQL 过程体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语句处理数据的过程。

第10章 存储过程简介

第10章 存储过程简介

例10.4
CREATE PROCEDURE PROC_CUR_CASE LANGUAGE SQL BEGIN DECLARE v_State varchar(10); FOR Score_loop AS SELECT Stuno,score FROM tbl_ScoreInfo WHERE Classno = '003' AND Stuno = '05001' DO CASE WHEN (Score_loop.score > 59 and Score_loop.score < 90) THEN SET v_State = '及格'; WHEN Score_loop.score > 90 THEN SET v_State = '优秀'; ELSE SET v_State = '不及格'; END CASE; end FOR; END @
注意
CREATE PROCEDURE PROC_CUR_WHILE(out o_counter INTEGER) LANGUAGE SQL BEGIN DECLARE v_counter INTEGER DEFAULT 0; WHILE (v_counter < 10) DO SET v_counter = v_counter + 1; END WHILE; SET o_counter = v_counter; END @ 语句终止字符:要改为@ call PROC_CUR_WHILE(?); 语句终止字符:要改为;
10.2 DB2存储过程基本语法
10.2.3 控制语句
2. CASE语句:使用与其他语言的SWITCH语句类似 。用END CASE语句去结束。 CASE 语句语法: CASE WHEN 判断条件1 THEN 语句块1 ; WHEN 判断条件2 THEN 语句块2 ; ELSE 语句块3 ; END CASE ; 例:通过分数看好坏(参看例10.4)

DB2存储过程

DB2存储过程

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

DB2数据库SQL存储过程

DB2数据库SQL存储过程

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

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

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

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

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

DB2存储过程学习笔记资料

DB2存储过程学习笔记资料

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

存储过程基本语法

存储过程基本语法

基础知识体系:●存储过程及其类型●SQL Procedure环境配置●SQL Procedure基础原理●SQL Procedure流程控制●SQL Procedure游标●SQL Procedure异常处理●SQL Procedure动态SQL存储过程及其类型●什么是存储过程能够通过CALL STATEMENT调用的一种应用程序,它作为客户端的扩展,但运行在服务器端用户自定义的通过CREAT PROCEDURE语句被注册到DB2数据库的SYSCAT.ROUTINES表●为什么调用存储过程多个SQL语句被调用者一次调用就能够全部执行,减少了Client和Server间数据的传输;可以将数据库逻辑与应用程序逻辑隔离开;可以支持多个结果集的返回;如果被应用程序调用,运行起来SP就像应用程序的一部分不足之处只能用Call调用,且结果集不能直接被Sql Statement使用多次调用之间是相互独立的,无法信息传递,即相互之间不能保存调用装填存在跨数据库迁移的风险,即不同数据库产品之间存在不兼容性●存储过程的类型?Store Procedure for SQL = SQL ProcedureStore Procedure for JA V ATips:一般我们常说的存储过程都是指SQL Procedure(用SQL PL写的)记住:DB2的SQL Procedure需要C/C++编译器环境的支持●为什么SQL Procedure?性能SQL存储过程高于JA V A存储过程,因为SQL Procedure的SQl解释,优化,访问计划等都在Built时创建好了SQL Procedure是运行在DB Engine上,减少了网络的负载,效率高,因为全是SQL,DB2认为SQL的存储过程是安全的.......安全级别GRANT EXECUTE ON PROCEDURE代替了直接的表特权SQL Procedure环境配置●在服务器上安装应用开发客户端●在服务器端安装DB2支持的C/C++编译器●DB2_SQLROUTINE_COMPILER_PATH registry variable●DB2_SQLROUTINE_COMPILE_COMMAND registry variable ●AIX:●Windows:总是需要配置C/C++编译器配置如果这个注册表变量修改了,实例必须要重启.db2stop/db2start●为什么需要C/C++编译器●测试SQL Procedure环境db2setDB2_SQLROUTINE_COMPILER_PA TH=”InstallDir\vsvars32.bat”db2stop forcedb2stop (restart instance)db2 connect to sampledb2 creat procedure proc1 begin enddb2 drop procedure proc1SUCCESSSQL Procedure基础原理●Basic Structure(基本结构)一个简单的存储过程●Compound Statement(复合语句)●Procedure Schema(模式)CREATE PROCEDURE proc1…(created in current schema of connection)CREATE PROCEDURE db2inst1.proc1..(created in “db2inst1” schema)●Variables(变量)●SQLCODE访问SQLCODE首先需要在外部进行变量申明DECLEAR SQLCODE INTDB2进行SQL操作时,将自动的对SQLCODE赋值SQLCODE等于0,成功大于0,成功有警告小于0,不成功等于100,在select/fetch,insert,update,delete时没有找到数据●SQLSTATE访问SQLSTATE首先需要在外部进行变量申明DECLEAR SQLSTATE CHAR(5)DB2进行SQL操作时,将自动的对SQLCODE赋值SQLSTA TE…00000‟,成功…01XXX‟,警告…0200‟, 在select/fetch,insert,update,delete时没有找到数据其他都是不成功SQL Procedure流程控制●CASE statement●IF statement●LOOP statement●WHILE statement●REPEATE statement●GOTO statement●LEA VE statement●ITERATE statement●FOR statement SQL Procedure游标●游标的定义:。

DB2存储过程精简教程

DB2存储过程精简教程

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

DB2存储过程语法规则

DB2存储过程语法规则

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

3、SPECIFIC specific-name:唯一的特定名称(别名),可以用存储过程名代替,这个特定名称用于dorp存储过程,或者给存储过程添加注视
用,但不能调用存储过程。如果不指定,则数据库会自动生成一个yymmddhhmmsshhn时间戳的名字。推荐给出别名。
4、DYNAMIC RESULT SETS integer:指定存储过程返回结果的最大数量。存储过程中虽然没有return语句,但是却能返回结果集。
7、CALLED ON NULL INPUT:表示可以调用存储过程而不管任何的输入参数是否为NULL,并且,任何的OUT或者INOUT参数可以返回一个NULL或者
非空值。检验参数是否为NULL是在过程中进行的。
8、INHERIT SPECIAL REGISTERS:表示继承专用寄存器。
RESULT SETS 1
LANGUAGE SQL
BEGIN
DECLARE v_numRecords INT DEFAULT 1;
DECLARE v_counter INT DEFAULT 0;
DECLARE c1 CURSOR FOR
IN:输入参数
OUT:输出参数
INOUT:作为输入输出参数
parameter-name:参数名字,在此存储过程中唯一的标识符。
data-type:参数类型,可以接收SQL类型和创建的表。不支持LONG VARCHAR, LONG VARGRAPHIC, DATALINK, REFERENCE和用户自定义类型。
EXTERNAL ACTION。如果指定为NO EXTERNAL ACTION ,则数据库会确定最最佳优化方案。
12、PARAMETER CCSID:指定所有输出字符串数据的编码,默认为UNICODE编码数据库为PARAMETER CCSID UNICODE
,其他的数据库默认为PARAMETER CCSID 3 ASCII。
语法说明
1、procedure-name: 存储过程的名字,在同一个数据库的同一模式下,不能存在存储过程名相同参数数目相同的存储过程,即使参数的类型不同也不行。leizhimin 51cto技术博客
2、(IN | OUT | INOUT parameter-name data-type,...) :传入参数
SELECT CAST(salary AS DOUBLE)
FROM staff
ORDER BY salary;
DECLARE c2 CURSOR WITH RETURN FOR
SELECT name, job, CAST(salary AS INTEGER)
13、SQL-procedure-body:存储过程的主体
例子1:产生一个SQL存储过程,返回员工的平均薪水. 返回所有员工超过平均薪水的数额,结果集包括name, position, and salary字段。
CREATE PROCEDURE MEDIAN_RESULT_SET (OUT medianSalary DOUBLE)
9、OLD SAVEPOINT LEVEL or NEW SAVEPOINT LE
10、LANGUAGE SQL:指定程序的主体用的是SQL语言。
11、EXTERNAL ACTION or NO EXTERNAL ACTION:表示存储过程是否执行一些改变理数据库状态的活动,而不通过数据库管理器管。默认是
FROM staff
WHERE salary > medianSalary
ORDER BY salary;
DECLARE EXIT HANDLER FOR NOT FOUND
SET medianSalary = 6666;
MODIFIES SQL DATA: 表示存储过程可以执行任何 SQL 语句。可以对数据库中的数据进行增加、删除和修改。
6、DETERMINISTIC or NOT DETERMINISTIC:表示存储过程是动态或者非动态的。动态的返回的值是不确定的。非动态的存储过程每次执行返回
的值是相同的。
5、CONTAINS SQL, READS SQL DATA, MODIFIES SQL DATA: 指定存储过程中的SQL访问级别
CONTAINS SQL: 表示存储过程可以执行中,既不可读取 SQL 数据,也不可修改 SQL 数据。
READS SQL DATA: 表示存储过程可以执行中,可读取SQL,但不可修改 SQL 数据。
SET medianSalary = 0;
SELECT COUNT(*) INTO v_numRecords
FROM STAFF;
OPEN c1;
WHILE v_counter < (v_numRecords / 2 + 1)
DO
FETCH c1 INTO medianSalary;
SET v_counter = v_counter + 1;
END WHILE;
CLOSE c1;
OPEN c2;
相关文档
最新文档