db2基础

DB2知识文档

一、db2 基础

中心语法

诠释:“–”(两单减号)

字符串连接:“||”

如set msg=’aaaa’||’bbbb’,则msg为’aaaabbbb’

字符串的援:‘’(一定用单引号),如果急需输入单引号,输入两只单引号即可。

语词结束:“;”

语法来源:PASCLE

 

转义字符

假若你想询问字符串中涵盖‘%’或‘_’ ,就得使转义字符(Escape
Characters)。比如,要惦记查询book_title中含有字符串’99%’的记录:

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

后面的escape ‘!’是必定一个转义字符‘!’,
指明从转义字符’!’后之%不再是统配符。

 

DB2限令参数选项

Db2 list command options 可以查阅

-a 显示 SQLCA OFF 
-c 自动落实 ON 
-e 显示 SQLCODE/SQLSTATE OFF 
-f 读博输入文件 OFF 
-l 将下令记录到历史文件被 OFF 
-n 除去换行字符 OFF 
-o 显示输出 ON 
-p 显示交互式输入提示 ON 
-r 将出口保存及告知文本 OFF 
-s 在指令出错时止执行 OFF 
-t 设置语句终止字符 OFF 
-v 回送当前令 OFF 
-w 显示 FETCH/SELECT 警告信息 ON 
-x 不起印列标题 OFF 
-z 将具有出口保存到输出文件 OFF 

这些选择之切实可行成效及其缺省设置为:
.a 显示 SQLCA 的数据,缺省为 OFF。
.c 是否自动落实 SQL 命令,缺省为 ON。
.e {c|s} 显示 SQLCODE 或 SQLSTATE,缺省为 OFF。
.f 文件将命令的输入从业内输入指定到某个同文书,缺省为 OFF。
横流:命令“db2 < 文件称”与“db2 -f 文件称”作用一样。
.l 文件将命令记录及历史文件中,缺省为 OFF。
.n 除去换行字符,缺省为 OFF。
.o 将出口数据及信息送及专业输出,缺省为 ON。
.p 在交互方式下显得命令执行处理器的提示信息,缺省为 ON。
.r 将出口保存到指定文件被,缺省为 OFF。
.s 执行批处理文件被还是交互方式下之一声令下出错时就是住实施操作,缺省为 OFF。
.t 设置语句终止字符,缺省为 OFF。
.v 回送时令到专业输出,缺省为 OFF。
.w 显示 FETCH 或 SELECT 警告信息,缺省为 ON。
.x 不从印列标题,缺省为 OFF。
.z 文件将所有出口保存及输出文件,缺省为 OFF。

SQLSTATE含义

每当db2命令行方式下输入:? 20012(SQLSTATE值)

得取得sql错误意思

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导出的文本,并且为此TAB分隔符的文档,那么可以使用

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

中间COLDEL是要字,0x09凡16进制,表示tab符号

Load用法

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

说明: 
以无系的数码表export数据常常,可以运用并发的样式,以提高效率;
TABLENAME指待清理table的称号;
modified by delprioritychar防止数据库记录中在换行符,导致数据无法装入的情况;
replace
into对临时数据库被的始末展开调换,即将现行的数额记录清理,替换为数据文件内容;
nonrecoverable无日志方式装入;

 

查询有用户表

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

 

怎了解当前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

测试SQL的行性

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

 

select.sql是select语句写以文件被

安赢得连接的经过

List applications

去时正值采取的application:

db2 “force application (Id1,Id2,Id3)”
Id1,Id2,Id3 是List显示的应用号;

剔除所有的进程 db2 force application
all

翻时应用号的履状态: db2 get snapshot for application
agentid 299 |grep Row

 

什么修改缓冲池

db2 alter bufferpool ibmdefaultbp size
10240

 

如何知道表的字段的观?

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

 

 如何了解DB2的数据类型?

    select name,* from  sysibm.sysdatatypes

 

哪理解BUFFERPOOLS状况?

    select * from  sysibm.sysbufferpools

 

争查看表的结构?

  describe table table_name

    or

 describe select * from schema.table_name

安快速清除一个大表?

   alter table table_name activate not
logged initally with empty table

   or

   import from null_file of del replace
into table_name

哪些查看数据库的保?

    select * from  syscat.packages

什么样查看数据库的囤积过程?

select procname,text,* from syscat.procedures

Or

select procname,text from
sysibm.sysprocedures

怎么查看数据库SAMPLE的安排文件之內容?

get database configuration for
sample

or

get db cfg for sample

怎么样將数据库SAMPLE的参数设置为默认数值?

reset database configuration for
sample

or

reset db cfg for sample

什么修改数据库SAMPLE配置参数数值?

update database configuration for
sample

    using <parameter name> <new
value>

or

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

如何重新啟動数据库?

    Restart db db_name

何以激活数据库?

    Activate db db_name

何以已数据库?

    Deactivate db db_name

哪重命名表?

    Rename old_tablename to new_tablename

哪设置DB2环境变量

Db2set命令,语法如下:

Db2set variant=value

安除去quiesce状态

  1. 接连到数据库

  2. 故此 list tablespaces
    判断哪个tablespace处于quiesce状态和与落对象(object)ID

  3. 判断目标ID对应之表明

a)用 db2 “select tabname from
syscat.tables where tablid=对象ID” 得到表名

b)用 db2 list history
判断是杀表

  1. 用 db2 quiesce tablespaces for table
    表名 reset 去除quiesce状态

如何尽已经删除表的过来(Dropped Table
Recovery)

1.
先是数据库要可以前滚恢复(数据库配置参数logretain或userexit打开)。

  1. 针对要履行Drop Table
    Recovery的表空间(限regular tablespace),执行:

alter tablespace 表空间名 dropped table
recovery on

  1. 从而 list history dropped table all for
    数据库名 得到删除表的tableid(例如
    0000000000006d0000020003)和发明结构的生成语句(DDL),记录tableid和该语句以便恢复。之后,用drop命令去的表中的数足以当前滚恢复时导出。

4.
回升数据库后,如果想过来就抹的申,在前滚时加recover dropped table
tableid to 目标目录 。 在该目录下被去除的表中的数导出,例如导出至
../NODE0000/data文件。利用方面提到表结构生成语句生成于删除了之说明,然后用import命令将数据导入表中。

如何备份数据库

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"

 

 

何以转移有目标的DDL

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

哪回复数据库

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;

 

光复得后,执行db2s命令,如果差,再实施如下命令:

db2 rollforward db db to end of logs and
complete

什么样查看数据库目录

1)首先用 db2 list database directory 命令查看系統資料庫目錄(System
Database Directory)中发出沒有該資料庫。
假设发生,應該再確定該資料庫是沒有用底資料庫之後用 db2 drop
database 資料庫名將其刪除。

2)如果沒有,再就此 db2 list database directory on
location 看于本端資料庫目錄(Local Database
Directory)中产生沒有該資料庫,location指定資料庫的职位(如Windows下的C:
,Unix下的/home/db2inst1)。

怎么转移本地系统名称

1.db2set db2system=新体系名

  1. db2 terminate 
  2. db2 uncatalog node 原节点名
  3. 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如何避免日志满出错

当运IMPORT命令向数据库出入数据常常,如何避免日志空间满错误? 

在推行IMPORT命令时, 如果使用循环日志, 有时见面冒出日志满错误, 
这会儿可用COMMITCOUNT参数来解决. 
因日志空间满勤是因所有的日志均高居活动状态导致的. 
倘若COMMIT执行后, 会释放所占据的资源, 其中包括日志 . 
这样, 被当下作业使用的日志在COMMIT命令执行后, 即变成不活动状态了.

安处理日值

-日志处理

DB2日约是为文件之花样存放于文件系统中,分为两种植模式:循环日志与归档日志。当创建新数据库时,日志的缺省模式是循环日志。在这种模式下,只能兑现数据库的脱机备份和死灰复燃。如果如落实联机备份和恢复,必须使为归档日志模式。

眼下以综合业务体系面临,设置的全都是归档日志模式;其它系统(如后督察、经营决策、中间业务等)一般都装也循环日志模式。至于下何种模式,可以通过修改数据库配置参数(LOGRETAIN)来兑现:
归档日志模式:db2 update db cfg for using logretain on
注:改也on后,查看数据库配置参数logretain的价值经常,实际显示的是recovery。改变这个参数后,再次连数据库会显得数据库处于备份暂挂(BACKUP
PENDING)状态。这时,需要举行相同次等针对数据库的脱机备份(db2 backup db
),才会要数据库状态成为正常。

循环日志模式:db2 update db cfg for
using logretain off

-处理步骤

必须以以下是的步调进行操作:

务求得以DB2发令PRUNE进行清理,不建议采取rm命令去。

删除前许管应用已停(即联名已下)。

翻开时以的日志文件目录及第一运动日志文件

用 “db2 get db cfg for
”命令查看日志文件目录(Path to log
files)参数,确定数据库当前使用的日记文件目录。 例如:Path to log files
= /db2log/,说明DB2日称存放目录是/db2log

用 “db2 get db cfg for
”命令查看第一活动日志文件(First active log
file)参数,该参数对应的日志文件前的日志文件均为归档日志文件,如果承认没有因此,可以去。例如:First
active log file =
S0015913.LOG,说明时先是移动日志文件是S0015913.LOG。 

备份好要去的存档日志

剔除归档日志
以运用户(如BTP)登录,执行:

$ db2 connect to 

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

注:S???????.LOG为翻动相底首先平移日志文件。此命令可以以眼前率先运动日志文件前的存档日志文件全部去除。

哪理清db2diag.log文件

db2diag.log,是故来记录DB2数据库运行着的信之公文。可以经过者文件,查看记录的关于DB2数据库详细的错误信息。此文件为是络绎不绝叠加的,需要定期开展清理。

可透过翻实例的安排参数DIAGPATH,来确定db2diag.log文件是在谁目录下:db2
get dbm cfg 如果Diagnostic data directory path(DIAGPATH) =
/home/db2inst1/sqllib/db2dump,则是文件是放在/home/db2inst1/sqllib/db2dump目录下。当文件系统/home的使用率达到80%-90%横不时,应即时去除db2diag.log文件。

要按以下是步骤操作:确认应用(如BTP)、DB2已经休。

用原db2diag.log文件备份到其他文件系统下。

去db2diag.log文件。删除后,DB2会自动创建一个新的文件。

 

标准函数

length: 返回从变量中的字节数

CAST: 变量类型转换或截断字符串

如:CAST(RESUME AS VARCHAR(370))

Select CAST(colname as integer) from
tablename;

decimal: 变量转换为指定精度之数值

如: 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
测试空值

 

获得系统日期或系统时

 

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; –获取系统年份

select month(current date) into curdate
from (values 2) as tmp; –获取系统月份

select day(current date) into curdate
from (values 2) as tmp; –获取系统日份

(CURRENT TIMESTAMP 精度达微秒)

 

安防范空值

DB2的COALESCE函数返回()中表达式列表中首先单不呢空的表达式,可以带来多独表达式, 和oracle的isnull类似。语法格式如下:

CLEASCE(colname,default_value)

 

多表的干更新方法

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)的记录数

GET DIAGNOSTICS
rcount=ROW_COUNT;

 

注:

get diagnostics rcount =ROW_COUNT;      
只对update,insert,delete起作用. 
**
不对select into 有效**

**

什么样执行RUNSTATS等优化命令

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

db2 reorgchk update statistics on table
all

查阅什么时候进行了runstats

db2 “select name, stats_time from
sysibm.systables”

 

完全执行如下:

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

怎么样获得结果集的前头N行数据

Select * from tablename fetch first N
rows only

 

安装DB2默认值?

 

以WINDOWS或OS/2中默认实例的凡DB2

在LINUX或UNIX环境下默认实例的凡DB2INST1

 

当WINDOWS或OS/2中默认帐户的凡DB2ADMIN

以LINUX或UNIX环境下默认帐户的是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;

哪些关闭表的日记

  ALTER TABLE TABLE_NAME ACTIVE NOT
LOGGED INIALLY

什么样收获SQL执行计划

SQL 解释工具

SQL 解释工具提供查询优化器为 SQL 语句所挑选的拜访计划之有关详细信息。该消息囤积在 EXPLAIN 表中,可以当稍后使用如 Visual
Explain、db2expln、dynexpln 和db2exfmt 的工具进行格式化,从而因为自己之可视方式开展表示。

EXPLAIN 表可以以你第一次于采用 Visual
Explain 时自动进行创办。即使没有开创它们,您也足以手工进行创办,如下:

% cd <db2 install
path>\sqllib\misc 
% db2 connect to bank 
% db2 -tvf EXPLAIN.DDL

本文中,我们用 db2exfmt 工具。例如,使用 db2exfmt 解释动态 SQL 语句,在 DB2指令窗口中仍下列步骤进行:

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

争创造事例?

DB2ICRT <client> INSTNAME
<…PARAMETERS>

要是是客户端,加上client关键字

例如:

1) 用root登录,命令为smitty创建用户db2inst1,用于数据库管理。

2) 用root登录,使用db2icrt创建实例DB2 实例,使用以下命令。

cd /usr/opt/db2*/instance/

./db2icrt -s client db2inst1

3) 用db2inst1用户登录,创建数据库的地头节点目录,建立远程数据库映射别名,使用以下命令。

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写法技巧

大多独字段时怎样不经过动用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)

利用一些命

排有装有实例 DB2ILIST

取当前实例 GET INSTANCE

创新事例的安排 DB2IUPDT

 

删去事例 DB2IDROP INSTANCE_NAME

具体步骤如下:

 

停下事例及独具应用程序

每当所有打开的授命行上执行DB2
TERMINATE

运行DB2STOP

备份DB2INSTPROF注册变量指出的例子目录

离事例所有登陆者

 

使用DB2IDROP

为得去ID

 

排有本土系统上起认可信息之拥有成品 DB2LICM
-L

搭一成品许可DB2LICM -A FILENAME

除去一个活之许可 DB2LICM -R PRODUCT
PASSWORD

履新就购置的许可数量DB2LICM -U

强制只以都购置的多寡DB2LICM -E
HARD

履新系统及所采用的批准政策类型 DB2LICM
-P REGISTERED CONCURRENT

创新系统及之微处理器的数目 DB2LICM
-N

查询许可文件记录之版本信息 DB2LICM
-V

查询DB2LICM的提携信息 DB2LICM -H

老二、存储过程

何以声明一个仓储过程

CREATE
PROCEDURE 仓储过程叫(IN 输入变量名 输入变量类型,OUT 输出变量名 出口变量类型)

紧跟其后的凡储存过程性列表

            常用的出:LANGUAGE
SQL、MODIFIES SQL DATA、RESULT SETS 1(返回结果集个数)

l         存储过程体以begin开始

l         存储过程体以end结束

存储过程约规则

 

储存过程被调用存储过程

CALL 存储过程叫(参数1,参数2,参数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 默认值)**

  例:

DECLARE SQLCODE INTEGER DEFAULT
0;

 DECLARE inum INTEGER DEFAULT 0;

 DECLARE curtime char(8);

 DECLARE bcode char(6);

 DECLARE sqlstate char(5);

 

if 表达式

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表达式

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 表达式

for 循环名 as

   游标名或select 表达式

do

    sql表达式;

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表达式

goto 标示名;

标示名:

   逻辑体;

 例:

    GOTO FAIL;

SUCCESS: RETURN 0

FAIL: RETURN -200

 

while表达式

 while 条件表达式 do

       逻辑体;

 end while;

 

LOOP表达式

LOOP… END LOOP;

例:

OPEN c1;

ins_loop:

LOOP

FETCH c1 INTO v_dept, v_deptname, v_admdept;

IF at_end = 1 THEN

LEAVEins_loop; –中断循环

ELSEIF v_dept = ‘D11’ THEN

ITERATEins_loop; –下一个循环往复

END IF;

INSERT INTO department (deptno, deptname, admrdept)

VALUES (‘NEW’, v_deptname, v_admdept);

END LOOP;

CLOSE c1;

 

有关游标

概念游标:

DECLARE 游标名 CURSOR FOR

   Select 语句;

打开游标:

     OPEN 游标名;

取值:

     FETCH 游标名 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;

 

流动:游标的申如果在中间段,要为此”begin。。。end;”.段分割标志分割开;

动态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 ?’;

 

临时表的建

  DECLARE GLOBAL TEMPORARY TABLE TABLE_NAME
  AS (FULLSELECT) DEFINITION ONLY
  EXCLUDING IDENTITY COLUMN ATTRIBUTES
  ON COMMIT DELETE ROWS
  NOT LOGGED IN 临时表空间名with  replace;
  第一行規定臨時表的名稱.
  第二实行規定臨時表的排的定義.
  第三履行規定不是從源結果表定義中復制的恒等列.
  第四实施規定如果沒有打開WITH GOLD光標,將會刪除表的持有行.
  第五履規定不對表的改變進行記錄.

   With
replace选项会隐式的全自动删除该临时表。

  例如: 
  DECLARE GLOBAL TEMPORARY TABLE DEC_BSEMPMS
  AS (SELECT * FROM BSEMPMS) DEFINITION ONLY
  EXCLUDING IDENTITY COLUMN ATTRIBUTES
  ON COMMIT DELETE ROWS
  NOT LOGGED;

 

DB2中之几个全局变量

n        ROW_COUNT—影响行数

UPDATE CORPDATA.PROJECT

SET PRSTAFF = PRSTAFF + 1.5

WHERE DEPTNO = deptnbr;

GET DIAGNOSTICSrcount = ROW_COUNT;

 

n        RETURN_STATUS–返回状态

CALL TRYIT;–调用存储过程

GET DIAGNOSTICSRETVAL = RETURN_STATUS;

IF RETVAL <> 0 THEN

LEAVE A1;

ELSE

END IF;

 

n        SQLSTATE—SQL返回错误代码

 注:使用前早晚先行定义

 declare sqlstate char(5);

 declare state char(5);

 

 insert into tbname values(…)

 set state=sqlstate;

if(state<> ‘00000’) then

return -1;

end if;      

 

关于ATOMIC和NOT ATOMIC

P1:BEGIN ATOMIC –P1截的事务会自动回滚

P1:BEGIN NOT ATOMIC –P1段落的工作不会见活动回滚

 

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;

 

什么样抽取/提交存储过程

db2 “get routine into 文件名 from procedure 存储过程叫” 
抽取存储过程;

交给存储过程

db2 “put routine from 文件名” 
安装已编译好之贮存过程。

何以在命令符下提交存储过程

在储存过程的最后加上@符号,然后在指令符下打入:db2
-td@ -vf procfile.sql 就得转过程。

非存储过程的SQL文件,在命令符下打入:db2
–tvf sqlfile.sql

起存储过程返回结果集(游标)的用法

1、建平sp返回结果集 
CREATE PROCEDURE DB2INST1.Proc1 (  
    LANGUAGE SQL 
    result sets 2 –(返回两只结实集) 
P1: BEGIN 
        declare c1 cursor  with return to caller for  
            select  market_code 
            from    tb_market_code; 
        –指定该结果集用于返回给调用者 
        declare c2 cursor  with return to caller for  
            select  market_code 
            from    tb_market_code; 
         open c1; 
         open c2; 
END P1                                        

2、建平SP调该sp且使用其的结果集 

CREATE PROCEDURE DB2INST1.Proc2 ( 
out out_market_code char(1)) 
    LANGUAGE SQL 
P1: BEGIN 
 declare loc1,loc2 result_set_locator varying;  
–建立一个结出集数组 
call proc1; 
–调用该SP返回结果集。 
associate result set locator(loc1,loc2) with procedure proc1; 
–将赶回结果集及结果集数组关联 
 allocate cursor1 cursor for result set loc1; 
 allocate cursor2 cursor for result set loc2; 
–将结果集数组分配给cursor 
fetch  cursor1 into out_market_code; 
–直接由结果集中赋值 
close cursor1;         

END P1

相关文章