db2sqlfor循环
A. 如何设置DB2数据库为循环日志
当创建新数据库时,循环日志记录是缺省行为。(将 logarchmeth1 和 logarchmeth2 数据库配置参数设置为 OFF。)对于这种类型的日志记录,只允许完整的脱机数据库备份。进行完全备份时,数据库必须脱机(用户不可访问)。正如它的名称所表示的那样,循环日志记录使用一个联机日志“环”,提供对事务故障和系统崩溃的恢复。仅使用和保留日志到确保当前事务的完整性这样一个程度。循环日志记录不允许将数据库在上次完全备份操作后执行的事务中前滚。上次备份操作后发生的所有更改都将丢失。因为这种类型的复原操作将数据恢复至进行完全备份的特定时间点,所以它称为版本恢复。
B. 小弟接触DB2不久,遇到个DB2函数循环的问题,始终报错,望大神指点迷津
试试这个。
CREATE FUNCTION RRS.F_AVG ( IN cDate date )
RETURNS VARCHAR(26)
LANGUAGE sql
BEGIN
DECLARE re INTEGER;
DECLARE nYuE INTEGER;
DECLARE nDate INTEGER;
SET RE =0;
SET nDate =TRUNC(cDate,'MM');
WHILE nDate<=cDate
LOOP
select sum(e.DEP_BALANCE/10000*r.EXCHAGERATE_AMT) INTO nYuE from e_deposit e
inner join VIEW_ORG_COLLECT v on v.ORG_ID =e.ORG_ID and v.PRE_ORGID =1
inner join E_EXCHANGE_RATE r on r.CONVERT_CCY_ID =e.V_CCY_ID and r.DATE_ID =to_date(cDate,'yyyymmdd')
where e.DATE_ID =to_date(cDate,'yyyymmdd')
and substr(e.VS_ID,1,4) not in ('2012')
and e.start_date <=to_date(to_char(ndate),'yyyymmdd')
and (e.e_date >to_date(to_char(ndate),'yyyymmdd') or e.e_date is null);
SET RE =RE+nYuE;
SET nDate =nDate+1 day;
END LOOP;
SET re= re/to_number(substr(cDate,7,2));
RETURN (RE);
end
C. db2的过程中怎样写异常处理
创建SQL存储过程(CREATEPROCEDURE(SQL)statement)
CREATEPROCEDUREprocere-name(IN|OUT|INOUTparameter-namedata-type,...))---存储过程可以设定输入参数和输出参数
LANGUAGESQL----DB2可以用多种语言编写存储过程,这里用的是纯SQL
BEGIN---开始
DECLAREvIDsmallint;---定义变量和Oracle一样DECLARE变量名变量的数据类型;
FORVASSELECTBRND_CDFROMTMP_BRND_CD---for循环tmp_brnd_cd预先创建好
DO---循环体开始
SETvID=BRND_CD;---对vID赋值,db2可以用set赋值,也可以用values赋值,这里可以写成values(BRND_CD)intovID
INSERTINTOWWM_FORINSERT_TESTVALUES(vID);---往wwm_forinsert_test插入数据
ENDFOR;-----循环体结束
END@-----存储过程结束
参数语法说明
1、procere-name:存储过程的名字,在同一个数据库的同一模式下,不能存在存储过程名相同参数数目相同的存储过程,即使参数的类型不同也不行。
2、(IN|OUT|INOUTparameter-namedata-type,...):传入参数IN:输入参数OUT:输出参数INOUT:作为输入输出参数parameter-name:参数名字,在此存储过程中唯一的标识符。data-type:参数类型,可以接收SQL类型和创建的表。不支持LONGVARCHAR,LONGVARGRAPHIC,DATALINK,REFERENCE和用户自定义类型。
3、SPECIFICspecific-name:唯一的特定名称(别名),可以用存储过程名代替,这个特定名称用于dorp存储过程,或者给存储过程添加注视用,但不能调用存储过程。如果不指定,则数据库会自动生成一个yymmddhhmmsshhn时间戳的名字。推荐给出别名。
4、DYNAMICRESULTSETSinteger:指定存储过程返回结果的最大数量。存储过程中虽然没有return语句,但是却能返回结果集。
5、CONTAINSSQL,READSSQLDATA,MODIFIESSQLDATA:指定存储过程中的SQL访问级别CONTAINSSQL:表示存储过程可以执行中,既不可读取SQL数据,也不可修改SQL数据。READSSQLDATA:表示存储过程可以执行中,可读取SQL,但不可修改SQL数据。MODIFIESSQLDATA:表示存储过程可以执行任何SQL语句。可以对数据库中的数据进行增加、删除和修改。
6、:表示存储过程是动态或者非动态的。动态的返回的值是不确定的。非动态的存储过程每次执行返回的值是相同的。
7、CALLEDONNULLINPUT:表示可以调用存储过程而不管任何的输入参数是否为NULL,并且,任何的OUT或者INOUT参数可以返回一个NULL或者非空值。检验参数是否为NULL是在过程中进行的。
8、INHERITSPECIALREGISTERS:表示继承专用寄存器。
9、:建立存储点。OLDSAVEPOINTLEVEL是默认的存储点。
10、LANGUAGESQL:指定程序的主体用的是SQL语言。
11、:表示存储过程是否执行一些改变理数据库状态的活动,而不通过数据库管理器管。默认是EXTERNALACTION。如果指定为NOEXTERNALACTION,则数据库会确定最最佳优化方案。
12、PARAMETERCCSID:指定所有输出字符串数据的编码,默认为UNICODE编码数据库为PARAMETERCCSIDUNICODE,其他的数据库默认为PARAMETERCCSID3ASCII。
13、SQL-procere-body:存储过程的主体
D. 批处理for循环中不能使用sqlcmd命令
在for循环中,需要开启环境变量延迟命令。然后变量名调用不再使用百分号,而是感叹号。这样才能正常调用
setlocal enabledelayedexpansion
for %%a in (db1 db2) do (
set db_name=%%a
sqlcmd -U sa -P %db_passwd% -S ^(local^) -Q "use !db_name!"
)
E. db2存储过程中循环话语while do的continue有没有
Orcle中的PL/SQL中有以下几种循环 第一种循环就能完成你的需求
1).无条件进入:
loop
exit when 条件;
循环体;
end loop;
2)有条件进入:
while 条件 loop
循环体;
end loop;
3).循环次数固定:
for 循环变量 in [reverse] 下界..上界 loop
循环体;
end loop;
F. db2 存储过程 异常处理
存储过程异常的处理:
DECLARE handler-type HANDLER FOR condition handler-action
异常处理器类型(handler-type)有以下几种:
CONTINUE 在处理器操作完成之后,会继续执行产生这个异常语句之后的下一条语句。
EXIT 在处理器操作完成之后,存储过程会终止,并将控制返回给调用者。
UNDO 在处理器操作执行之前,DB2会回滚存储过程中执行的SQL操作。在处理器操作完成之后,存储过程会终止,并将控制返回给调用者。
异常处理器可以处理基于特定SQLSTATE值的定制异常,或者处理预定义异常的类。预定义的3种异常如下所示:
NOT FOUND 标识导致SQLCODE值为+100或者SQLSATE值为02000的异常。这个异常通常在SELECT没有返回行的时候出现。
SQLEXCEPTIOIN 标识导致SQLCODE值为负的异常。
SQLWARNING 标识导致警告异常或者导致+100以外的SQLCODE正值的异常。
如果产生了NOT FOUND 或者SQLWARNING异常,并且没有为这个异常定义异常处理器,那么就会忽略这个异常,并且将控制流转向下一个语句。如果产生了SQLEXCEPTION异常,并且没有为这个异常定义异常处理器,那么存储过程就会失败,并且会将控制流返回调用者。
以下示例声明了两个异常处理器。 EXIT处理器会在出现SQLEXCEPTION 或者SQLWARNING异常的时候被调用。EXIT处理器会在终止SQL程序之前,将名为stmt的变量设为"ABORTED",并且将控制流返回给调用者。UNDO处理器会将控制流返回给调用者之前,回滚存储过程体中已经完成的SQL操作。
清单3:异常处理器示例
DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING SET stmt = 'ABORTED';
DECLARE UNDO HANDLER FOR NOT FOUND;
如果预定义异常集不能满足需求,就可以为特定的SQLSTATE值声明定制异常,然后再为这个定制异常声明处理器。语法如下:
清单4:定制异常处理器
DECLARE unique-name CONDITION FOR SQLSATE 'sqlstate'
处理器可以由单独的存储过程语句定义,也可以使用由BEGIN…END块界定的复合语句定义。注意在执行符合语句的时候,SQLSATE和SQLCODE的值会被改变,如果需要保留异常前的SQLSATE和SQLCODE,就需要在执行复合语句的第一个语句把SQLSATE和SQLCODE赋予本地变量或参数。
通常,会为存储过程定义一个执行状态的输出参数(例如:poGenStatus)。
declare sqlcode integer default 0;
begin
declare continue handler for sqlexception set ret = sqlcode;
declare continue handler for sqlwarning set ret = sqlcode;
declare continue handler for not found set ret = sqlcode;
end ; --异常的声明
--异常的处理
if sqlcode< 0 or sqlcode= 100 then
set O_RetCod = RetCode;
set O_RetMsg = 'CLN02:产品实例关联客户过程出错!';
insert into LOG.OPER_LOG_TAB(PROC_NAME,OBJ_TAB,REGION_COD,OPER_COUNT,ERR_CODE,DATA_TIME,OPER_TIME)
values('P_DW_CLEAN','GLOBAL TEMP',0,0,retcode,CHAR(last_3_mon_time),current TIMESTAMP);
return;
else
set RetCode = 0;
end if;
G. DB2循环语句怎么写
1,update gzjbk a //gzjbk是表名 a是该表的别名 update是更新语句 2,set a.a094= //让gzjbk表中的a094字段等于一个值 3,select mc from bm_a093 b where b.bm='00606' and a.a003='00606' and b.bmbm=a.a093 and b.mca.a094 //查询语句
H. DB2数据库 写了一个循环插数的存储过程,但是报错,不清楚是为什么,请高手指导。
begin
foriin2..1000
loop
insertintotvalues(i,'x');
endloop;
commit;
end;
I. 求教db2中的sql语句,关于分页查询,查询从第
一、查询指定模式下的所有表
db2 LIST TABLES FOR SCHEMA 模式名
二、查询当前模式下所有表及信息
db2 select tabname from syscat.tables where tabschema = CURRENT SCHEMA
三、查询当前模式下所有的表
db2 LIST TABLES FOR ALL
四、查询指定表名的表
db2 select * from syscat.tables where TABNAME = '表名'(表名必须大写,不加模式,原因是TABNAME是syscat.tables中的一个字段,TABSCHEMA模式是另一个字段,两者唯一确定一张表)
希望这些可以给你帮助
J. db2存储过程变量问题
创建SQL存储过程(CREATE PROCEDURE (SQL) statement )
CREATE PROCEDURE procere-name(IN | OUT | INOUT parameter-name data-type,...) ) ---存储过程可以设定输入参数和输出参数LANGUAGE SQL ----DB2可以用多种语言编写存储过程,这里用的是纯SQLBEGIN ---开始DECLARE vID smallint; ---定义变量 和Oracle一样 DECLARE 变量名 变量的数据类型;FOR V AS SELECT BRND_CD FROM TMP_BRND_CD ---for循环 tmp_brnd_cd预先创建好DO ---循环体开始SET vID=BRND_CD; ---对vID赋值,db2可以用set赋值,也可以用values赋值,这里可以写成values(BRND_CD) into vIDINSERT INTO WWM_FORINSERT_TEST VALUES(vID); ---往wwm_forinsert_test 插入数据END FOR; --