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; --