基本操作 db2


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
db2cmd
db2 list db directory        --查看db2數據庫列表
db2 start        --啟動db2數據庫
db2 connect to WQBANK user db2admin using abc_123 --連接db2數據庫(可以寫sql命令)
db2 select userid from user_info --查詢sql命令

 

 

3    DB2報錯相關
3.1  db2  通用錯誤  查詢

db2 錯誤查詢

針對db2錯誤,查詢方法如下:

進入db2cmd,連接數據庫。

db2 ? sql-433

 

3.2   db2報錯 SQL1042C

db2 SQL1042C  發生了意外的系統錯誤。  SQLSTATE=58004

系統:windowsServer

問題原因:使用

db2 restore db WQTEST user db2admin using DB2_admin from H:\20180314\test into AA方式還原數據庫。

誤刪已存在的數據庫的日志文件夾,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    解決方案:

CALL SYSPROC.ADMIN_CMD('reorg table 表名');
 
 
 
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)去除,成功執行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM