db2sql语句
- 格式:doc
- 大小:82.00 KB
- 文档页数:6
DB2常⽤sql语句转DB2 提供了关连式资料库的查询语⾔sql(structured query language),是⼀种⾮常⼝语化、既易学⼜易懂的语法。
此⼀语⾔⼏乎是每个资料库系统都必须提供的,⽤以表⽰关连式的操作,包含了资料的定义(ddl)以及资料的处理(dml)。
sql原来拼成sequel,这语⾔的原型以"系统 r"的名字在 ibm 圣荷西实验室完成,经过ibm内部及其他的许多使⽤性及效率测试,其结果相当令⼈满意,并决定在系统r 的技术基础发展出来 ibm 的产品。
⽽且美国国家标准学会(ansi)及国际标准化组织(iso)在1987遵循⼀个⼏乎是以 ibm sql 为基础的标准关连式资料语⾔定义。
⼀、资料定义 DDL(data definition language)资料定语⾔是指对资料的格式和形态下定义的语⾔,他是每个资料库要建⽴时候时⾸先要⾯对的,举凡资料分哪些表格关系、表格内的有什麽栏位主键、表格和表格之间互相参考的关系等等,都是在开始的时候所必须规划好的。
1、建表格:create table table_name(column1 datatype [not null] [not null primary key],column2 datatype [not null],...)说明:datatype --是资料的格式,详见表。
nut null --可不可以允许资料有空的(尚未有资料填⼊)。
primary key --是本表的主键。
2、更改表格 alter table table_nameadd column column_name datatype说明:增加⼀个栏位(没有删除某个栏位的语法。
alter table table_nameadd primary key (column_name)说明:更改表得的定义把某个栏位设为主键。
alter table table_namedrop primary key (column_name)说明:把主键的定义删除。
捕获sql语句在应用使用过程中,我们经常会碰到应用响应时间很慢,甚至没有响应,但是应用服务器可能并不是很繁忙,cpu利用率也非常低,引起这种状况的原因有很多种,比如环境问题,应用资源泄漏,数据库原因等等,本文主要是从一次应用性能诊断过程来谈谈如何通过数据库诊断应用性能问题。
1、打开db2监控开关#db2 connect to mes_wr#db2 update monitor switches using statement on#db2 reset monitor all2、十分钟之后,我们收集sql统计快照#db2 get snapshot for dynamic sql on mes_wr > dysqlstatus.out现在统计信息已经存放在dysqlstatus.out中,可以使用任意方便的文本处理工具查看,一般用aix上的vi来处理或者拷贝到win机器进行处理。
打开dysqlstatus.out 内容如下:Number of executions = 1Number of compilations = 1Worst preparation time (ms) = 2Best preparation time (ms) = 2Internal rows deleted = 0Internal rows inserted = 0Rows read = 2Internal rows updated = 0Rows written = 0Statement sorts = 0Statement sort overflows = 0Total sort time = 0Buffer pool data logical reads = Not CollectedBuffer pool data physical reads = Not CollectedBuffer pool temporary data logical reads = Not CollectedBuffer pool temporary data physical reads = Not CollectedBuffer pool index logical reads = Not CollectedBuffer pool index physical reads = Not CollectedBuffer pool temporary index logical reads = Not CollectedBuffer pool temporary index physical reads = Not CollectedTotal execution time (sec.ms) = 0.000377Total system cpu time (sec.ms) = 0.000000Statement text = select ACTIVITYDEFID,ACTIVITYINSTID from wfworkitem wherePROCESSINSTID=104199 and CURRENTSTATE = 4......在aix进行vi中的处理::g!/Total execution time/d只保留文本中的sql执行时间,我们要按照执行时间来排序通过vim的visual功能选择执行时间块(等号后面的数字),然后排序Total execution time (sec.ms) = 0.050590Total execution time (sec.ms) = 0.000170Total execution time (sec.ms) = 0.000247Total execution time (sec.ms) = 0.000292Total execution time (sec.ms) = 0.000474Total execution time (sec.ms) = 0.000330Total execution time (sec.ms) = 0.000348Total execution time (sec.ms) = 0.000279Total execution time (sec.ms) = 0.000385Total execution time (sec.ms) = 0.000296Total execution time (sec.ms) = 0.000261Total execution time (sec.ms) = 0.000195Total execution time (sec.ms) = 0.000226Total execution time (sec.ms) = 0.000227Total execution time (sec.ms) = 0.000193......:'<,'>!sort排序后的结果(部分)Total execution time (sec.ms) = 2.027776Total execution time (sec.ms) = 2.203624Total execution time (sec.ms) = 2.504677Total execution time (sec.ms) = 2.951256Total execution time (sec.ms) = 3.119875Total execution time (sec.ms) = 3.303277Total execution time (sec.ms) = 3.303517Total execution time (sec.ms) = 4.017133Total execution time (sec.ms) = 4.043329Total execution time (sec.ms) = 4.252125Total execution time (sec.ms) = 4.606765Total execution time (sec.ms) = 5.208087Total execution time (sec.ms) = 5.778598Total execution time (sec.ms) = 8.117470Total execution time (sec.ms) = 9797.905136可以看到最长时间的sql total执行时间耗费了3797.905123s.现在我们到dysqlstatus.out中去找这条语句Number of executions = 4602Number of compilations = 4294967295Worst preparation time (ms) = 2Best preparation time (ms) = 2Internal rows deleted = 0Internal rows inserted = 0Rows read = 2963688Internal rows updated = 0Rows written = 0Statement sorts = 0Statement sort overflows = 0Total sort time = 0Buffer pool data logical reads = Not CollectedBuffer pool data physical reads = Not CollectedBuffer pool temporary data logical reads = Not CollectedBuffer pool temporary data physical reads = Not CollectedBuffer pool index logical reads = Not CollectedBuffer pool index physical reads = Not CollectedBuffer pool temporary index logical reads = Not CollectedBuffer pool temporary index physical reads = Not CollectedTotal execution time (sec.ms) = 9797.905136Total user cpu time (sec.ms) = 9.290000Total system cpu time (sec.ms) = 1.230000Statement text = select * from XXXX_T_CNFACTIVITYDEF这条语句总共执行了4602次,平均每次的执行时间2S,而且这些数据应该是被cache 起来的;)总结:上面的方法简单总结了从数据库层面对应用的性能问题诊断,希望对大家有所帮助,对于数据库快照诊断问题的思路对于任意数据库通用补充一个unix上脚本处理方式:sqlsort.shawk 'BEGIN{RS="";FS="\n";ORS="\n"};/Statement text/{print $1, $21, $24}' $1 | awk '$5 > 0 {print "AvgTime:", $11/$5, "\t", $0}'| sort -n | head -n $2|awk '{print $0, "\n"}'使用:#sqlsort.sh dysqlstate.out 10(显示Top ten)用db2advis Sql语句调整建议用户名:db2inst1 //使用DB2用户或使用root用户登陆后切换用户到db2inst1用户密码: // # su - db2inst1建立一个mkdir sqltune目录1、$mkdir sqltune2、$ cd sqltune //进入sqltune文件夹3、$ pwd //显示当前目录/wrdb/db2inst1/sqltune4、编辑要分析sql语句(名字随意)//创建sql1.in文件保存需要分析的sql语句例如:$ vi sql1.in 把分析语句拷贝到sql1.in 注意sql1.in内容最后需要分号结尾。
db2 sql修改字段描述
在DB2中,要修改字段的描述,你可以使用ALTER TABLE语句来实现。
下面我会详细介绍这个过程。
首先,假设我们有一个名为“my_table”的表,其中有一个名为“my_column”的字段,现在我们想要修改它的描述。
首先,你需要使用以下SQL语句来查看字段的当前描述:
SELECT REMARKS.
FROM SYSIBM.SYSCOLUMNS.
WHERE TBNAME = 'my_table'。
AND NAME = 'my_column';
接下来,如果你想要修改字段的描述,你可以使用以下SQL语句:
ALTER TABLE my_table.
ALTER COLUMN my_column.
SET COMMENT '你的新描述';
在这里,你需要将“my_table”替换为你的表名,“my_column”替换为你想要修改描述的字段名,然后将“你的新描述”替换为你
想要设置的新描述。
执行这个SQL语句后,字段的描述就会被成功修改了。
需要注意的是,你需要有足够的权限来执行ALTER TABLE语句,否则你将无法修改字段描述。
另外,修改字段描述可能会影响到已
有的应用程序或者报表,所以在修改之前一定要慎重考虑。
数据库的SQL语法参考手册一、DB2提供了关连式资料库的查询语言SQL (Structured Query Language),是一种非常口语化、既易学又易懂的语法。
此一语言几乎是每个资料库系统都必须提供的,用以表示关连式的操作,包含了资料的定义(DDL)以及资料的处理(DML)。
SQL原来拼成SEQUEL,这语言的原型以“系统R“的名字在IBM圣荷西实验室完成,经过IBM 内部及其他的许多使用性及效率测试,其结果相当令人满意,并决定在系统R的技术基础发展出来IBM的产品。
而且美国国家标准学会(ANSI)及国际标准化组织(ISO)在1987遵循一个几乎是以IBM SQL为基础的标准关连式资料语言定义。
一、资料定义DDL(Data Definition Language)资料定语言是指对资料的格式和形态下定义的语言,他是每个资料库要建立时候时首先要面对的,举凡资料分哪些表格关系、表格内的有什麽栏位主键、表格和表格之间互相参考的关系等等,都是在开始的时候所必须规划好的。
1、建表格:CREATE TABLE table_name(column1 DATATYPE [NOT NULL] [NOT NULL PRIMARY KEY],column2 DATATYPE [NOT NULL],...)说明:DATATYPE—是资料的格式,详见表。
NUT NULL—可不可以允许资料有空的(尚未有资料填入)。
PRIMARY KEY—是本表的主键。
2、更改表格ALTER TABLE table_nameADD COLUMN column_name DATATYPE说明:增加一个栏位(没有删除某个栏位的语法。
ALTER TABLE table_nameADD PRIMARY KEY (column_name)说明:更改表得的定义把某个栏位设为主键。
ALTER TABLE table_nameDROP PRIMARY KEY (column_name)说明:把主键的定义删除。
用COBOL链接DB2时,出现DB2错误信息时,如果你不懂代码是什么意思,可以用这份资料查找,当然你也可以直接在db2的命令行下输入:db2 ? SQL30081N,系统会给出一些提示信息.sqlcode sqlstate DB2错误信息(按sqlcode排序)000 00000 SQL语句成功完成01xxx SQL语句成功完成,但是有警告+012 01545 未限定的列名被解释为一个有相互关系的引用+098 01568 动态SQL语句用分号结束+100 02000 没有找到满足SQL语句的行+110 01561 用DATA CAPTURE定义的表的更新操作不能发送到原来的子系统+111 01590 为2型索引设置了SUBPAGES语句+117 01525 要插入的值的个数不等于被插入表的列数+162 01514 指定的表空间被置为检查挂起状态+203 01552 使用非唯一的名字来解决命名的限定列+204 01532 命名的对象未在DB2中定义+206 01533 命名的列不在SQL语句中指定的任何表中存在+218 01537 因为SQL语句引用一个远程对象,不能为该SQL语句执行EXPLAIN+219 01532 命名的PLAN TABLE不存在+220 01546 不正确定义PLAN TABLE,检查命名列的定义+236 01005 SQLDA中的SQLN的值至少应于所描述的列的个数一样大+237 01594 至少有一个被描述的列应该是单值类型,因此扩展的SQLVAR 条目需要另外的空间+238 01005 至少应有一个被描述的列是一个LOB,因此扩展的SQLVAR条目需要另外的空间+239 01005 至少应有一个被描述的列应是单值类型,因此扩展的SQLVAR 条目需要另外的空间+304 01515 该值不能被分配给宿主变量,因为该值不再数据类型的范围之内+331 01520 不能被翻译的字符串,因此被设置为NULL+339 01569 由于与DB2 2.2版本的子系统连接,所以可能存在字符转换问题+394 01629 使用优化提示来选择访问路径+395 01628 设置了无效的优化提示,原因代码指定了为什么,忽略优化提示+402 01521 未知的位置+403 01522 本地不存在CREAT ALIAS对象+434 01608 在DB2未来发布的版本中将不支持指定的特性,IBM建议你停止使用这些特性+445 01004 值被CAST函数截取+462 01Hxx 由用户定义的函数或存储过程发出的警告+464 01609 命名的存储过程超出了它可能返回的查询结果集的个数限制+466 01610 指定由命名的存储过程返回的查询结果集的个数。
DB2数据库 SQL常用命令一、连接数据库1. 从命令行连接数据库- 语法: db2 connect to <database_name> user <username> using <password>- 示例: db2 connect to sample user db2inst1 using passw0rd2. 从命令行断开数据库连接- 语法: db2 connect reset- 示例: db2 connect reset3. 显示当前连接的数据库- 语法: db2 list database directory- 示例: db2 list database directory二、管理数据库对象4. 创建数据库- 语法: db2 create database <database_name>- 示例: db2 create database sample5. 删除数据库- 语法: db2 drop database <database_name>- 示例: db2 drop database sample6. 创建表- 语法: db2 create table <table_name> (<column1_name> <data_type>, <column2_name> <data_type>, ...)- 示例: db2 create table employee (id int, name varchar(50), age int)7. 删除表- 语法: db2 drop table <table_name>- 示例: db2 drop table employee8. 插入数据- 语法: db2 insert into <table_name> values (<value1>,<value2>, ...)- 示例: db2 insert into employee values (1, 'John', 25)9. 删除数据- 语法: db2 delete from <table_name> where <condition> - 示例: db2 delete from employee where id = 110. 更新数据- 语法: db2 update <table_name> set <column_name> =<new_value> where <condition>- 示例: db2 update employee set age = 30 where id = 111. 查询数据- 语法: db2 select <column1_name>, <column2_name>, ... from <table_name> where <condition>- 示例: db2 select * from employee三、管理数据库事务12. 启动事务- 语法: db2 autmit off- 示例: db2 autmit off13. 提交事务- 语法: db2mit- 示例: db2mit14. 回滚事务- 语法: db2 rollback- 示例: db2 rollback四、管理数据库权限15. 创建用户- 语法: db2 create user <username> password <password> - 示例: db2 create user testuser password testpass16. 授权- 语法: db2 grant <privilege> on <object> to <user>- 示例: db2 grant select, insert, update on employee to testuser17. 撤销授权- 语法: db2 revoke <privilege> on <object> from <user> - 示例: db2 revoke select, insert, update on employee from testuser五、管理数据库性能18. 优化SQL查询- 语法: db2expln -d <database_name> -t <sql_statement> - 示例: db2expln -d sample -t "select * from employee"19. 查看数据库锁- 语法: db2 list applications show det本人l- 示例: db2 list applications show det本人l20. 查看数据库表空间使用情况- 语法: db2pd -d <database_name> -tablespaces- 示例: db2pd -d sample -tablespaces六、其他常用命令21. 导出数据- 语法: db2 export to <file_name> of del select * from<table_name>- 示例: db2 export to employee.csv of del select * from employee22. 导入数据- 语法: db2 import from <file_name> of del insert into<table_name>- 示例: db2 import from employee.csv of del insert into employee23. 查看数据库配置参数- 语法: db2 get db cfg for <database_name>- 示例: db2 get db cfg for sample结语以上就是DB2数据库SQL常用命令的介绍,通过掌握这些命令,可以更方便地管理和使用DB2数据库。
DB2错误信息(按sqlcode排序)sqlcode sqlstate 说明00000000SQL语句成功完成+01201xxx SQL语句成功完成,但是有警告+09801545未限定的列名被解释为一个有相互关系的引用+10001568动态SQL语句用分号结束+11002000没有找到满足SQL语句的行+11101561用DATA CAPTURE定义的表的更新操作不能发送到原来的子系统+11701590为2型索引设置了SUBPAGES语句+16201525要插入的值的个数不等于被插入表的列数+20301514指定的表空间被置为检查挂起状态+20401552使用非唯一的名字来解决命名的限定列+20601532命名的对象未在DB2中定义+21801533命名的列不在SQL语句中指定的任何表中存在+21901537因为SQL语句引用一个远程对象,不能为该SQL语句执行EXPLAIN+22001532命名的PLAN TABLE不存在+23601546不正确定义PLAN TABLE,检查命名列的定义+23701005SQLDA中的SQLN的值至少应于所描述的列的个数一样大+23801594至少有一个被描述的列应该是单值类型,因此扩展的SQLVAR条目需要另外的空间+23901005至少应有一个被描述的列是一个LOB,因此扩展的SQLVAR条目需要另外的空间+30401005至少应有一个被描述的列应是单值类型,因此扩展的SQLVAR条目需要另外的空间+33101515该值不能被分配给宿主变量,因为该值不再数据类型的范围之内+33901520不能被翻译的字符串,因此被设置为NULL+39401569由于与DB2 2.2版本的子系统连接,所以可能存在字符转换问题+39501629使用优化提示来选择访问路径+40201628设置了无效的优化提示,原因代码指定了为什么,忽略优化提示+40301521未知的位置+43401522本地不存在CREAT ALIAS对象+44501608在DB2未来发布的版本中将不支持指定的特性,IBM建议你停止使用这些特性+46201004值被CAST函数截取+46401Hxx由用户定义的函数或存储过程发出的警告+46601609命名的存储过程超出了它可能返回的查询结果集的个数限制+49401610指定由命名的存储过程返回的查询结果集的个数。
db2查看执行计划DB2查看执行计划。
在DB2数据库中,执行计划是指数据库系统为了执行SQL语句而生成的一种执行策略。
通过查看执行计划,我们可以了解数据库系统是如何执行我们的SQL语句的,从而对SQL语句的性能进行优化。
下面我们将介绍在DB2中如何查看执行计划。
一、使用EXPLAIN语句。
在DB2中,我们可以使用EXPLAIN语句来查看执行计划。
EXPLAIN语句可以用来分析SQL语句的执行计划,并将结果保存到一个表中,以便我们进行查看和分析。
例如,我们可以使用以下语句来查看某个SQL语句的执行计划:EXPLAIN PLAN FOR SELECT FROM table_name;执行以上语句后,DB2会将执行计划保存到一个特定的表中,我们可以通过以下语句来查看执行计划的结果:SELECT FROM TABLE(SYSPROC.SNAP_GET_EXPLAIN_V97('snapshot_table_name', -1))AS EXPLAIN_TABLE;通过以上语句,我们就可以查看到SQL语句的执行计划了。
二、使用Visual Explain工具。
除了使用EXPLAIN语句来查看执行计划外,DB2还提供了一个可视化的工具——Visual Explain,它可以帮助我们更直观地查看执行计划。
通过Visual Explain,我们可以将SQL语句的执行计划以图形的方式展示出来,包括各个操作的执行顺序、操作所涉及的表、索引等信息,以及每个操作的成本估算等。
在DB2 Control Center中,可以找到Visual Explain的入口,在其中我们可以输入要分析的SQL语句,然后就可以得到该SQL语句的执行计划图形展示了。
三、使用db2exfmt工具。
除了上述两种方法外,我们还可以使用db2exfmt工具来查看执行计划。
db2exfmt是DB2自带的一个命令行工具,它可以将执行计划以文本的形式输出,方便我们进行查看和分析。
DB2常用SQL语句集1、查看表结构:describe table tablenamedescribe select * from tablename2、列出系统数据库目录的内容:list database directory3、查看数据库配置文件的内容:get database configuration for DBNAME4、启动数据库:restart database DBNAME5、关闭表的日志alter table TBLNAME active not logged inially6、重命名表rename TBLNAME1 to TBLNAME27、取当前时间select current time stamp from sysibm.sysdummy18、创建别名create alias ALIASNAME for PRONAME(table、view、alias、nickname)9、查询前几条记录select * from TBLNAME fetch first N rows10、联接数据库db2 connect to DB user db2 using PWD11、绑定存储过程命令db2 bind BND.bnd12、整理优化表db2 reorgchk on table TBLNAMEdb2 reorg table TBLNAMEdb2 runstats on table TBNAME with distribution and indexes all13、导出表db2 export to TBL.txt of del select * from TBLNAMEdb2 export to TBL.ixf of ixf select * from TBLNAME以指定分隔符‘|’下载数据:db2 "export to cmmcode.txt of del modified by coldel| select * from cmmcode”14、导入表db2 import from TBL.txt of del insert into TBLNAMEdb2 import from TBL.txt of del commitcount 5000 insert into TBLNAMEdb2 import from TBL.ixf of ixf commitcount 5000 insert into TBLNAMEdb2 import from TBL.ixf of ixf commitcount 5000 insert_update into TBLNAMEdb2 import from TBL.ixf of ixf commitcount 5000 replace into TBLNAMEdb2 import from TBL.ixf of ixf commitcount 5000 create into TBLNAME (仅IXF)db2 import from TBL.ixf of ixf commitcount 5000 replace_create into TBLNAME (仅IXF)以指定分隔符“|”加载:db2 "import from btpoper.txt of del modified by coldel| insert into btpoper"15、显示当前用户所有表命令db2 “list tables”16、查看锁情况命令:db2 get snapshot for locks on DBNAMElist applications for db DBNAME show detail17、打开锁的监视开关命令db2 update monisor switches using lock on18、游标的使用:declare cursorN cursor with hold for select CHAR from TBNAME for update;for update不能和GROUP BY、 DISTINCT、 ORDER BY、 FOR READ ONLY及UNION, EXCEPT, or INTERSECT(但 UNION ALL除外)一起使用。
DB2错误信息sqlcode sqlstate 说明000 00000 SQL语句句成功完成01xxx SQL语句句成功完成,但是有警告+012 01545 未限定的列列名被解释为⼀一个有相互关系的引⽤用+098 01568 动态SQL语句句⽤用分号结束+100 02000 没有找到满⾜足SQL语句句的⾏行行+110 01561 ⽤用DATA CAPTURE定义的表的更更新操作不不能发送到原来的⼦子系统+111 01590 为2型索引设置了了SUBPAGES语句句+117 01525 要插⼊入的值的个数不不等于被插⼊入表的列列数+162 01514 指定的表空间被置为检查挂起状态+203 01552 使⽤用⾮非唯⼀一的名字来解决命名的限定列列+204 01532 命名的对象未在DB2中定义+206 01533 命名的列列不不在SQL语句句中指定的任何表中存在+218 01537 因为SQL语句句引⽤用⼀一个远程对象,不不能为该SQL语句句执⾏行行EXPLAIN+219 01532 命名的PLAN TABLE不不存在+220 01546 不不正确定义PLAN TABLE,检查命名列列的定义+236 01005 SQLDA中的SQLN的值⾄至少应于所描述的列列的个数⼀一样⼤大+237 01594 ⾄至少有⼀一个被描述的列列应该是单值类型,因此扩展的SQLVAR条⽬目需要另外的空间+238 01005 ⾄至少应有⼀一个被描述的列列是⼀一个LOB,因此扩展的SQLVAR条⽬目需要另外的空间+239 01005 ⾄至少应有⼀一个被描述的列列应是单值类型,因此扩展的SQLVAR条⽬目需要另外的空间+304 01515 该值不不能被分配给宿主变量量,因为该值不不再数据类型的范围之内+331 01520 不不能被翻译的字符串串,因此被设置为NULL+339 01569 由于与DB2 2.2版本的⼦子系统连接,所以可能存在字符转换问题+394 01629 使⽤用优化提示来选择访问路路径+395 01628 设置了了⽆无效的优化提示,原因代码指定了了为什什么,忽略略优化提示+402 01521 未知的位置+403 01522 本地不不存在CREAT ALIAS对象+434 01608 在DB2未来发布的版本中将不不⽀支持指定的特性,IBM建议你停⽌止使⽤用这些特性+445 01004 值被CAST函数截取+462 01Hxx 由⽤用户定义的函数或存储过程发出的警告+464 01609 命名的存储过程超出了了它可能返回的查询结果集的个数限制+466 01610 指定由命名的存储过程返回的查询结果集的个数。
DB2 SQL RR/RS/CS/UR四个级别1.RR隔离级别:在此隔离级别下,DB2会锁住所有相关的纪录。
在一个SQL语句执行期间,所有执行此语句扫描过的纪录都会被加上相应的锁。
具体的锁的类型还是由操作的类型来决定,如果是读取,则加共享锁;如果是更新,则加独占锁。
由於会锁定所有為获得SQL语句的结果而扫描的纪录,所以锁的数量可能会很庞大,这个时候,索引的增加可能会对SQL语句的执行有很大的影响,因為索引会影响SQL语句扫描的纪录数量。
2.RS隔离级别:此隔离级别的要求比RR隔离级别稍弱,此隔离级别下会锁定所有符合条件的纪录。
不论是读取,还是更新,如果SQL语句中包含查询条件,则会对所有符合条件的纪录加相应的锁。
如果没有条件语句,也就是对表中的所有记录进行处理,则会对所有的纪录加锁。
3.CS隔离级别:此隔离级别仅锁住当前处理的纪录。
4.UR隔离级别:此隔离级别下,如果是读取操作,不会出现任何的行级锁。
对于非只读的操作,它的锁处理和CS相同。
DB2默认的隔离级别是CS。
DB2默认的隔离级别是CS。
即游标稳定性。
即游标稳定性。
详细说明:当多个用户访问同一数据库时会发生的现象介绍如下:在单用户环境中,每个事务都是顺序执行的,而不会遇到与其他事务的冲突。
但是,在多用户环境下,多个事务可以(而且常常)同时执行。
因此每个事务都有可能与其他正在运行的事务发生冲突。
有可能与其他事务发生冲突的事务称为交错的或并行的事务,而相互隔离的事务称为串行化事务,这意味着同时运行它们的结果与一个接一个连续地运行它们的结果没有区别。
在多用户环境下,在使用并行事务时,会发生四种现象:丢失更新:这种情况发生在两个事务读取并尝试更新同一数据时,其中一个更新会丢失。
例如:事务 1 和事务 2 读取同一行数据,并都根据所读取的数据计算出该行的新值。
如果事务 1 用它的新值更新该行以后,事务2 又更新了同一行,则事务 1 所执行的更新操作就丢失了。
1 限制结果表大小Select * from tabname fetch first 5 rows only;2 cast用法Select * from tabnameA where coln = cast( ‘TR01’ as tabnameB)CAST(salary AS DOUBLE) 类型转换3 连接内连接selet a.col,b.col from tab a,tab b where a.t1=b.t1;外连接:左连接:select a.col,b.col from tab a left join tab b on a.t1=b.t1 (left outer join)右连接:4 输出排序Order by col DESC 降序排列缺省为升序5 限制输出结果,与order共用Select * from tabA order by col desc fetch first 5 rows only6 substr函数Substr(col,1,2); col为char或varchar型7 列函数可以参照数据库中FUNCTIONS中的说明用Quest Centeral查看,以下是常用的Max 、avg、count…DB2中的VARCHAR转换为INTEGER的函数为CAST()DB2中的INTEGER转换为VARCHAR的函数为CHAR()DB2中的VARCHAR转换为DATE的函数为DATE()DB2中的DATE转换为VARCHAR的函数为CHAR() char(col,iso) 输出yyyy-mm-ddYEAR() 返回date数值的年部分Month()返回date数值的月部分HOUR() 返回一个数值的小时部分SELECT HOUR('18:34:23')FROMSECOND() 返回一个数值的秒部分RTRIM()删除字符串尾部的空格Ltrim()删除字符串左边的空格Replace(col,exp1,exp2)替换col中exp1为exp2MOD(EXP1,EXP2) 返回EXP1除以EXP2的余数DOUBLE()如果参数是一个数字表达式,返回与其相对应的浮点数,如果参数是字符串表达式,则返回该数的字符串表达式.FLOA T() 返回一个数的浮点表示FLOOR() 返回小于或等于参数的最大整数8 group by分组Select a, sum(fse) from tab group by a having sum(fse)>1000 Having过滤条件9 取消重复值distinctSelect distinct col from tab10 字符串匹配like11 范围查找between and12 否定条件查找not like13 空值查询col is null14 查找一组值col in (1,2);15 子查询Select * from tabA where col1 in (select col from tabB); Select * from tabA where col1 not in (select col from tabB);16 case 表达式Select caseWhen score < 65 then ‘not passed’When score<=90 then ‘passed’Else ‘excellent’EndFrom tabA18 基础-多表的关联更新方法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 (ername,t1.instcode) = (selectt2.instcode,t2.instname from sysinsttb t2 wheret2.instcode=t1.instcode);19 集合运算符union intersect except并:union select col from tabA union select col from tabB交: intersect select col from tabA intersect select col from tabB差:except select col from tabA except select col from tabB20 insert …selectInsert into tabA select col1, col2 from tabB选择的列与插入的列数目、类型一致.21 DB2如何得到错误代码的说明?DB2 ?SQLCODE例:db2 ? sql080322 在命令行创建存储过程Db2 –td@ -vf sp.sqlSp.sql为脚本注意,一个可能的脚本如下:Sp.sql#注释Drop PROCEDURE db2inst1.spname@Create PROCEDURE db2inst1.spname(in cs1 char(1), in cs2 int, out outcode int)Language sqlBegindeclare SQLCODE int default 0;end@注意在客户端工具中不能加@实例名字也应该注意。
连接库用不同的用户时可能出现找不到存储过程的情形。
23 存储过程变量定义declare errorcode int ; 整数declare v_yf char(7) 定长字符串declare v_yf varchar(20) 变长字符串declare v_ye DECIMAL(19, 2) ; 金额浮点数declare v_dt date; 日期24 存储过程变量赋值1)语句赋值:select wdatebegin into v_mb_dt from time_allmonth where wdid=v_yf; 2)set赋值:set errorcode = 0;3)游标赋值:fetch cur_zh into v_zh;25 存储过程动态sql1)先定义字符串: declare v_sqlstr varchar(200) 变长字符串2)字符串赋值:set v_sqlstr = ‘’3)声明执行表示符:prepare s0 from v_sqlstr4)执行表示符:execute s05)如果在第二步定义?,则在第四步使用using例:SET stmt = 'INSERT INTO '||new_name || ' ' ||'SELECT empno, firstnme, midinit, lastname, salary '||'FROM employee '||'WHERE workdept = ?';PREPARE s3 FROM stmt;EXECUTE s3 USING deptNumber26 存储过程动态sql中字符串连接和value的用法set sqlstr='insert into db2inst2.fact_yhkywltj select '''|| v_yf||''' , khjg, kz, 0, value(count(*),0), 0, 0,0,0,0 from dwinst.card_dwkb where substr(kzt,1,1)='''||'0'||''' and substr(kzt,5,1)='''||'0'||''' group by khjg,kz';注意v_yf是字符型变量,连接符||两边各有3个’’’。
注意value的用法,返回值为空时赋缺省值27 存储过程的游标使用1)定义游标declare zhmx_cur cursor for select zh,rq,jce from tabA;2) 打开游标open zhmx_cur;3)定义循环标示:fetch_loop_zhmx: loop4)遍历游标,并赋值变量fetch zhmx_cur into v_zh, v_mx_rq, v_mx_jce;if errorcode != 0 thenleave fetch_loop_zhmx;---推出循环,相当于break;end if;if errorcode != 0 theniterate fetch_loop_zhmx;---结束后续操作,继续循环,相当于continue;end if;5)结束循环end loop fetch_loop_zhmx;6)关闭游标close zhmx_cur;28 关于continue handlerdeclare continue handler for sqlexception,sqlwarning,not foundset errorcode = SQLCODE;这条语句的作用是当sql出现错误的时候,把SQLCODE的值赋给errcode,并继续执行。
便于程序跟踪。
没有这条语句的话,当 sql语句出现错误后,整个存储过程立即推出。
注意在循环结束前将set errorcode = 0;29 存储过程的调用1)没有参数的话call procname();2)有输出参数的话call procname(?,?),几个输出参数,几个?3)有输入参数的话call procname(2,’aaa’),按输入参数的个数和类型输入。
4)既有输入又有输出的话call procname(2,’aaa’,?)30存储过程if逻辑判断用法1)两个判断if substr(c_day,6,2)=substr(t_day,6,2) then----else----end if;2)一个判断if SQLCODE != 0 and SQLCODE != 100 then----end if;3) 三个或以上判断:IF (rating = 1)----ELSEIF (rating = 2)----ELSE-----END IF;31 存储过程中case用法CASE ratingWHEN 1 THEN-------WHEN 2 THEN------ELSE-----END CASE;32 其他用法按db2安装目录下的案例D:\Program Files\IBM\SQLLIB\samples\sqlproc。