DB2游标

合集下载

DB2中游标的使用

DB2中游标的使用

DB2中游标的使用注意commit和rollback使用游标时要特别注意如果没有加with hold 选项,在Commit和Rollback时,该游标将被关闭。

Commit 和Rollback有很多东西要注意。

特别小心游标的两种定义方式一种为declare continue handler for not foundbeginset v_notfound = 1;end;declare cursor1 cursor with hold for select market_code from tb_market_code for update;open cursor1;set v_notfound=0;fetch cursor1 into v_market_code;while v_notfound=0 Do--workset v_notfound=0;fetch cursor1 into v_market_code;end while;close cursor1;这种方式使用起来比较复杂,但也比较灵活。

特别是可以使用with hold 选项。

如果循环内有commit或r ollback 而要保持该cursor不被关闭,只能使用这种方式。

另一种为pcursor1: for loopcs1 as cousor1 cursor asselect market_code as market_codefrom tb_market_codefor updatedoend for;这种方式的优点是比较简单,不用(也不允许)使用open,fetch,close。

但不能使用with hold 选项。

如果在游标循环内要使用commit,rollback则不能使用这种方式。

如果没有c ommit或rollback的要求,推荐使用这种方式(看来For这种方式有问题)。

修改游标的当前记录的方法update tb_market_code set market_code='0' where current of cursor1;不过要注意将cursor1定义为可修改的游标declare cursor1 cursor for select market_code from tb_market_codefor update;for update 不能和GROUP BY、DISTINCT、ORDER BY、FOR READ ONLY及UNION, EXCEP T, or INTERSECT 但UNION ALL除外)一起使用。

db2 中offset用法

db2 中offset用法

db2 中offset用法DB2中OFFSET用法DB2是一种关系型数据库管理系统,用于存储和管理结构化数据。

在DB2中,OFFSET是一种用于分页查询的关键字,它用于指定从结果集中的哪一行开始返回数据。

下面是关于DB2中OFFSET的一些用法及详细讲解。

1. OFFSET基本用法使用OFFSET时,需要与LIMIT关键字一起使用。

OFFSET用于指定从结果集的第几行开始返回数据,使用的语法格式为:SELECT column1, column2, ...FROM tableLIMIT n OFFSET m;其中,n表示要返回的行数,m表示从第几行开始返回数据。

2. OFFSET的取值在DB2中,OFFSET的取值必须是非负整数。

如果OFFSET的值为0,则表示从结果集的第一行开始返回数据。

3. 示例:返回第11到20行的数据假设我们有一张名为employees的表,包含以下列:id, name, age, salary。

要返回表中第11到20行的数据,可以使用以下SQL语句:SELECT id, name, age, salaryFROM employeesORDER BY idOFFSET 10 ROWSFETCH NEXT 10 ROWS ONLY;上述语句中的OFFSET 10 ROWS表示从结果集的第11行开始返回数据,FETCH NEXT 10 ROWS ONLY表示只返回10行数据。

4. OFFSET与ORDER BY的结合使用通常,使用OFFSET之前需要先使用ORDER BY对结果集进行排序,以确保返回的数据有序。

例如,要按照salary降序排列,并返回第11到20行的数据,可以使用以下SQL语句:SELECT id, name, age, salaryFROM employeesORDER BY salary DESCOFFSET 10 ROWSFETCH NEXT 10 ROWS ONLY;上述语句中的ORDER BY salary DESC表示按照salary降序排列。

DB2存储过程使用动态游标的例子

DB2存储过程使用动态游标的例子

本文将为您介绍一个DB2存储过程使用动态游标的例子,如果您对动态游标的使用感兴趣的话,不妨一看,对您学习DB2的使用会有所帮助。

CREATE PROCEDURE data_wtptest( IN in_taskid_timestamp varchar(30),OUT o_err_no int,OUT o_err_msg varchar(1024))LANGUAGE SQLP1: BEGIN ATOMIC--声明开始--临时变量出错变量DECLARE SQLCODE integer default 0;DECLARE SQLStmt varchar(1024) default '';DECLARE r_code integer default 0;DECLARE state varchar(1024) default 'AAA';--记录程序当前所作工作DECLARE at_end int DEFAULT 0;DECLARE t_destnetid int default 0;DECLARE t_recvid varchar(30) default '';DECLARE SP_Name varchar(50) default 'data_wtptest';--声明放游标的值--声明动态游标存储变量DECLARE stmt1 STATEMENT;DECLARE c1 CURSOR FOR stmt1;--声明出错处理DECLARE EXIT HANDLER FOR SQLEXCEPTIONbeginset r_code=SQLCODE;set o_err_no=1;set o_err_msg='处理['||state||']出错,'||'错误代码SQLCODE:['||CHAR(r_code) || '].';insert into fcc_sp_log(object,name,value)values(SP_Name,in_taskid_timestamp,o_err_msg);end;DECLARE continue HANDLER for not foundbeginset at_end = 1;set state='找到0行记录或已经到记录结尾.';end;--声明结束SET state='[add]单独测试中,统计条数';SET SQLStmt='SELECT count(*) FROM wtp_pre_download where task_timestamp = ?';PREPARE stmt1 FROM SQLStmt;OPEN c1 USING in_taskid_timestamp;FETCH c1 INTO t_destnetid;CLOSE c1;SET state='[add]查具体信息';SET at_end = 0;SET SQLStmt='SELECT recv_userid FROM wtp_pre_download where task_timestamp = ?';PREPARE c1 FROM SQLStmt;OPEN c1 USING in_taskid_timestamp;SET state='[add]************';FETCH c1 INTO t_recvid;SET state='[add]============';insert into fcc_sp_log(object,name,value) values(SP_Name,in_taskid_timestamp,t_recvid);END p1。

DB2错误代码SQL返回码-信息对照

DB2错误代码SQL返回码-信息对照

用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 loop的用法

db2 loop的用法

db2 loop的用法
在DB2中,循环通常使用游标和循环语句(如FOR循环或WHILE循环)来实现。

下面是一个示例,展示了在DB2中使用游标和FOR循环进行循环的方法:
1. 创建游标:
```
DECLARE cursor_name CURSOR FOR SELECT column_name FROM table_name;
```
2. 打开游标:
```
OPEN cursor_name;
```
3. 定义变量并进行循环:
```
FOR variable_name IN cursor_name DO
-- 执行具体的循环操作
-- 可以使用FETCH语句获取游标中的每一行数据,例如: -- FETCH cursor_name INTO variable_name;
END FOR;
```
4. 关闭游标:
```
CLOSE cursor_name;
```
请注意,上述示例中的变量名和表名是占位符,您需要根据您的具体情况将其替换为实际的变量和表名。

此外,您还可以使用WHILE循环来实现循环,如下所示:
```
DECLARE variable_name datatype;
SET variable_name = initial_value;
WHILE condition DO
-- 执行循环操作
-- 更新条件
SET variable_name = new_value;
END WHILE;
```
在使用WHILE循环时,您需要自己定义初始值和更新条件,并在循环内部执行循环操作。

db2存储过程动态游标及函数返回值总结

db2存储过程动态游标及函数返回值总结

db2存储过程动态游标及函数返回值总结DB2存储过程是一种在数据库服务器上执行的事务处理程序,它可以包含SQL语句、控制结构和变量。

在存储过程中,我们经常会使用动态游标和函数返回值来实现一些特定的功能。

下面是关于DB2存储过程中动态游标和函数返回值的总结。

一、动态游标1.动态游标是在存储过程中动态定义的一种游标,它可以根据不同的条件进行查询,并返回满足条件的结果集。

动态游标的定义和使用步骤如下:1.1定义游标:使用DECLARECURSOR语句定义游标,并指定游标的名称和返回结果集的查询语句。

1.2打开游标:使用OPEN语句打开游标,并执行查询语句,将结果集保存在游标中。

1.3获取数据:使用FETCH语句获取游标中的数据,并进行相应的处理。

1.4关闭游标:使用CLOSE语句关闭游标,释放资源。

2.动态游标的优势:2.1灵活性:动态游标可以根据不同的条件查询不同的结果集,满足特定的业务需求。

2.2可读性:通过使用动态游标,可以使存储过程的代码更加清晰和易于理解。

2.3性能优化:动态游标可以根据实际情况进行优化,提高查询性能。

3.动态游标的注意事项:3.1游标的生命周期:动态游标的生命周期是在存储过程执行期间,一旦存储过程结束,游标也会自动关闭。

3.2游标的维护成本:动态游标的使用需要消耗一定的系统资源,所以在使用动态游标时需要注意资源的管理。

二、函数返回值1.函数返回值是存储过程中的一个重要特性,它可以将计算结果返回给调用者。

DB2支持返回多个值的函数,可以通过函数返回表、游标或者多个标量值来实现。

2.函数返回值的定义和使用步骤如下:2.1定义函数返回值:在存储过程中使用RETURNS子句定义函数返回的数据类型。

2.2设置函数返回值:在存储过程中使用SET语句设置函数返回的值。

2.3使用函数返回值:在调用存储过程时,可以使用SELECT语句或者VALUES语句获取函数返回的值。

3.函数返回值的优势:3.1灵活性:函数返回值可以根据实际需求返回不同的结果,满足不同的业务场景。

db2与oracle差别

db2与oracle差别

db2与oracle差别1:并发机制Oracle的默认隔离级是快照(Snapshot),写入事务可不能堵塞读取事务,读取事务能够猎取当前已提交值。

DB2默认是游标稳固性(Cursor Stability),写入事务会堵塞读取事务。

2: 数据类型数据库的核心是数据,类型不匹配或者语义的不同都会阻碍应用是否能够同时在两种数据库中运行。

Oracle支持一些非SQL标准的数据类型,例如VARCHAR2,这些是不被D B2支持的;另外,Oracle中的日期、时刻格式和DB2中相应类型在语义上不完全一致;最后Oracle的PL/SQL储备过程所支持的一些标量数据类型在DB2中需要被映射才能被识别。

如右:3: 隐式类型转换Oracle使用弱类型转换,而DB2使用强类型转换。

隐式类型转换能完成一种类型向另外一种类型的自动转换,关于不匹配的类型,假如数据类型能被合明白得释,比较或者赋值时能够执行隐式类型转换;强类型转换规则,意味着字符串和数字类型之间不能直截了当进行比较,除非显式转换。

4:SQL方言DB2传统上坚持对SQL标准的支持,但Oracle实现了专门多方言。

例如:CONNEC T BY 递归语句、(+)连接操作符、DUAL表、ROWNUM伪列、ROWID伪列、MINUS 操作符、SELECT INTO FOR UPDATE语句、TRUNCATE TABLE等。

假如要在DB2数据库上运行使用了上述方言的应用,就需要进行代码级别的翻译,工作量较大。

5:PL/SQL语言就储备过程和函数开发而言,DB2使用SQL PL语言来开发,Oracle使用PL/SQL 语言来开发。

SQL PL和PL/SQL差异庞大,这也是从Oracle到DB2转型最大的工作量所在。

6:内置包为了方便应用程序开发的需要,Oracle数据库提供了专门多内置包:DBMS_OUTPUT、DBMS_SQL、DBMS_ALERT、DBMS_PIPE、DBMS_JOB、DBMS_LOB、DBMS_UTI LITY、UTL_FILE、UTL_MAIL和UTL_SMTP等。

【数据库】:关于DB2数据库错误提示说明

【数据库】:关于DB2数据库错误提示说明

【数据库】:关于DB2数据库错误提⽰说明SQLSTATE 消息本节列⽰ SQLSTATE 及其含义。

SQLSTATE 是按类代码进⾏分组的;对于⼦代码,请参阅相应的表。

表 2. SQLSTATE 类代码类代码含义要获得⼦代码,参阅...00 完全成功完成表 301 警告表 402 ⽆数据表 507 动态 SQL 错误表 608 连接异常表 709 触发操作异常表 80A 功能部件不受⽀持表 90D ⽬标类型规范⽆效表 100F ⽆效标记表 110K RESIGNAL 语句⽆效表 1220 找不到 CASE 语句的条件表 1321 基数违例表 1422 数据异常表 1523 约束违例表 1624 ⽆效游标状态表 1725 ⽆效事务状态表 1826 ⽆效 SQL 语句标识表 1928 ⽆效权限规范表 212D ⽆效事务终⽌表 222E ⽆效连接名表 2334 ⽆效游标名表 2436 游标灵敏度异常表 2538 外部函数异常表 2639 外部函数调⽤异常表 273B SAVEPOINT ⽆效表 2840 事务回滚表 2942 语法错误或存取规则违例表 3044 WITH CHECK OPTION 违例表 3146 Java DDL 表 3251 ⽆效应⽤程序状态表 3353 ⽆效操作数或不⼀致的规范表 3454 超出 SQL 限制,或超出产品限制表 3555 对象不处于先决条件状态表 3656 其它 SQL 或产品错误表 3757 资源不可⽤或操作员⼲预表 3858 系统错误表 39类代码 00 完全成功完成表 3. 类代码 00:完全成功完成SQLSTATE 值含义00000 操作执⾏成功,并且未产⽣任何类型的警告或异常情况。

类代码 01 警告表 4. 类代码 01:警告SQLSTATE 值含义01002 发⽣ DISCONNECT 错误。

01003 从列函数的⾃变量消去 NULL 值。

01004 字符串值在指定给具有较短长度的另⼀字符串数据类型时被截断。

db2数据库基础知识

db2数据库基础知识

db2数据库基础知识1,db2数据库特点(1)具有很好的并⾏性(DB2把数据库管理扩充到了并⾏的,多节点的环境;数据库分区是数据库的⼀部分,包含⾃⼰的数据,索引,配置⽂件和事务⽇志;数据库分区有时被称为节点)。

(2)获得最⾼认证级别的ISO标准认证。

(3)性能较⾼,适⽤于数据仓库和在线事物处理。

(4)跨平台,多层结构,⽀持ODBC,JDBC等客户。

(5)操作简单,同时提供GUI和命令⾏,在windowsNT和unix下的操作相同。

(6)在巨型企业得到⼴泛的运⽤,向下兼容性好,风险⼩。

(7)能够在所有主流平台上运⾏,最适于海量数据处理。

2,db2数据库的特性(1)完全Web使能的:可以利⽤HTTP来发送询问给服务器。

(2)⾼度可缩放和可靠:⾼负荷时可利⽤多处理器和⼤内存,可以跨服务器地分布数据库和数据负荷;能够以最⼩的数据丢失快速地恢复,提供多种备份策略。

3,实现储存过程存储过程是存储在数据库中的⼀个预编译对象。

这意味着过程是预编译的,可提供给各种应⽤执⾏。

发送查询到服务器、分析和编译过程再不需要花费时间。

(1)特点:存储过程是SQL语句和控制流语句的⼀个集合或批量,它在⼀个名称下存储,按独⽴单元⽅式执⾏。

它能帮助提⾼查询的性能。

(2)好处:提⾼性能(应⽤不必重复地编译此过程)减轻⽹络拥塞(为进⾏处理,应⽤不需要向服务器提交多个SQL语句)⼀致性较好(由于过程作为单⼀控制点,在过程中定义的编码逻辑和SQL语句在所有应⽤中被⼀致地实现)改善安全机制(⽤户可以被授予许可权来执⾏存储过程,尽管他们并不拥有这个过程)(3)执⾏存储过程语句:call proc_name(param,…)(4)RETURN关键字:允许存储过程把整型值返回给调⽤者。

如果没有指定值,那么存储过程返回缺省值0或1,这依赖于存储过程的成功执⾏与否。

RETURN value(5)嵌套过程:可以执⾏或调⽤来⾃另⼀个过程的过程。

4,触发器触发器:⼀个触发器是由SQL语句集组成的代码块,在响应某些动作时激活该语句集。

DB2中的数据类型 - 51CTO_COM

DB2中的数据类型 - 51CTO_COM
DB2中可以读写的游标的定义
在DB2数据库中很难理解的单词catalog
同期最新更多>>
在DB2 UDB中复制空间数据
在DB2 UDB中使用SQL过程语言来操作触发器
DB2的数据迁移工具
选择IBM DB2的五大理由
DB2 Stinger特点
数据库频道导航
GRAPHIC(n) 的定长图形字符串和类型为 VARGRAPHIC(n)、LONG VARGRAPHIC 和 DBCLOB(n)
的变长图形字符串。字符串的长度就是序列中双字节字符的数目。
*定长图形字符串,GRAPHIC(n):定长图形字符串的长度介于 1 到 127 个双字节字符之间。如果没有指定长度,就认为是 1 个双字节字符。
*变长图形字符串,VARGRAPHIC(n):VARGRAPHIC(n) 类型的字符串是变长图形字符串,最大长度可达 16,336 个双字节字符。
*LONG VARGRAPHIC:LONG VARGRAPHIC 类型的字符串是变长图形字符串,最大长度可达 16,350 个双字节字符。
*双字节字符大对象字符串,DBCLOB(n[K|M|G]):双字节字符大对象是变长双字节字符图形字符串,最长可达 1,073,741,823
* 二进制大对象,BLOB(n[K|M|G]):二进制大对象是变长字符串,最长可达 2,147,483,647 字节。如果只指定了 n,那么 n
就是最大长度。如果指定了 nK,那么最大长度就是 n*1,024(n 的最大值为 2,097,152)。如果指定了 nM,那么最大长度就是
n*1,048,576(n 的最大值为 2,048)。如果指定了 nG,那么最大长度就是 n*1,073,741,824(n 的最大值是 2)。

DB2学习总结(1)——DB2数据库基础入门

DB2学习总结(1)——DB2数据库基础入门

DB2学习总结(1)——DB2数据库基础⼊门DB2的特性完全Web使能的:可以利⽤HTTP来发送询问给服务器。

⾼度可缩放和可靠:⾼负荷时可利⽤多处理器和⼤内存,可以跨服务器地分布数据库和数据负荷;能够以最⼩的数据丢失快速地恢复,提供多种备份策略。

DB2数据库启停启动数据库:db2start停⽌数据库:db2stop检查存在的数据库LIST DATABASE DIRECTORY数据库连接、断开CONNECT TO databasenameCONNECT RESET创建、删除数据库CREATE DB databasename注:如果已经连着⼀个数据库的话,就创建不了数据库,会报“应⽤程序已经与⼀个数据库相连”的错DROP DB databasename第⼆节表数据类型可分为数值型(numeric)、字符串型(character string)、图形字符串(graphic string)、⼆进制字符串型(binary string)或⽇期时间型(datetime)。

还有⼀种叫做DATALINK的特殊数据类型。

DATALINK值包含了对存储在数据库以外的⽂件的逻辑引⽤。

数值型数据类型包括:⼩整型,SMALLINT:两字节整数,精度为5位。

范围从-32,768到32,767。

⼤整型,INTEGER或INT:四字节整数,精度为10位。

范围从-2,147,483,648到2,147,483,647。

巨整型,BIGINT:⼋字节整数,精度为19位。

范围从-9,223,372,036,854,775,808到9,223,372,036,854,775,807。

⼩数型,DECIMAL(p,s)、DEC(p,s)、NUMBERIC(p,s)或NUM(p,s):⼩数型的值是⼀种压缩⼗进制数,它有⼀个隐含的⼩数点。

压缩⼗进制数将以⼆-⼗进制编码(binary-coded decimal,BCD)记数法的变体来存储。

⼩数点的位置取决于数字的精度(p)和⼩数位(s)。

db2循环——精选推荐

db2循环——精选推荐

db2循环db2普通循环结构while循环1. while 条件2.3. do4.5. 循环体6.7. end while;LOOP循环1. SET V_INDEX = 0;2.3. AUTHLOOP:4. LOOP5.6. V_INDEXV_INDEX = V_INDEX + 1;7. IF V_INDEX >=100 THEN8. LEAVE AUTHLOOP;--相当于break9. END IF;10. ....11. IF 条件 THEN12. ITERATE AUTHLOOP;-- 相当于continue13. END IF;14.15. SET V_INDEXV_INDEX = V_INDEX + 1;16. END LOOP;REPEAT循环1. REPEAT2.3. SQL statements;4.5. UNTIL condition – 退出条件6.7. END REPEATFOR 循环1. FOR loop_name AS2.3. SELECT … FROM4.5. DO6.7. SQL statements;8.9. END FOR;循环实例:loop循环:create or replace procedure pro_test_loop isi number;begini:=0;loopi:=i+1;dbms_output.put_line(i);if i>5 thenexit;end if;end loop;end pro_test_loop;while循环:create or replace procedure pro_test_while isi number;begini:=0;while i<5 loopi:=i+1;dbms_output.put_line(i);end loop;end pro_test_while;for循环1:create or replace procedure pro_test_for isi number;begini:=0;for i in 1..5 loopdbms_output.put_line(i);end loop;end pro_test_for;for循环2:create or replace procedure pro_test_cursor isuserRow t_user%rowtype;cursor userRows isselect * from t_user;beginfor userRow in userRows loopdbms_output.put_line(userRow.Id||','||||','||userRows%rowcount);end loop;end pro_test_cursor;游标循环使⽤:1.利⽤得到的游标在存储过程中循环:DECLARE CUR_FEESET CURSOR WITH RETURN TO CALLER FOR (SELECT--FROM 表WHERE 条件);OPEN CUR_FEESET;--得到游标--得到游标记录数SELECTcount(CIF_CSTNO)into v_countFROM CB_CSTINF A ,CB_CSTBSNINF BWHERE A.CIF_STT<>'3' AND A.CIF_CSTNO = B.CBI_CSTNO ; --FETCH CUR_FEESET INTO V_CSTNO,V_FEECODE,V_CSTLEVEL,V_FEEMODE;--WHILE V_COUNT>0 DO ……..FETCH CUR_FEESET INTO V_CSTNO,V_FEECODE,V_CSTLEVEL,V_FEEMODE;--END WHILE; --2.另⼀种db2标准循环格式(leave、iterate ⽤法):SET V_COUNT = LENGTH(V_VALIDAUTHCOMBOS);--SET V_INDEX = 0;--AUTHLOOP:LOOPIF V_INDEX >= V_COUNT THENLEAVE AUTHLOOP;--相当于breakEND IF;--....SET V_INDEX = V_INDEX + 1;--.......IF 条件 THENITERATE AUTHLOOP;-- 相当于continueEND IF;--END LOOP;--3.截取字符串的循环(设V_TEMP=‘CB1001|CB1002|CB1003|’):SET V_LENGTH = LENGTH(V_TEMP);WHILE V_LENGTH>0 DOSET V_POS = POSSTR(V_TEMP,'|');SET V_CURRENT_BSN = SUBSTR( V_TEMP, 1, V_POS-1 );SET V_TEMP = SUBSTR( V_TEMP, V_POS+1 );SET V_LENGTH = LENGTH(V_TEMP);--最后⼀个字段,不再截取SET V_BSNTYPE = V_CURRENT_BSN;END WHILE;4.游标循环(不⽤open 游标):DROP PROCEDURE TESTFOR;CREATE PROCEDURE TESTFOR()LANGUAGE SQLBEGINDECLARE V_TEMP1 VARCHAR(2);DECLARE V_TEMP2 VARCHAR(70);FOR V1 AS CURSOR1 CURSOR FORSELECT STUDENT_ID AS TEMP1,STUDENT_NAME AS TEMP2 FROM STUDENT DODELETE FROM STUDENT WHERE STUDENT_ID = TEMP1;SET V_TEMP1 = TEMP1;SET V_TEMP2 = TEMP2;END FOR; COMMIT; END;。

IBMDB2UDB介绍

IBMDB2UDB介绍

TP
将所有行放在同一个数据 数据移动 —— 通过添加和删除整个数 分区的一个指定范围的维 据分区,可以增加和删除大量数据 中
Page16
事实表拥有适合使用 DB2 分区特性的特征
特性 DPF 适合的表特征 大型表 —— 大到无法仅依 靠单独一组 CPU 和 I/O 通 道来处理 事实表的特征 事实表是最大的数据库表。它们常常 包含数亿行数据,有时候甚至包含数 千亿行数据
IBM DB2 UDB介绍 介绍
2008年12月6日 年 月 日 河北移动经分项目组

HUAWEITECHNOLOGIESCo.,Ltd.
HUAWEIConfidential
DB2产品家族 产品家族
DB2 的各个版本从低到高依次为: DB2 Everyplace DB2 Express DB2 WorkGroup DB2 Enterprise DB2 Data WareHouse Enterprise 每个版本都包含前一个版本的所有特性 和功能,并添加了新特性和新功能。 DB2 在 AIX、Windows 和 UNIX 、Linux 平台上的代码大约有 90%是相同的,另有10%的专用代码, 用于使数据库和底层操作系统紧密sional Clustering 多维集群:
一个表,其数据按 ORGANIZE BY DIMENSIONS 子句中指定的一个或多 个维或者集群键以物理方式组织成块。 MDC 是在 DB2 Version 8 中引入的,通过它可以在物理上将在多个维上 具有类似值的行聚合在一起放在磁盘上。这种聚合能为常见分析性查询 提供高效的 I/O。例如,对于 Product=car,Region=East,并且 SaleMonthYear = Jan09 的所有行,可以将它们存储在相同的存储位置, 即所谓的块(block)。在 CREATE table 语句中定义维的时候,就为每 种值的组合预留了存储空间。实际上,MDC 是一个能最大化查询性能的 特性,对于数据仓库中常用的查询更是如此。这包括需要根据几个列中 的值的组合选择行的查询。例如,DATE is between "Jan-01-2004" and "Feb-01-2005" AND Country IS NOT "United States" AND Product="Cell Phones"。

DB2_SQL_RRRSCSUR四个级别

DB2_SQL_RRRSCSUR四个级别

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 所执行的更新操作就丢失了。

db2常用问题处理

db2常用问题处理

1. 操作数据库命令 1.1. 建立数据库DB2_GCB CREATE DATABASE DB2_GCB ON G: ALIAS DB2_GCB USING CODESET GBK TERRITORY CN COLLATE USING SYSTEMDFT_EXTENT_SZ 32 1.2. 连接数据库 connect to sample1 user db2admin using 8301206 1.3DB2支持导入导出DB2支持导入(IMPORT)的文件格式有:DEL,ASC,IXF,WSF等 DB2支持导出(EXPORT)的文件格式有:DEL,IXF,WSF等, 不支持ASC格式 DB2支持载入(LOAD)的文件格式有:DEL,ASC,IXF等. 不支持WSF格式. DB2支持DB2MOVE的文件格式有:IXF等. 不支持ASC,DEL,WSF格式. 2. 操作表命令 2.1. 建立表 create table zjt_tables as (select * from tables) definition only; create table zjt_views as (select * from views) definition only; 2.2. 插入记录insert into zjt_tables select * from tables; insert into zjt_views select * from views;2.3建立视图 create view V_zjt_tables as select tabschema,tabname from zjt_tables; 2.4建立触发器CREATE TRIGGER zjt_tables_del AFTER DELETE ON zjt_tables REFERENCING OLD AS O FOR EACH ROW MODE DB2SQL Insert into zjt_tables1 values(substr(o.tabschema,1,8),substr(o.tabname,1,10)) 2.5建立唯一性索引CREATE UNIQUE INDEXI_ztables_tabname ON zjt_tables(tabname); 2.6查看表select tabname from tables where tabname='ZJT_TABLES'; 2.7查看列 select SUBSTR(COLNAME,1,20) as 列名,TYPENAME as 类型,LENGTH as 长度from columns where tabname='ZJT_TABLES';2.8查看表结构 db2 describe table user1.department db2 describe select * from user.tables2.9查看表的索引 db2 describe indexes for tableuser1.department 2.10查看视图 select viewname from views where viewname='V_ZJT_TABLES'; 2.11查看索引select indname from indexes where indname='I_ZTABLES_TABNAME';2.12查看存贮过程 SELECTSUBSTR(PROCSCHEMA,1,15),SUBSTR(PROCNAME,1,15) FROMSYSCAT.PROCEDURES; 2.13修改表结构 create table yhdab (id varchar(10), password varchar(10), ywlx varchar(10), kh varchar(10)); create table ywlbb (ywlbbh varchar(8), ywmcvarchar(60)) alter table yhdab ALTER kh SET DATA TYPE varchar(13); alter table yhdab ALTER ID SET DATA TYPE varchar(13); alter tablelst_bsi alter bsi_money set data type int; insert into yhdab values ('20000300001','123456','user01','20000300001'),('20000300002','123456','user02','20000300002'); 2.14注意事项 2.14.1建存储过程时Create 后一定不要用TAB键 create pro`cedure 的create后只能用空格,而不可用tab健,否则编译会通不过。

大型机DB2(中文版)

大型机DB2(中文版)

GRANT语句:
GRANT语句用于赋予一个用户或者一个用户组对数据库的访问
权限;
REVOKE语句:
REVOKE语句相当于GRANT语句的逆运算,该语句主要是用于
收回通过GRANT语句赋予的权限;
ROLLBACK语句和COMMIT语句主要用于控制数据操作的执
行流程;
SQLCA:(SQL Communication Area)即SQL通信区域:
注意:在声明游标时,select_statement不能包含INTO子句。当使用
显式游标时,INTO子句是FETCH语句的一部分。
Select code, name From tbl-course Where days>2 and code like ’E%’
SELECT语句中的功能字句:
SUM: 得到所选数据的总和; VG: 得到所选数据的平均值; MIN : 得到所选数据中的最小值; MAX:得到所选数据中的最大值; COUNT(*):得到所选数据的个数;
END-EXEC
利用游标同时处理多行记录
游标用来处理从数据库中检索的多行记录(使用SELECT语句)。
利用游标,程序可以逐个地处理和遍历一次检索返回的整个记录 集。
为了处理SQL语句,将在内存中分配一个区域,这就是上下文区。
这个区包含了已经处理完的行数、指向被分析语句的指针,整个 区是查询语句返回的数据行集。
静态回滚游标
静态回滚游标属于传统的回滚游标 当在程序中打开静态回滚游标后,将会根据游标定义时的选择条件, 创建一张临时的表,作为结果信息表
静态回滚游标又分为不敏感的静态回滚游标和敏感的静态回滚游
标两种
不敏感的静态回滚游标

DB2存储过程语法规则

DB2存储过程语法规则

DB2存储过程语法规则如何声明⼀个存储过程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) thenset 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 THENUPDATE employeeSET salary = salary * 1.10, bonus = 1000WHERE empno = employee_number;ELSEIF rating = 2 THENUPDATE employeeSET salary = salary * 1.05, bonus = 500WHERE empno = employee_number;ELSEUPDATE employeeSET salary = salary * 1.03, bonus = 0WHERE 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_workdeptWHEN 'A00'THEN UPDATE departmentSET deptname = 'DATA ACCESS 1';WHEN 'B01'THEN UPDATE departmentSET deptname = 'DATA ACCESS 2';ELSE UPDATE departmentSET deptname = 'DATA ACCESS 3';END CASE;例⼆:CASEWHEN v_workdept = 'A00'THEN UPDATE departmentSET deptname = 'DATA ACCESS 1';WHEN v_workdept = 'B01'THEN UPDATE departmentSET deptname = 'DATA ACCESS 2';ELSE UPDATE departmentSET deptname = 'DATA ACCESS 3';END CASE;for 表达式for 循环名 as游标名或select 表达式dosql表达式;end for;例:1)DECLARE fullname CHAR(40);FOR vl ASSELECT firstnme, midinit, lastname FROM employee DOSET fullname = lastname || ',' || firstnme ||' ' || midinit; INSERT INTO tnames VALUE (fullname);END FOR2)for loopcs1 as cousor1 cursor asselect market_code as market_codefrom tb_market_codefor updatedoend for;goto表达式goto 标⽰名;标⽰名:逻辑体;例:GOTO FAIL;...SUCCESS: RETURN 0FAIL: RETURN -200while表达式while 条件表达式 do逻辑体;end while;LOOP表达式LOOP... END LOOP;例:OPEN c1;ins_loop:LOOPFETCH c1 INTO v_dept, v_deptname, v_admdept;IF at_end = 1 THENLEAVEins_loop; --中断循环ELSEIF v_dept = 'D11' THENITERATEins_loop; --下⼀个循环END IF;INSERT INTO department (deptno, deptname, admrdept)VALUES ('NEW', v_deptname, v_admdept);END LOOP;CLOSE c1;关于游标定义游标:DECLARE 游标名 CURSOR FORSelect 语句;打开游标:OPEN 游标名;取值: FETCH 游标名 INTO 变量列表例:DECLARE c1 CURSOR FORSELECT CAST(salary AS DOUBLE)FROM staffWHERE DEPT = deptNumberORDER BY salary;DECLARE EXIT HANDLER FOR NOT FOUNDSET medianSalary = 6666;SET medianSalary = 0;SELECT COUNT(*) INTO v_numRecordsFROM staffWHERE DEPT = deptNumber;OPEN c1;WHILE v_counter < (v_numRecords / 2 + 1) DOFETCH c1 INTO medianSalary;SET v_counter = v_counter + 1;END WHILE;CLOSE c1;注:游标的申明如果放在中间段,要⽤”begin。

db2 遍历写法

db2 遍历写法

db2 遍历写法遍历通常是指在程序中重复处理某个集合的所有元素的过程。

在 DB2 数据库中,遍历通常是通过 SQL 查询来实现的。

以下是一些常见的 DB2 遍历写法:1. 使用游标(Cursor)游标是用于遍历查询结果的一种数据库对象。

使用游标可以逐行读取查询结果,并对每一行数据进行处理。

以下是一个使用游标的示例:```sqlDECLARE cur CURSOR FOR SELECT column1, column2 FROMtable_name WHERE condition;OPEN cur;FETCH NEXT FROM cur INTO var1, var2;WHILE FETCH_STATUS = 0BEGIN-- 在此处编写处理每一行数据的代码-- 可以使用 var1 和 var2 访问当前行的列值FETCH NEXT FROM cur INTO var1, var2;END;CLOSE cur;DEALLOCATE cur;```2. 使用嵌套循环(Nested Loop)嵌套循环是一种在 SQL 查询中使用嵌套的 SELECT 语句来遍历结果集的方法。

以下是一个使用嵌套循环的示例:```sqlSELECT column1, column2 FROM table_name WHERE condition; INTO var1, var2FROM table_name WHERE condition;```在嵌套循环中,外部循环遍历指定的表,而内部循环遍历结果集中的每一行数据。

内部循环中的代码可以对每一行数据进行处理。

3. 使用 WHILE 循环(While Loop)WHILE 循环是一种在存储过程或函数中使用的循环结构,可以在循环体内编写代码来处理数据。

以下是一个使用 WHILE 循环的示例:```sqlDECLARE counter INT = 0;DECLARE maxCount INT = (SELECT COUNT() FROM table_name WHERE condition);DECLARE var1 INT, var2 VARCHAR(50);WHILE counter < maxCountBEGINSELECT column1, column2 INTO var1, var2 FROM table_name WHERE condition AND ROWNUM = counter;-- 在此处编写处理每一行数据的代码,可以使用 var1 和 var2 访问当前行的列值SET counter = counter + 1;END;```在 WHILE 循环中,使用变量来控制循环的次数,并使用 SELECT 语句来获取当前行的数据。

DB2+COBOL操作

DB2+COBOL操作

DB2+COBOL操作DB2-分布式关系型数据库。

1.概念:对数据库的处理过程是以事物为单位进行的。

组织与管理是以表为单位进行的。

表是放在表空间(table space)中的,表空间是放在数据库(database)中的。

Scheme:是指实体名称中的高位标识字段,该字段用于标志整个名称。

当建立一个用户时,会产生一个同名的scheme。

如:SET CURRENT SCHEME = 'PAYROLL'SELECT * FROM EMPLOYEE. ---等同于下一条语句。

SELECT * FROM PAYROLL.EMPLOYEE.视图:VIEW,一张虚拟表,通常将多表链接的结果作为视图,以方便数据查询。

索引:INDEX,直接建立在表上的,相当于一个目录,也是方便数据查询。

2.应用:SQLCA:SQL通信区域,实现COBOL和DB2的交互。

执行SQL后,会产生一个称作SQLCODE的返回码,数字组成,存放于SQLCA中,为0或者100时,成功,为负数时错误。

在SQLCA中,还有SQLSTA TE,由字符组成。

DB2 catalog:数据字典,一张系统表,用来存放数据库所用的有关信息。

对于用户而言,为只读的。

DB2 directory:功能相似于catalog,性能高,是以VSAM文件组织存放数据的。

二者同步时,以DB2 directory为准。

COBOL中调用SQL语句的格式:嵌入式SQL主变量:即可为COBOL所用,也可为SQL语句所用(前面加‘:’)。

如:DA TA DIVISION.WORKING-STORAGE SECTION.EXEC SQL INCLUDE SQLCA END-EXEC. --通信区(必写)EXEC SQL INCLUDE COURSERCD EXEC-EXEC. --指定数据记录01 COURSE-DETAIL.03 RCODE PIC X(4). --主变量,03 RNAME PIC X(20).03 RINST PIC X(10).03 RDAYS PIC 9.PROCEDURE DIVISION.MOVE '00AB' TO RCODE.MOVE 'GANG' TO RNAME.MOVE 'SICC' TO RINST.EXEC SQLINSERT INTO Q.COURSE ( CODE, NAME)V ALUES ( :RCODE, :RNAME)UPDATE Q.COURSESET INST = :RINSTWHERE CODE = :RCODE.SELECT DAYSINTO :RDAYS FROM Q.COURSEWHERE CODE = :RCODE.END-EXEC....指示变量:在主变量之后,用于指示主变量所接收到数据是否为空。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

DB2列转行的实现2010-11-03 14:52 佚名互联网字号:T | T想要在DB2数据库中实现列转行,应该如何操作呢?下文就教您一个实现DB2数据库列转行的方法,希望对您能够有所启迪。

AD:2014WOT全球软件技术峰会北京站课程视频发布DB2列转行是我们很常见的操作,下面就为您详细介绍DB2列转行的步骤,如果您对DB2列转行方面感兴趣的话,不妨一看。

给出下面数据CREATE TABLE SalesAgg( year INTEGER,q1 INTEGER,q2 INTEGER,q3 INTEGER,q4 INTEGER );YEAR Q1 Q2 Q3 Q4----------- ----------- ----------- ----------- -----------2004 20 30 15 102005 18 40 12 27想要的结果YEAR QUARTER RESULTS----------- ----------- -----------2004 1 202004 2 302004 3 152004 4 102005 1 182005 2 402005 3 12 2005 4 27这个SQL就可以实现:SELECT S.Year, Q.Quarter, Q.ResultsFROM SalesAgg AS S,TABLE (V ALUES(1, S.q1),(2, S.q2),(3, S.q3),(4, S.q4))AS Q(Quarter, Results);每个values中对应列的数据类型必须相同,值可以任意,如1,2,3,4都是整形下面解释一下执行的过程:核心是用table函数创建了一个表,这个表是用value实现的多行表,value 实现虚表的例子:db2 => select * from (values (1,2),(2,3)) as t1(col1,col2)COL1 COL2----------- -----------1 22 32 条记录已选择。

db2 => select * from (values 1) as a1-----------11 条记录已选择。

所不同的是这里跟from子句中的一个表产生了关系,取出了表中的一列作为数据.具体的实现sql如下:Sql代码select t2.SCORE_GP,sum(decode(t2.course, '语文', COUNTNUM,null)) as CHINESE,sum(decode(t2.course, '数学', COUNTNUM,null)) as MATH,sum(decode(t2.course, '英语', COUNTNUM,null)) as ENGLISHfrom (select t.course,case when t.score <60 then '00-60'when t.score >=60 and t.score <80 then '60-80'when t.score >=80 then '80-100' end as SCORE_GP,count(t.score) as COUNTNUMFROM test_tb_grade tgroup by t.course,case when t.score <60 then '00-60'when t.score >=60 and t.score <80 then '60-80'when t.score >=80 then '80-100' endorder by t.course ) t2group by t2.SCORE_GPorder by t2.SCORE_GP[二]、列转行1.1、初始测试数据表结构:TEST_TB_GRADE2Sql代码create table TEST_TB_GRADE2(ID NUMBER(10) not null,USER_NAME V ARCHAR2(20 CHAR),CN_SCORE FLOAT,MA TH_SCORE FLOAT,EN_SCORE FLOAT)初始数据如下图:1.2、如果需要实现如下的查询效果图:这就是最常见的列转行,主要原理是利用SQL里面的union,具体的sql语句如下:Sql代码select user_name, '语文' COURSE , CN_SCORE as SCORE from test_tb_grade2union select user_name, '数学' COURSE, MATH_SCORE as SCORE from test_tb_grade2 union select user_name, '英语' COURSE, EN_SCORE as SCORE from test_tb_grade2order by user_name,COURSE也可以利用【insert all into ... select 】来实现,首先需要先建一个表TEST_TB_GRADE3:Sql代码create table TEST_TB_GRADE3(USER_NAME V ARCHAR2(20 CHAR),COURSE V ARCHAR2(20 CHAR),SCORE FLOAT)再执行下面的sql:Sql代码insert allinto test_tb_grade3(USER_NAME,COURSE,SCORE) values(user_name, '语文', CN_SCORE)into test_tb_grade3(USER_NAME,COURSE,SCORE) values(user_name, '数学', MATH_SCORE)into test_tb_grade3(USER_NAME,COURSE,SCORE) values(user_name, '英语', EN_SCORE) select user_name, CN_SCORE, MA TH_SCORE, EN_SCORE from test_tb_grade2;commit;别忘记commit操作,然后再查询TEST_TB_GRADE3,发现表中的数据就是列转成行了。

给出下面的数据:CREATE TABLE Sales (Year INT, Quarter INT, Results INT)YEAR QUARTER RESULTS----------- ----------- -----------2004 1 202004 2 302004 3 152004 4 102005 1 182005 2 402005 3 122005 4 27想要的到结果:YEAR Q1 Q2 Q3 Q4----------- ----------- ----------- ----------- -----------2004 20 30 15 102005 18 40 12 27这个SQL就可解决这个问题:SELECT Year,MAX(CASE WHEN Quarter = 1THEN Results END) AS Q1,MAX(CASE WHEN Quarter = 2THEN Results END) AS Q2,MAX(CASE WHEN Quarter = 3THEN Results END) AS Q3,MAX(CASE WHEN Quarter = 4THEN Results END) AS Q4FROM SalesGROUP BY Year解释一下为什么要加max的原因,因为不加max的话结果会是这样:YEAR Q1 Q2 Q3 Q4----------- ----------- ----------- ----------- -----------2004 20 - - -2004 - 30 - -2004 - - 15 -2004 - - - 102005 18 - - -2005 - 40 - -2005 - - 12 -2005 - - - 27列转行给出下面数据CREATE TABLE SalesAgg( year INTEGER,q1 INTEGER,q2 INTEGER,q3 INTEGER,q4 INTEGER );YEAR Q1 Q2 Q3 Q4----------- ----------- ----------- ----------- -----------2004 20 30 15 102005 18 40 12 27想要的结果YEAR QUARTER RESULTS----------- ----------- -----------2004 1 202004 2 302004 3 152004 4 102005 1 182005 2 402005 3 122005 4 27这个SQL就可以实现:SELECT S.Year, Q.Quarter, Q.ResultsFROM SalesAgg AS S,TABLE (V ALUES(1, S.q1),(2, S.q2),(3, S.q3),(4, S.q4))AS Q(Quarter, Results);下面解释一下执行的过程:核心是用table函数创建了一个表,这个表是用value实现的多行表,value实现虚表的例子:db2 => select * from (values (1,2),(2,3)) as t1(col1,col2)COL1 COL2----------- -----------1 22 32 条记录已选择。

db2 => select * from (values 1) as a1-----------11 条记录已选择。

所不同的是这里跟from子句中的一个表产生了关系,取出了表中的一列作为数据.表结构:name type valuelee breakfast 10lee lunch 20lee supper 20怎么用一句sql查询出如下结果:name breakfast lunch supperlee 10 20 20select name,sum(case type when 'breakfast' then value end) breakfast,sum(case type when 'lunch' then value end) lunch,sum(case type when 'supper' then value end) supper,from your_tblgroup by name用递归查询来实现DB2的行列转换问题2010-10-20 11:42:25| 分类:DB2|举报|字号订阅潇潇提出的问题是数据库里面著名的“行列转换”问题,现在oracle10g以上版本可以直接用一个函数wmsys.wm_concat来实现。

相关文档
最新文档