溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

DB2 常用命令

發(fā)布時(shí)間:2020-07-15 07:08:35 來源:網(wǎng)絡(luò) 閱讀:694 作者:涼了涼了 欄目:數(shù)據(jù)庫(kù)

啟動(dòng)數(shù)據(jù)庫(kù):

啟動(dòng)db2服務(wù):db2start

激活數(shù)據(jù)庫(kù)實(shí)例:db2 activate database  <db_name>

查看激活狀態(tài)的數(shù)據(jù)庫(kù):db2 list active databases

?

關(guān)閉數(shù)據(jù)庫(kù):

失效數(shù)據(jù)庫(kù)實(shí)例:db2 deactivate database <db_name>

關(guān)閉數(shù)據(jù)庫(kù)服務(wù):db2stop


查看數(shù)據(jù)庫(kù):db2 list db directory

查看數(shù)據(jù)庫(kù)應(yīng)用:db2 list applications

查看數(shù)據(jù)庫(kù)應(yīng)用和進(jìn)程號(hào):db2 list applications show detail

查看數(shù)據(jù)庫(kù)表空間:db2pd -db <db_name> -tablespace

查看數(shù)據(jù)庫(kù)配置:db2 get db cfg for <db_name>

連接數(shù)據(jù)庫(kù):db2 connect to <db_name>

                    db2 connect to <db_name> user[user_name] using [password]

斷開數(shù)據(jù)庫(kù)連接:db2 connect reset/db2 terminate

創(chuàng)建數(shù)據(jù)庫(kù):db2 create db <db_name>

刪除數(shù)據(jù)庫(kù):db2 drop database <db_name>  (如果不能刪除,嘗試斷開激活的連接或者重啟db2)


列出系統(tǒng)表:db2 list tables for system

列出所有用戶表:db2 list tables

列出所有表:db2 list tables for all

列出特定用戶表:db2 list tables for schema [user]


復(fù)制一張表:db2 create table t1 like t2

顯示表結(jié)構(gòu):db2 describe table tablename

查詢表:db2 "select * from table tablename where ..."

執(zhí)行SQL腳本:db2 -tvf scripts.sql


查看錯(cuò)誤代碼信息:

db2 ? 10054

 

停止激活的連接:

db2 force application all;

db2 force application all;

db2 force application all;

db2stop

 

查看死鎖: 

db2 get snapshot for locks on <db_name>

db2 "select agent_id,tabname,lock_mode from table(snap_get_lock('<db_name>')) as aa"


殺掉進(jìn)程: 

db2 force application(NUM)

 

 監(jiān)控DB2消耗多的SQL語句:

eg:(DB_NAME=SUNDB)

db2top -d SUNDB  -----查看消耗資源 按照提示按 l,出現(xiàn)Application Handle,找到資源消耗大的Application Handle(stat)

記下app handle。

db2pd -d SUNDB -dyn -application > /tmp/db2pd1.txt    ----到處會(huì)話語句,準(zhǔn)備進(jìn)行調(diào)優(yōu)


設(shè)置連接方式(重啟才會(huì)生效):

db2set DB2COMM=tcpip

db2set DB2COMM=            


一、db2 基礎(chǔ)

基本語法

注釋:“--”(兩個(gè)減號(hào))

字符串連接:“||”

如set msg=’aaaa’||’bbbb’,則msg為’aaaabbbb’

字符串的引用:‘’(一定用單引號(hào)),如果需要輸入單引號(hào),輸入兩個(gè)單引號(hào)即可。

語句結(jié)束:“;”

語法來源:PASCLE

 

轉(zhuǎn)義字符

如果你想查詢字符串中包含‘%’或‘_’ ,就得使用轉(zhuǎn)義字符(Escape Characters)。比如,要想查詢book_title中包含字符串’99%’的紀(jì)錄:

SELECT * FROM books WHERE book_title like ‘%99!%%’ escape ‘!’

后面的escape ‘!’是定一個(gè)轉(zhuǎn)義字符‘!’, 指明緊跟著轉(zhuǎn)義字符’!'后的%不再是統(tǒng)配符。

 

DB2命令參數(shù)選項(xiàng)

Db2 list command options 可以查看

-a 顯示 SQLCA OFF 

-c 自動(dòng)落實(shí) ON 

-e 顯示 SQLCODE/SQLSTATE OFF 

-f 讀取輸入文件 OFF 

-l 將命令記錄到歷史文件中 OFF 

-n 除去換行字符 OFF 

-o 顯示輸出 ON 

-p 顯示交互式輸入提示 ON 

-r 將輸出保存到報(bào)告文件 OFF 

-s 在命令出錯(cuò)時(shí)停止執(zhí)行 OFF 

-t 設(shè)置語句終止字符 OFF 

-v 回送當(dāng)前命令 OFF 

-w 顯示 FETCH/SELECT 警告信息 ON 

-x 不打印列標(biāo)題 OFF 

-z 將所有輸出保存到輸出文件 OFF 


這些選項(xiàng)的具體功能及其缺省設(shè)置為:

.a 顯示 SQLCA 的數(shù)據(jù),缺省為 OFF。

.c 是否自動(dòng)落實(shí) SQL 命令,缺省為 ON。

.e {c|s} 顯示 SQLCODE 或 SQLSTATE,缺省為 OFF。

.f 文件名將命令的輸入從標(biāo)準(zhǔn)輸入指定到某一文件,缺省為 OFF。

注:命令“db2 < 文件名”與“db2 -f 文件名”作用相同。

.l 文件名將命令記錄到歷史文件中,缺省為 OFF。

.n 除去換行字符,缺省為 OFF。

.o 將輸出數(shù)據(jù)及信息送到標(biāo)準(zhǔn)輸出,缺省為 ON。

.p 在交互方式下顯示命令行處理器的提示信息,缺省為 ON。

.r 將輸出保存到指定文件中,缺省為 OFF。

.s 執(zhí)行批處理文件中或交互方式下的命令出錯(cuò)時(shí)即停止執(zhí)行操作,缺省為 OFF。

.t 設(shè)置語句終止字符,缺省為 OFF。

.v 回送當(dāng)前命令到標(biāo)準(zhǔn)輸出,缺省為 OFF。

.w 顯示 FETCH 或 SELECT 警告信息,缺省為 ON。

.x 不打印列標(biāo)題,缺省為 OFF。

.z 文件名將所有輸出保存到輸出文件,缺省為 OFF。

SQLSTATE含義

在db2命令行方式下輸入:? 20012(SQLSTATE值)

可以獲取sql錯(cuò)誤含義

import和export的用法

IMPORT FROM CO_ACCEPTANCEDRAFT.del OF DEL MESSAGES importmsgs.txt INSERT INTO cmmcorc.CO_ACCEPTANCEDRAFT;

EXPORT TO CO_ACCEPTANCEDRAFT.del OF DEL MESSAGES exportmsgs.txt SELECT * FROM cmmcorc.CO_ACCEPTANCEDRAFT;

 

如果是Sybase導(dǎo)出的文本,并且用TAB分隔符的文檔,那么可以采用

Db2 import from filename.txt of del modified by COLDEL0x09 insert into tablename;

其中COLDEL是關(guān)鍵字,0x09是16進(jìn)制,表示tab符號(hào)

Load用法

load from tempfile of del modified by delprioritychar replace into TABLENAME nonrecoverable;

說明: 

在不相關(guān)的數(shù)據(jù)表export數(shù)據(jù)時(shí),可以采取并發(fā)的形式,以提高效率;

TABLENAME指待清理table的名稱;

modified by delprioritychar防止數(shù)據(jù)庫(kù)記錄中存在換行符,導(dǎo)致數(shù)據(jù)無法裝入的情況;

replace into對(duì)現(xiàn)數(shù)據(jù)庫(kù)中的內(nèi)容進(jìn)行替換,即將現(xiàn)行的數(shù)據(jù)記錄清理,替換為數(shù)據(jù)文件內(nèi)容;

nonrecoverable無日志方式裝入;

 

查詢出用戶表

SELECT * FROM SYSIBM.SYSTABLES WHERE CREATOR='USER'

 

如何知道當(dāng)前DB2的版本?

 select * from  sysibm.sysversions

 

如何知道TABLESPACE的狀況?

    select * from  sysibm.SYSTABLESPACES

 

 如何知道INDEX的狀況?

    select * from  sysibm.sysindexes where tbname=’XXXX’

 or

 describe indexes for table table_name show detail

測(cè)試SQL的執(zhí)行性能

db2batch -d DB_NAME -f select.sql -r benchmark.txt -o p3

 

select.sql是select語句寫在文件中

如何獲取連接的進(jìn)程

List applications

刪除當(dāng)前正在使用的application:

db2 "force application (Id1,Id2,Id3)"

Id1,Id2,Id3 是List顯示的應(yīng)用號(hào);

刪除所有的進(jìn)程 db2 force application all

查看當(dāng)前應(yīng)用號(hào)的執(zhí)行狀態(tài):

db2 get snapshot for application agentid 299 |grep Row

 

如何修改緩沖池

db2 alter bufferpool ibmdefaultbp size 10240

 

如何知道表的字段的狀況?

    select * from  sysibm.syscolumns where tbname=’XXXX’

 

 如何知道DB2的數(shù)據(jù)類型?

    select name,* from  sysibm.sysdatatypes

 

如何知道BUFFERPOOLS狀況?

    select * from  sysibm.sysbufferpools

 

如何查看表的結(jié)構(gòu)?

  describe table table_name

    or

 describe select * from schema.table_name

如何快速清除一個(gè)大表?

   alter table table_name activate not logged initally with empty table

   or

   import from null_file of del replace into table_name

如何查看數(shù)據(jù)庫(kù)的包?

    select * from  syscat.packages

如何查看數(shù)據(jù)庫(kù)的存儲(chǔ)過程?

select procname,text,* from syscat.procedures

Or

select procname,text from sysibm.sysprocedures

如何查看數(shù)據(jù)庫(kù)SAMPLE的配置文件的內(nèi)容?

get database configuration for sample

or

get db cfg for sample

如何將數(shù)據(jù)庫(kù)SAMPLE的參數(shù)設(shè)置為默認(rèn)數(shù)值?

reset database configuration for sample

or

reset db cfg for sample

如何修改數(shù)據(jù)庫(kù)SAMPLE配置參數(shù)數(shù)值?

update database configuration for sample

    using <parameter name> <new value>

or

update db cfg for sample using <parameter name> <new value>

如何重新啟動(dòng)數(shù)據(jù)庫(kù)?

    Restart db db_name

如何激活數(shù)據(jù)庫(kù)?

    Activate db db_name

如何停止數(shù)據(jù)庫(kù)?

    Deactivate db db_name

如何重命名表?

    Rename old_tablename to new_tablename

如何設(shè)置DB2環(huán)境變量

Db2set命令,語法如下:

Db2set variant=value

如何除去quiesce狀態(tài)

1. 連接到數(shù)據(jù)庫(kù)

2. 用 list tablespaces 判斷哪個(gè)tablespace處于quiesce狀態(tài)和和取得對(duì)象(object)ID

3. 判斷對(duì)象ID對(duì)應(yīng)的表

a)用 db2 "select tabname from syscat.tables where tablid=對(duì)象ID" 得到表名

b)用 db2 list history 判斷是那個(gè)表

4. 用 db2 quiesce tablespaces for table 表名 reset 去除quiesce狀態(tài)

如何實(shí)施已刪除表的恢復(fù)(Dropped Table Recovery)

1. 首先數(shù)據(jù)庫(kù)要可以前滾恢復(fù)(數(shù)據(jù)庫(kù)配置參數(shù)logretain或userexit打開)。

2. 對(duì)要實(shí)施Drop Table Recovery的表空間(限r(nóng)egular tablespace),執(zhí)行:

alter tablespace 表空間名 dropped table recovery on

3. 用 list history dropped table all for 數(shù)據(jù)庫(kù)名 得到刪除表的tableid(例如 0000000000006d0000020003)和表結(jié)構(gòu)的生成語句(DDL),記錄tableid和該語句以便恢復(fù)。之后,用drop命令刪除的表中的數(shù)據(jù)可以在前滾恢復(fù)時(shí)導(dǎo)出。

4. 恢復(fù)數(shù)據(jù)庫(kù)后,如果想恢復(fù)已刪除的表,在前滾時(shí)加recover dropped table tableid to 目標(biāo)目錄 。 在該目錄下被刪除的表中的數(shù)據(jù)導(dǎo)出,例如導(dǎo)出至 ../NODE0000/data文件。利用上面提到表結(jié)構(gòu)生成語句生成被刪除了的表,然后用import命令將數(shù)據(jù)導(dǎo)入表中。

如何備份數(shù)據(jù)庫(kù)

db2 "backup database sample tablespace (syscatspace, userspace1) online to /dev/rmt0 without prompting"

or

db2 "backup database sample user db2admin using db2admin to c:\backup with 3 buffers buffer 1000 without prompting"

 

 

如何生成所有對(duì)象的DDL

db2look -d DB_NAME -a -e -m -l -f -o filename.sql

如何恢復(fù)數(shù)據(jù)庫(kù)

restore db db1 to /tstdb2/catalog into db newlogpath /tstdb2/db2log buffer 2048

replace existing redirect parallelism 16;

set tablespace containers for 1 using (path '/tstdb2/db2tmp');

set tablespace containers for 2 using

(device '/dev/rtstcontlv00' 2621440, device '/dev/rtstcontlv01' 2621440,

device '/dev/rtstcontlv02' 2621440, device '/dev/rtstcontlv03' 2621440 ) ;

restore db db1 continue;

 

恢復(fù)完成后,執(zhí)行db2s命令,如果出錯(cuò),再執(zhí)行如下命令:

db2 rollforward db db to end of logs and complete

如何查看數(shù)據(jù)庫(kù)目錄

1)首先用 db2 list database directory 命令查看系統(tǒng)資料庫(kù)目錄(System Database Directory)中有沒有該資料庫(kù)。

如果有,應(yīng)該再確定該資料庫(kù)是沒有用的資料庫(kù)之後用 db2 drop database 資料庫(kù)名將其刪除。


2)如果沒有,再用 db2 list database directory on location 看在本端資料庫(kù)目錄(Local Database Directory)中有沒有該資料庫(kù),location指定資料庫(kù)的位置(如Windows下的C: ,Unix下的/home/db2inst1)。

如何更改本地系統(tǒng)名稱

1.db2set db2system=新系統(tǒng)名

2. db2 terminate 

3. db2 uncatalog node 原節(jié)點(diǎn)名

4. db2 terminate

如何使用DB2MOVE

Db2move DB_NAME action <options> -u USERID –p PASSWORD

Action:export,import,load

Options如下:

Option

Default

Notes

-tc

table-creators

all_creators

EXPORT.Wildcard

-tn

table-names

all_user_tables

EXPORT.Wildcard

-sn

schema-names

all_schemas

EXPORT.Wildcard

-ts

tblspace-names

all_tablespace

EXPORT.Wildcard

-tf

tables

from

file

-io

import-option

REPLACE_CREATE

IMPORT_only.

-lo

load-option

INSERT

LOAD_only.

-l

lobpaths

current_dir

separated_by_commas.NO

-u

userid

logged_on_userid

 

-p

password

logged_on_password

 

-aw

allow-warnings

false

include

 

warnings

during

export.

例如:

Db2move ehrdb export –u ehr –p ehr

Db2move ehrdb import –u her –p ehr

IMPORT如何避免日志滿出錯(cuò)

在使用IMPORT命令向數(shù)據(jù)庫(kù)出入數(shù)據(jù)時(shí),如何避免日志空間滿錯(cuò)誤? 


在執(zhí)行IMPORT命令時(shí), 如果使用循環(huán)日志, 有時(shí)會(huì)出現(xiàn)日志滿錯(cuò)誤, 

這時(shí)可用COMMITCOUNT參數(shù)來解決. 

因?yàn)槿罩究臻g滿往往是因?yàn)樗械娜罩揪幱诨顒?dòng)狀態(tài)導(dǎo)致的. 

而COMMIT執(zhí)行后, 會(huì)釋放所占據(jù)的資源, 其中包括日志 . 

這樣, 被當(dāng)前事務(wù)使用的日志在COMMIT命令執(zhí)行后, 即變成非活動(dòng)狀態(tài)了.

如何處理日值

-日志處理

DB2日志是以文件的形式存放在文件系統(tǒng)中,分為兩種模式:循環(huán)日志和歸檔日志。當(dāng)創(chuàng)建新數(shù)據(jù)庫(kù)時(shí),日志的缺省模式是循環(huán)日志。在這種模式下,只能實(shí)現(xiàn)數(shù)據(jù)庫(kù)的脫機(jī)備份和恢復(fù)。如果要實(shí)現(xiàn)聯(lián)機(jī)備份和恢復(fù),必須設(shè)為歸檔日志模式。

目前在綜合業(yè)務(wù)系統(tǒng)中,設(shè)置的均是歸檔日志模式;其它系統(tǒng)(如事后監(jiān)督、經(jīng)營(yíng)決策、中間業(yè)務(wù)等)一般都設(shè)置為循環(huán)日志模式。至于采用何種模式,可以通過修改數(shù)據(jù)庫(kù)配置參數(shù)(LOGRETAIN)來實(shí)現(xiàn): 歸檔日志模式:db2 update db cfg for using logretain on 注:改為on后,查看數(shù)據(jù)庫(kù)配置參數(shù)logretain的值時(shí),實(shí)際顯示的是recovery。改變此參數(shù)后,再次連接數(shù)據(jù)庫(kù)會(huì)顯示數(shù)據(jù)庫(kù)處于備份暫掛(BACKUP PENDING)狀態(tài)。這時(shí),需要做一次對(duì)數(shù)據(jù)庫(kù)的脫機(jī)備份(db2 backup db ),才能使數(shù)據(jù)庫(kù)狀態(tài)變?yōu)檎!?/p>

循環(huán)日志模式:db2 update db cfg for using logretain off

-處理步驟

必須按照以下正確的步驟進(jìn)行操作:

要求必須使用DB2命令PRUNE進(jìn)行清理,不建議使用rm命令刪除。

刪除前應(yīng)保證應(yīng)用已停止(即聯(lián)機(jī)已下來)。

查看當(dāng)前使用的日志文件目錄及第一活動(dòng)日志文件

用 “db2 get db cfg for ”命令查看日志文件目錄(Path to log files)參數(shù),確定數(shù)據(jù)庫(kù)當(dāng)前使用的日志文件目錄。 例如:Path to log files = /db2log/,說明DB2日志存放目錄是/db2log

用 “db2 get db cfg for ”命令查看第一活動(dòng)日志文件(First active log file)參數(shù),該參數(shù)對(duì)應(yīng)的日志文件之前的日志文件均為歸檔日志文件,如果確認(rèn)沒有用,可以刪除。例如:First active log file = S0015913.LOG,說明當(dāng)前第一活動(dòng)日志文件是S0015913.LOG。 

備份好要?jiǎng)h除的歸檔日志

刪除歸檔日志 以應(yīng)用用戶(如BTP)登錄,執(zhí)行:


$ db2 connect to 


$ db2 prune logfile prior to S???????.LOG


注:S???????.LOG為查看到的第一活動(dòng)日志文件。此命令可以將當(dāng)前第一活動(dòng)日志文件之前的歸檔日志文件全部刪除。


如何清理db2diag.log文件

db2diag.log,是用來記錄DB2數(shù)據(jù)庫(kù)運(yùn)行中的信息的文件??梢酝ㄟ^此文件,查看記錄的有關(guān)DB2數(shù)據(jù)庫(kù)詳細(xì)的錯(cuò)誤信息。此文件也是不斷增大的,需要定期進(jìn)行清理。

可以通過查看實(shí)例的配置參數(shù)DIAGPATH,來確定db2diag.log文件是放在哪個(gè)目錄下:db2 get dbm cfg 如果Diagnostic data directory path(DIAGPATH) = /home/db2inst1/sqllib/db2dump,則此文件是放在/home/db2inst1/sqllib/db2dump目錄下。當(dāng)文件系統(tǒng)/home的使用率達(dá)到80%-90%左右時(shí),應(yīng)及時(shí)刪除db2diag.log文件。

請(qǐng)按以下正確步驟操作:確認(rèn)應(yīng)用(如BTP)、DB2已經(jīng)停止。

將原db2diag.log文件備份到其它文件系統(tǒng)下。

刪除db2diag.log文件。刪除后,DB2會(huì)自動(dòng)創(chuàng)建一個(gè)新的文件。

 

標(biāo)準(zhǔn)函數(shù)

length: 返回自變量中的字節(jié)數(shù)

CAST: 變量類型轉(zhuǎn)換或截?cái)嘧址?/p>

如:CAST(RESUME AS VARCHAR(370))

Select CAST(colname as integer) from tablename;

decimal: 變量轉(zhuǎn)換為指定精度的數(shù)值

如: select decimal(amount,16,2) from tablename;

 

WHERE 子句條件

 

謂詞

功能

x = y

x 等于 y

x <> y

x 不等于 y

x < y

x 小于 y

x > y

x 大于 y

x <= y

x 小于或等于 y

x >= y

x 大于或等于 y

IS NULL/IS NOT NULL

測(cè)試空值

 

獲取系統(tǒng)日期或系統(tǒng)時(shí)間

 

select current time into curtime from (values 1) as tmp;

select current date into curdate from (values 2) as tmp;

select year(current date) into curdate from (values 2) as tmp; --獲取系統(tǒng)年份

select month(current date) into curdate from (values 2) as tmp; --獲取系統(tǒng)月份

select day(current date) into curdate from (values 2) as tmp; --獲取系統(tǒng)日份

(CURRENT TIMESTAMP 精度達(dá)到微秒)

 

如何預(yù)防空值

DB2的COALESCE函數(shù)返回()中表達(dá)式列表中第一個(gè)不為空的表達(dá)式,可以帶多個(gè)表達(dá)式, 和oracle的isnull類似。語法格式如下:

CLEASCE(colname,default_value)

 

多表的關(guān)聯(lián)更新方法

db2的update語法不支持“update table1 set t1.col1=t2.value1 from table1 t1,table2 t2 where …”的寫法,但是可以通過如下方法解決:

update table1 t1 set t1.col1=(select t2.col1 from table2 t2 where …)

例:

update test t1 set (t1.username,t1.instcode) = (select t2.instcode,t2.instname from sysinsttb t2 where t2.instcode=t1.instcode);

獲取操作(insert、update)的記錄數(shù)

GET DIAGNOSTICS rcount=ROW_COUNT;

 

注:

get diagnostics rcount =ROW_COUNT;      

只對(duì)update,insert,delete起作用. 

不對(duì)select into 有效


如何執(zhí)行RUNSTATS等優(yōu)化命令

db2 runstats on table <table_name> with distribution and detailed indexes all

db2 reorgchk update statistics on table all

查看什么時(shí)候進(jìn)行了runstats

db2 "select name, stats_time from sysibm.systables"

 

完整執(zhí)行如下:

db2 connect to ocrm1 user db2iocrm using db2iocrm

db2 runstats on table db2iocrm.eosoperator with distribution and indexes all

db2 reorg table db2iocrm.eosoperator allow read access

db2 reorg indexes all for table db2iocrm.eosoperator allow read access

db2 connect reset

如何獲取結(jié)果集的前N行數(shù)據(jù)

Select * from tablename fetch first N rows only

 

安裝DB2默認(rèn)值?

 

在WINDOWS或OS/2中默認(rèn)實(shí)例的是DB2

在LINUX或UNIX環(huán)境下默認(rèn)實(shí)例的是DB2INST1

 

在WINDOWS或OS/2中默認(rèn)帳戶的是DB2ADMIN

在LINUX或UNIX環(huán)境下默認(rèn)帳戶的是DB2AS

 

如何定義序列

CREATE SEQUENCE ORDERSEQ START WITH 1 INCREMENT BY 1 NOMAXVALUE NOCYCLE CACHE 24

 

例如:

create sequence pk_only_empid;

 

select NEXTVAL FOR pk_only_empid from (values 1) as tmp;

如何關(guān)閉表的日志

  ALTER TABLE TABLE_NAME ACTIVE NOT LOGGED INIALLY

如何獲取SQL執(zhí)行計(jì)劃

SQL 解釋工具

SQL 解釋工具提供查詢優(yōu)化器為 SQL 語句所選擇的訪問計(jì)劃的有關(guān)詳細(xì)信息。該信息存儲(chǔ)在 EXPLAIN 表中,可以在稍后使用諸如 Visual Explain、db2expln、dynexpln 和db2exfmt 的工具進(jìn)行格式化,從而以友好的可視方式進(jìn)行表示。

EXPLAIN 表可以在您第一次使用 Visual Explain 時(shí)自動(dòng)進(jìn)行創(chuàng)建。即使沒有創(chuàng)建它們,您也可以手工進(jìn)行創(chuàng)建,如下:

% cd <db2 install path>\sqllib\misc 

% db2 connect to bank 

% db2 -tvf EXPLAIN.DDL

本文中,我們使用 db2exfmt 工具。例如,使用 db2exfmt 解釋動(dòng)態(tài) SQL 語句,在 DB2命令窗口中按照下列步驟進(jìn)行:


% db2 connect to <database_name>

% db2 set current explain mode explain 

% db2 -tvf <Input file with an SQL statement ended with a semicolon>

% db2 set current explain mode no

% db2exfmt -d <dbname> -g TIC -w -1 -n % -s % -# 0 -o <output file>

如何創(chuàng)建事例?

DB2ICRT <client> INSTNAME <...PARAMETERS>

如果是客戶端,加上client關(guān)鍵字

例如:

1) 用root登錄,命令為smitty創(chuàng)建用戶db2inst1,用于數(shù)據(jù)庫(kù)管理。

2) 用root登錄,使用db2icrt創(chuàng)建實(shí)例DB2 實(shí)例,使用以下命令。

cd /usr/opt/db2*/instance/

./db2icrt -s client db2inst1

3) 用db2inst1用戶登錄,創(chuàng)建數(shù)據(jù)庫(kù)的本地節(jié)點(diǎn)目錄,建立遠(yuǎn)程數(shù)據(jù)庫(kù)映射別名,使用以下命令。

cd /usr/opt/db2*/bin

db2 catalog tcpip node wmsint remote 182.247.70.94 server 60000

db2 catalog database wmsint as wmsint at node wmsint

db2set db2codepage=1386

db2 terminate

4) 為了使root用戶可以使用db2命令,要把home/db2inst1下的.profile文件中的下面一段文字加到根目錄下的.profile中。

PATH=/usr/bin:/etc:/usr/sbin:/usr/ucb:$HOME/bin:/usr/bin/X11:/sbin:.

 

export PATH

 

# The following three lines have been added by UDB DB2.

if [ -f /home/db2inst1/sqllib/db2profile ]; then

    . /home/db2inst1/sqllib/db2profile

fi

5)退出root用戶,重新登入

SQL寫法技巧

多個(gè)字段時(shí)如何不通過使用select子句使用in/not in

    select * from tabschema.tabname where (colA, colB, colC) [not] in (values (valueA1, valueB1, valueC1), (valueA2, valueB2, valueC2), ...(valueAn, valueBn, valueCn))

 

Update tablenameA t1

   Set (colA,colB,colC)=(selelct b.colA,b.colB,b.colC from tablenameB t2 where t1.key = t2.key)

使用部分命令

列出所有實(shí)例 DB2ILIST

獲取當(dāng)前實(shí)例 GET INSTANCE

更新事例的配置 DB2IUPDT

 

刪除事例 DB2IDROP INSTANCE_NAME

具體步驟如下:

 

停止事例上所有應(yīng)用程序

在所有打開的命令行上執(zhí)行DB2 TERMINATE

運(yùn)行DB2STOP

備份DB2INSTPROF注冊(cè)變量指出的事例目錄

退出事例所有登陸者

 

使用DB2IDROP

也可以刪除ID

 

列出本地系統(tǒng)上有許可信息的所有產(chǎn)品 DB2LICM -L

增加一產(chǎn)品許可DB2LICM -A FILENAME

刪除一個(gè)產(chǎn)品的許可 DB2LICM -R PRODUCT PASSWORD

更新已購(gòu)買的許可數(shù)量DB2LICM -U

強(qiáng)制只使用已經(jīng)購(gòu)買的數(shù)量DB2LICM -E HARD

更新系統(tǒng)上所使用的許可政策類型 DB2LICM -P REGISTERED CONCURRENT

更新系統(tǒng)上的處理器的數(shù)量 DB2LICM -N

查詢?cè)S可文件記錄的版本信息 DB2LICM -V

查詢DB2LICM的幫助信息 DB2LICM -H

二、存儲(chǔ)過程

如何聲明一個(gè)存儲(chǔ)過程

CREATE PROCEDURE 存儲(chǔ)過程名(IN 輸入變量名 輸入變量類型,OUT 輸出變量名 輸出變量類型)

緊跟其后的是存儲(chǔ)過程屬性列表

            常用的有:LANGUAGE SQL、MODIFIES SQL DATA、RESULT SETS 1(返回結(jié)果集個(gè)數(shù))

l         存儲(chǔ)過程體以begin開始

l         存儲(chǔ)過程體以end結(jié)束

存儲(chǔ)過程約束規(guī)則

 

存儲(chǔ)過程中調(diào)用存儲(chǔ)過程

CALL 存儲(chǔ)過程名(參數(shù)1,參數(shù)2,參數(shù)n)

例:

call spco_init_custom(bankcode,errno,errmsg);

GET DIAGNOSTICS retval=RETURN_STATUS;

if(retval<>0) then

    set errno=errno;

    set errmsg=errmsg;

    return errno;

end if; 

            

變量的定義

  變量使用前必須先定義,方法為

 DECLARE 變量名 變量類型 (default 默認(rèn)值)

  例:

DECLARE SQLCODE INTEGER DEFAULT 0;

 DECLARE inum INTEGER DEFAULT 0;

 DECLARE curtime char(8);

 DECLARE bcode char(6);

 DECLARE sqlstate char(5);

 

if 表達(dá)式

if 條件1 then

  邏輯體;

elseif 條件2 then

  邏輯體;

else

  邏輯體;

end if;

 

例:

IF rating = 1 THEN

UPDATE employee

SET salary = salary * 1.10, bonus = 1000

WHERE empno = employee_number;

ELSEIF rating = 2 THEN

 UPDATE employee

SET salary = salary * 1.05, bonus = 500

WHERE empno = employee_number;

ELSE

UPDATE employee

SET salary = salary * 1.03, bonus = 0

WHERE empno = employee_number;

END IF;

 

 

case表達(dá)式

case 變量名 when

       變量值1 then

       . . .

when

       變量值2 then

- - -

else

. . .

end case;

case when

       變量名=變量值1 then

       . . .

when

       變量名=變量值2 then

- - -

else

. . .

end case;

 

 

例一:

CASE v_workdept

WHEN 'A00'

THEN UPDATE department

SET deptname = 'DATA ACCESS 1';

WHEN 'B01'

THEN UPDATE department

SET deptname = 'DATA ACCESS 2';

ELSE UPDATE department

SET deptname = 'DATA ACCESS 3';

END CASE;

例二:

CASE

WHEN v_workdept = 'A00'

THEN UPDATE department

SET deptname = 'DATA ACCESS 1';

WHEN v_workdept = 'B01'

THEN UPDATE department

SET deptname = 'DATA ACCESS 2';

ELSE UPDATE department

SET deptname = 'DATA ACCESS 3';

END CASE;

 

for 表達(dá)式

for 循環(huán)名 as

   游標(biāo)名或select 表達(dá)式

do

    sql表達(dá)式;

end for;

 

例:

1)

DECLARE fullname CHAR(40);

FOR vl AS

SELECT firstnme, midinit, lastname FROM employee

DO

SET fullname = lastname || ',' || firstnme ||' ' || midinit;

INSERT INTO tnames VALUE (fullname);

END FOR

 

2)

for loopcs1 as  cousor1  cursor  as 

select  market_code  as market_code 

           from tb_market_code 

           for update 

        do

 

 end for;

goto表達(dá)式

goto 標(biāo)示名;

標(biāo)示名:

   邏輯體;

 例:

    GOTO FAIL;

...

SUCCESS: RETURN 0

FAIL: RETURN -200

 

while表達(dá)式

 while 條件表達(dá)式 do

       邏輯體;

 end while;

 

LOOP表達(dá)式

LOOP... END LOOP;

例:

OPEN c1;

ins_loop:

LOOP

FETCH c1 INTO v_dept, v_deptname, v_admdept;

IF at_end = 1 THEN

LEAVEins_loop; --中斷循環(huán)

ELSEIF v_dept = 'D11' THEN

ITERATEins_loop; --下一個(gè)循環(huán)

END IF;

INSERT INTO department (deptno, deptname, admrdept)

VALUES ('NEW', v_deptname, v_admdept);

END LOOP;

CLOSE c1;

 

關(guān)于游標(biāo)

定義游標(biāo):

DECLARE 游標(biāo)名 CURSOR FOR

   Select 語句;

打開游標(biāo):

     OPEN 游標(biāo)名;

取值:

     FETCH 游標(biāo)名 INTO 變量列表

例:

DECLARE c1 CURSOR FOR

SELECT CAST(salary AS DOUBLE)

FROM staff

WHERE DEPT = deptNumber

ORDER BY salary;

DECLARE EXIT HANDLER FOR NOT FOUND

SET medianSalary = 6666;

SET medianSalary = 0;

 

SELECT COUNT(*) INTO v_numRecords

FROM staff

WHERE DEPT = deptNumber;

OPEN c1;

WHILE v_counter < (v_numRecords / 2 + 1) DO

FETCH c1 INTO medianSalary;

SET v_counter = v_counter + 1;

END WHILE;

CLOSE c1;

 

注:游標(biāo)的申明如果放在中間段,要用”begin。。。end;”.段分割標(biāo)志分割開;

動(dòng)態(tài)sql

1) declare stmt varchar(1024);

set stmt='create table zhouhaiming( f1 smallint, f2 varchar(9), f3 char(5) )';

prepare s1 from stmt;

execute s1;

set stmt='insert into zhouhaiming values (1,'www','aaa')';

prepare s1 from stmt;

execute s1;

 

2) DECLARE CURSOR C1 FOR STMT1;  

     PREPARE STMT1 FROM 

        'ALLOCATE C2 CURSOR FOR RESULT SET ?';

 

臨時(shí)表的建立

  DECLARE GLOBAL TEMPORARY TABLE TABLE_NAME

  AS (FULLSELECT) DEFINITION ONLY

  EXCLUDING IDENTITY COLUMN ATTRIBUTES

  ON COMMIT DELETE ROWS

  NOT LOGGED IN 臨時(shí)表空間名with  replace;

  第一行規(guī)定臨時(shí)表的名稱.

  第二行規(guī)定臨時(shí)表的列的定義.

  第三行規(guī)定不是從源結(jié)果表定義中復(fù)制的恒等列.

  第四行規(guī)定如果沒有打開WITH GOLD光標(biāo),將會(huì)刪除表的所有行.

  第五行規(guī)定不對(duì)表的改變進(jìn)行記錄.

   With replace選項(xiàng)會(huì)隱式的自動(dòng)刪除該臨時(shí)表。

  例如: 

  DECLARE GLOBAL TEMPORARY TABLE DEC_BSEMPMS

  AS (SELECT * FROM BSEMPMS) DEFINITION ONLY

  EXCLUDING IDENTITY COLUMN ATTRIBUTES

  ON COMMIT DELETE ROWS

  NOT LOGGED;

 

DB2中的幾個(gè)全局變量

n        ROW_COUNT—影響行數(shù)

UPDATE CORPDATA.PROJECT

SET PRSTAFF = PRSTAFF + 1.5

WHERE DEPTNO = deptnbr;

GET DIAGNOSTICSrcount = ROW_COUNT;

 

n        RETURN_STATUS--返回狀態(tài)

CALL TRYIT;--調(diào)用存儲(chǔ)過程

GET DIAGNOSTICSRETVAL = RETURN_STATUS;

IF RETVAL <> 0 THEN

...

LEAVE A1;

ELSE

...

END IF;

 

n        SQLSTATE—SQL返回錯(cuò)誤代碼

 注:使用前必先定義

 declare sqlstate char(5);

 declare state char(5);

 

 insert into tbname values(…)

 set state=sqlstate;

if(state<> '00000') then

return -1;

end if;      

 

關(guān)于ATOMIC和NOT ATOMIC

P1:BEGIN ATOMIC –P1段的事務(wù)會(huì)自動(dòng)回滾

P1:BEGIN NOT ATOMIC –P1段的事務(wù)不會(huì)自動(dòng)回滾

 

DB2中的條件句柄

句柄類型:

n        CONTINUE

n        EXIT

n        UNDO

 

條件類型:

n        SQLSTATE string

n        SQLEXCEPTION

n        SQLWARNING

n        NOT FOUND

例:

1)DECLARE EXIT HANDLER FOR NOT FOUND

SET medianSalary = 6666;

2) DECLARE not_found CONDITION FOR SQLSTATE '02000';

DECLARE EXIT HANDLER FOR not_found

SET rating = -1;

3)   DECLARE not_found CONDITION FOR SQLSTATE '02000';

DECLARE c1 CURSOR FOR

SELECT deptno, deptname, admrdept

FROM department

ORDER BY deptno;

DECLARE CONTINUE HANDLER FOR not_found

SET at_end = 1;

 

如何抽取/提交存儲(chǔ)過程

db2 "get routine into 文件名 from procedure 存儲(chǔ)過程名" 

抽取存儲(chǔ)過程;

提交存儲(chǔ)過程

db2 "put routine from 文件名" 

安裝已編譯好的存儲(chǔ)過程。

如何在命令符下提交存儲(chǔ)過程

在存儲(chǔ)過程的最后加上@符號(hào),然后在命令符下打入:db2 -td@ -vf procfile.sql 就可以生成過程。

非存儲(chǔ)過程的SQL文件,在命令符下打入:db2 –tvf sqlfile.sql

從存儲(chǔ)過程返回結(jié)果集(游標(biāo))的用法

1、建一sp返回結(jié)果集 

CREATE PROCEDURE DB2INST1.Proc1 (  

    LANGUAGE SQL 

    result sets 2 --(返回兩個(gè)結(jié)果集) 

P1: BEGIN 

        declare c1 cursor  with return to caller for  

            select  market_code 

            from    tb_market_code; 

        --指定該結(jié)果集用于返回給調(diào)用者 

        declare c2 cursor  with return to caller for  

            select  market_code 

            from    tb_market_code; 

         open c1; 

         open c2; 

END P1                                        


2、建一SP調(diào)該sp且使用它的結(jié)果集 


CREATE PROCEDURE DB2INST1.Proc2 ( 

out out_market_code char(1)) 

    LANGUAGE SQL 

P1: BEGIN 

 declare loc1,loc2 result_set_locator varying;  

--建立一個(gè)結(jié)果集數(shù)組 

call proc1; 

--調(diào)用該SP返回結(jié)果集。 

associate result set locator(loc1,loc2) with procedure proc1; 

--將返回結(jié)果集和結(jié)果集數(shù)組關(guān)聯(lián) 

 allocate cursor1 cursor for result set loc1; 

 allocate cursor2 cursor for result set loc2; 

--將結(jié)果集數(shù)組分配給cursor 

fetch  cursor1 into out_market_code; 

--直接從結(jié)果集中賦值 

close cursor1;         

END P1


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI