1 Sql語句相關
1.1 db2 double改為字符串
select ''''||SpouseCertID from aaa
1.2 db2 linux建庫導表
####db2iv97 登陸
--建庫
db2 CREATE DATABASE WQBANK USING CODESET GBK TERRITORY CN COLLATE USING SYSTEM PAGESIZE 16 K
db2 connect to WQBANK user db2iv97 using db2iv97
--更改日志文件大小:
db2 update database configuration for WQBANK using LOGFILSIZ 102400
--更改主日志文件的數目:
db2 update database configuration for WQBANK using LOGPRIMARY 10
--更改輔助日志文件的數目:
db2 update database configuration for WQBANK using LOGSECOND 10
--更改檢查死鎖的時間間隔:
db2 update database configuration for WQBANK using DLCHKTIME 10000
--更改鎖定列表:
db2 update database configuration for WQBANK using MAXLOCKS 70
--更改sql語句堆大小:
db2 update database configuration for WQBANK using STMTHEAP 10000
--更改鎖超時:
db2 update database configuration for WQBANK using LOCKTIMEOUT 30
###cd 到備份文件路徑,將備份文件所有人修改為db2iv97,並確定有讀寫權限
---導表結構,導3-5遍
db2 -tvf db2look.ddl -td@
---導數據
db2move wqbank import
1.3 db2 查詢表結構
select * from sysibm.syscolumns where tbname = 'BUSINESS_CONTRACT'
1.4 db2查看數據庫代碼集
db2 查看代碼集:
db2 get db cfg for sample
注意:
寫法:db2set codepage=1386
注意:1386為GBK,1208為UTF-8
通常windows下默認為GBK,所以windows上有字符集為UTF-8的db2數據庫導數據導不出的時候,需要db2codepage配置即可==》將db2codepage設置為1208,導出數據,然后再將1386設置回去即可。
(原因:系統是GBK,數據庫是UTF8,所以把系統設置成UTF8,方便導出,但是過后要設置回去,否則,其他GBK的庫和其他應用可能出問題)
1.5 db2存儲過程執行方式
1 在dbvisizer客戶端
函數和存儲過程都要執行為
--/
...
/
2 在db2cmd數據庫端
進入存儲過程sql的路徑
db2 -tvf xxx.sql -td@
注意:sql文件中存儲過程要在結尾用@結束
1.6 db2存儲過程demo
1 帶輸出參數的存儲過程
--/
CREATE PROCEDURE proc_GETWASTEDATE (in pCodeNo varchar(40), in pItemNo varchar(40),out occurdate2 varchar(10))
language sql
begin
select occurdate into occurdate2 from (select bw.OCCURDATE as OCCURDATE,bw.ACTUALCREDITSUM as ACTUALCREDITSUM,row_number() over() as R from DB2ADMIN.BUSINESS_WASTEBOOK bw where bw.RELATIVESERIALNO = pCodeNo and bw.OCCURDIRECTION = '1' order by bw.serialno desc) where R = pItemNo ;
end
/
1.7 db2函數紀要
區分大小寫
2 db2cmd 相關
2.1 db2cmd windows卸載db2數據庫
1 查詢並刪除已有的數據庫
windows R==》cmd==>db2cmd 打開db2命令窗口。
查詢已有的數據庫目錄:db2 list database directory
取消節點編目:(我建的數據庫版本太高,只空建數據庫,導入不成功,故卸載當前數據庫):db2 uncatalog db WQBANK
2 控制面板卸載
windows r==》control==》Db2 express-C - DB2COPY1==》卸載
2.2 db2cmd 執行 .sql文件腳本
基本語法:<切換到腳本所在路徑下>
db2 -svtf Script.sql
參數中:
s 代表遇到錯誤時中止運行腳本
v 代表輸出結果到屏幕
t 指以;號作為每行的分隔符
f 指后面需跟腳本文件名
2.3 db2cmd 數據庫的啟動關閉
db2 啟動單個庫
在db2cmd窗口 啟動訪問:
db2 deactivate db sample
停止訪問:
db2 uncatalog database sample
db2 terminate
db2 terminate 除了斷開連接以外,它還終止clp(命令行處理器)的后台進程,也就是常見的db2bp:back-end process
啟動訪問:
db2 catalog database sample
db2 terminate
db2 connect to sample
DB2 Catalog(中文翻譯:編目)就是將遠程的DB Server的信息“映射”到本地來,方便接下來的DB操作
2.4 db2cmd 常用sql
3 DB2報錯相關
3.1 db2 通用錯誤 查詢
db2 錯誤查詢
針對db2錯誤,查詢方法如下:
進入db2cmd,連接數據庫。
db2 ? sql-433
3.2 db2報錯 SQL1042C
db2 SQL1042C 發生了意外的系統錯誤。 SQLSTATE=58004
系統:windowsServer
問題原因:使用
誤刪已存在的數據庫的日志文件夾,db2 connect to db和db2 drop db dbname報錯
db2 SQL1042C 發生了意外的系統錯誤。 SQLSTATE=58004
解決方法:直接將其他的日志文件夾復制改為已刪的日志文件夾,db2 drop db dbname, drop成功后,重新還原一下數據庫即可
3.3 db2報錯 SQL6036N
db2 SQL6036N START 或 STOP DATABASE MANAGER 命令已在處理之中
解決方案:
db2cmd中依次執行
db2_kill,
db2start
即可。
問題原因:db2掛起,殺掉db2相關進程即可。
相關網頁連接:
http://www-01.ibm.com/support/docview.wss?uid=swg21427711
3.4 db2報錯 SQL1035N
db2 SQL1035N 操作失敗,因為無法以請求的方式來連接指定的數據庫。 SQLSTATE=57019
問題現象:我是在備份數據庫的時候遇到這種錯誤,
問題原因:查到原因是備份數據庫的時點,還有其他用戶正在連接當前數據庫。
解決方案:解決問題的關鍵是:等所有用戶都不操作數據庫的時候在備份
3.5 db2報錯 SQLCODE=-811
db2 SQLCODE=-811, SQLSTATE=21000
問題:今天查詢多表關聯的時候報錯,
報錯內容為:Caused by com.ibm.db2.jcc.am.SqlException: DB2 SQL Error: SQLCODE=-811, SQLSTATE=21000, SQLERRMC=null, DRIVER=4.8.87
網絡答案為:查詢語句的結果 多於一行。
思考:應該在函數里報的錯,找到報錯的函數GETBUILDERNAME()
select BC.CUSTOMERNAME
FROM BUSINESS_CONTRACT BC,CREDITLINE_RELA CR
WHERE CR.LineNo = BC.SerialNo and CR.ObjectType='BusinessContract' and CR.ObjectNo=pSerialNo and CR.FLAG ='3030010' group by BC.CUSTOMERNAME;
函數含義為根據房貸的合同流水號CREDITLINE_RELA.objectno找到開發商樓宇按揭的流水號lineno,理論上,每個合同應該只有一條額度,出現這種問題,肯定是
兩條CREDITLINE_RELA 記錄的ObjectNo相同,lineno不同。
於是sql查詢:
select lineno,CREDITLINE_RELA.OBJECTNO from DB2ADMIN.CREDITLINE_RELA where CREDITLINE_RELA.OBJECTTYPE = 'BusinessContract' and FLAG ='3030010' group by lineno,objectno having count(serialno) > 1;
查到重復的ObjectNo,對比刪除掉后,重新跑批正常。
3.6 db2報錯 SQL0551N
db2 導出權限 SQL0551N "DB2ADMIN" 不具有對對象 "NULLID.DB2L0H00" 執行操作 "EXECUTE"
原因:db2admin用戶無該庫的導出權限
解決方案:
在server端 在該庫下給該用戶賦權即可。
開始==》IBM DB2==>DB2COPY1(缺省值)==》一般管理工具==》控制中心==》所有數據庫==》WQCDP==》用戶名和組對象==》數據庫用戶 ==》db2admin==》更改用戶權限==》數據庫管理員權限和安全管理員權限 勾選==》確定
無需重啟數據庫,重新導出即可
3.7 db2報錯 Error Code: -20054
db2 Error Code: -20054, SQL State: 55019
1 錯誤:
Error Code: -20054, SQL State: 55019
2 原因:
表加字段后,刪除字段,但是沒有刪掉。再次刪除的報錯如上。
3 分析:
出錯原因鎖表,解鎖即可。
4 解決方案:
3.8 db2報錯 SQLCODE=-206 DB2 SQL Error: SQLCODE=-206, SQLSTATE=42703
1 今天在db2命令窗口中執行 db2 -t -vf db2look.ddl 導入數據庫表結構的時候報了一個錯。
報錯如下:
[Error Code: -206, SQL State: 42703] DB2 SQL Error: SQLCODE=-206, SQLSTATE=42703, SQLERRMC=NLS_STRING_UNITS, DRIVER=4.15.82
后來查看ddl文件,單個執行插入index
SET NLS_STRING_UNITS = 'SYSTEM';
CREATE INDEX "DB2ADMIN"."IDX_EVALUATE_RECORD" ON "DB2ADMIN"."EVALUATE_RECORD" ("SERIALNO" ASC) COMPRESS NO INCLUDE NULL KEYS ALLOW REVERSE SCANS;
執行不成功,報錯。
但是去掉 標藍部分后可以執行.
解決方法:標藍部分去除,成功執行。
轉載請注明:菜鳥乙
3.9 db2報錯 SQLCODE=-668
DB2 SQL Error: SQLCODE=-668, SQLSTATE=57016
今天,測試環境調查報告報出空指針異常。經排查。
是其中一個表report_record查詢的時候報錯。
報錯:
DB2 SQL Error: SQLCODE=-668, SQLSTATE=57016
原因:
因為是新導的數據庫(db2 load方式加載的數據),經過網上的查詢。
使用reorg table解表,依然報錯。
查詢表的狀態:
db2 load query table report_record
顯示暫掛狀態
然后進行解掛:
db2 load from /dev/null of del terminate into report_record
解掛之后,再次在db2客戶端查詢report_record,可以查詢到,同樣,在調查報告部分,不再報空指針異常。
至此,問題解決。
3.A db2報錯 SQLCODE=-551, SQLSTATE=42501
今天我把db2數據庫由a庫導入b庫。(a庫,b庫的用戶名,密碼完全一致)
導入成功后,查詢b庫的c表:
select * from c;
報錯如下:
SQLCODE=-551, SQLSTATE=42501
經多方查詢,
問題: 單表授予查詢權限
原因:是沒有給c表賦予查詢權限。
1 賦予單表查詢權限
網絡上給出答案:
db2 grant select on table DB2ADMIN.c to DB2ADMIN With Grant Option
在db2命令窗口中,執行該sql后,查詢c表,能夠查詢成功。
那么問題來了,我把a庫的表結構,函數,視圖,數據等等全部導入b庫,肯定每一個表都要查詢的呀
從網上搜索很長時間,查詢到
select * from syscat.tables where syscat.tables.TABSCHEMA = 'DB2ADMIN' order by syscat.tables.TABNAME
我看出了差異,在a庫里,tabschma和owner都是同一用戶,在b表庫不是。
經過排查,得知b庫中owner為Administrator,顯然,向b庫導入表結構的時候,擁有權限的是Administrator.
講到這里大家應該明白了吧。我數據庫的用戶名和當時電腦的用戶名稱不一致。
於是,我想到,是不是能夠,在向b庫導入表結構的時候,在db2命令窗口中,將Administrator切換到DB2ADMIN?(於是刪掉庫重新導入)
於是步驟如下:
。。。
查看當前用戶 db2 select current schema from sysibm.sysdummy1
切換用戶模式 db2 set current schema db2admin
連接數據庫 db2 connect to WQBANK2 user db2admin using DB2_admin
導入表結構 db2 -t -vf db2look.ddl
但是導入結果差強人意,在b庫中,owner依然是Administrator。(即b庫導表結構時,owner只取決於電腦的用戶)
於是,目前為止,只有兩種方式能解決我的問題了
1 重新登錄電腦,將用戶切換到db2admin,再進行導入。
2 在Administrator用戶下,在db2命令窗口中,找到數據庫賦予權限的方法。
由於,工作的電腦的庫在遠程上,客戶方有很多其他資源在服務器上,因此1方法很自然不能使用,被排除(避免引起權限沖突)
2方法經過多方查詢,查到一種折中的方法來解決。
問題: 數據庫授予查詢權限
原因: 數據庫授予查詢權限
2 賦予數據庫查詢權限
a 在數據庫客戶端(dbvisualizer)執行以下命令
select 'db2 grant select on table DB2ADMIN.'|| tabname ||' to DB2ADMIN With Grant Option' from syscat.tables where tabschema='DB2ADMIN';
循環取值
b 將查詢的結果,copy出來,直接放到db2命令窗口,運行完畢,所有數據庫表都可以查詢
注意 不能直接把db2 grant的多條查詢放到db2命令窗口,不然不執行,目前為止不明白為什么
現在表能夠查詢了,但是表還是不能修改呀,視圖不能操作呀。於是,在此基礎上,我又稍作修改。
問題: 數據庫授予修改等權限
原因: 數據庫授予修改等權限
3 賦予數據庫修改等權限
a 在數據庫客戶端(dbvisualizer)執行以下命令
select 'db2 grant select,INSERT,update,delete,ALTER,CONTROL on table DB2ADMIN.'|| tabname ||' to DB2ADMIN ' from syscat.tables where tabschema='DB2ADMIN'循環取值
b 將查詢的結果,copy出來,直接放到db2命令窗口,運行完畢,所有數據庫表都可以查詢
注意 不能直接把db2 grant的多條查詢放到db2命令窗口,不然不執行,目前為止不明白為什么
然后問題完美解決。然后還有個問題,就是我這個新庫是否有connect的權限呀?(db2 connect權限和select等權限不是一個級別)只能到明天再看了。
3.B db2報錯 Error Code: -104, SQL State: 42601
今天db2數據庫建立函數,實現兩個金額相加的功能,新建的函數報錯。具體報錯內容如下:
... Physical database connection acquired for: DB2 10:39:57 [CREATE - 0 row(s), 0.000 secs] [Error Code: -104, SQL State: 42601] DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601, SQLERRMC=declare basum decimal(;NO EXTERNAL ACTION
;<psm_begin_function_compou, DRIVER=4.15.82 ... 1 statement(s) executed, 0 row(s) affected, exec/fetch time: 0.000/0.000 sec [0 successful, 0 warnings, 1 errors]
后經解決后函數如下:可以使用
--/ CREATE FUNCTION GETTHIRDGUARCONPANYSUM(pSerialNo varchar(30)) returns decimal(24,2) language sql SPECIFIC SQL180104155828802 begin atomic declare sumThirdCompBAMoney decimal(24,2); declare sumThirdCompBCMoney decimal(24,2); declare sumThirdCompMoney decimal(24,2);
set sumThirdCompBAMoney = (select sum(ba.BUSINESSSUM) from CREDITLINE_RELA cr,flow_object fo,business_apply ba where cr.lineno = pSerialNo and cr.objecttype = 'CreditApply' and fo.OBJECTNO = cr.objectno and fo.phaseno not in ('0010','8000','1000') and ba.serialno = cr.objectno and cr.objectno not in (select bc.RELATIVESERIALNO from business_contract bc,CREDITLINE_RELA ccr where ccr.ObjectType='BusinessContract' and ccr.lineno = pSerialNo and ccr.objectno = bc.serialno)); IF (sumThirdCompBAMoney IS NULL ) THEN SET sumThirdCompBAMoney = 0.00; END IF;
set sumThirdCompBCMoney = (select sum(nvl(balance,businesssum)) from CREDITLINE_RELA cr,business_contract bc where cr.ObjectType='BusinessContract' and cr.lineno = pSerialNo and cr.objectno = bc.serialno and (bc.finishdate is null or bc.finishdate = '') and (bc.PIGEONHOLEDATE is null or bc.PIGEONHOLEDATE = '')); IF (sumThirdCompBCMoney IS NULL ) THEN SET sumThirdCompBCMoney = 0.00; END IF;
set sumThirdCompMoney = sumThirdCompBAMoney+sumThirdCompBCMoney; return sumThirdCompMoney;end /
3.C db2報錯 SQL5005C 錯誤
db2 WIN10安裝DB2后啟動報 SQL5005C 錯誤今天遇到了個這么奇葩的問題,在安裝db2數據庫完成后,登錄的時候提示 SQL5005C 錯誤
然后網上有各種說法也沒有解決問題
我是用db2用戶新建的庫,電腦當前用戶是weijingli,用weijingli等錄電腦建庫報錯。
於是,我在電腦上新建db2用戶。
windows L 鎖屏,重新用db2用戶登錄,
重新建庫,發現db2建庫成功。
至此,問題解決
3.D db2報錯 事務日志滿
問題:
在db2命令行界面執行db2 delete A表的時候,報錯:事務日志滿。
原因:
A表有60多萬條數據,執行的時候由於數據量過大導致事務日志滿。
解決方案:
a 方案:停掉所有應用程序,重啟數據庫
db2 force applications all
db2stop(注意,必須在Administrator用戶下執行)
db2start
但是數據量太大,db2 delete 依然執行不了
b 方案:增大日志文件大小
該方案是從網上搜的,執行的時候報錯,所以依然失敗
c 方案:drop表,重新導入表結構和索引
考慮到表的數據量實在太大,在db2客戶端delete的時候直接崩掉。
所以我把A表相關的表結構和索引導了出來。
直接drop掉表,重新導入。
執行成功。
3.E db2報錯 windows db2命令窗口刪除數據庫刪除不了
首先,你需要查看鏈接該數據庫有多少應用
db2 list applications
--然后在殺掉這些應用db2
--db2 force applications all
最后停止數據庫
db2 deactivate database cms
斷開
db2 terminate
然后就可以刪除該數據庫了
db2 drop database cms
3.F db2報錯 DB21034E
1 今天在db2命令窗口中執行 db2 -t -vf db2look.ddl 導入數據庫表結構的時候報了一個錯。
報錯如下:
該命令被當作 SQL 語句來處理,因為它是無效的“命令行處理器”命令。在
SQL 處理期間,它返回:
SQL0204N "DB2ADMIN.CUSTOMER_RELATIVE" 是一個未定義的名稱。 LINE NUMBER=2.
SQLSTATE=42704
經過多方查詢,依然沒有找到解決方法。
后來查看ddl文件,單個執行插入table
CREATE TABLE "DB2ADMIN"."BUG_REPORT" (
"BUGID" VARCHAR(32) NOT NULL ,
"INPUTTIME" VARCHAR(20) ,
"SOLVERESULT" VARCHAR(250) ,
"SOLVETIME" VARCHAR(20) )
IN "USERSPACE1"
ORGANIZE BY ROW;
執行不成功,報錯。
但是去掉 IN "USERSPACE1"
ORGANIZE BY ROW后可以執行.
思索:通過標紅部分,應該是沒有建立相對應的表空間。
db2 list tablespaces
查看表空間,果然如此。
解決方法:然后我把ddl的全部相關表空間設置的部分( IN "USERSPACE1" ORGANIZE BY ROW)去除,成功執行。