SYBASE 数据库迁移到AS 400 db2的FAQ(四)

原创 2003年10月15日 00:07:00
 

31Db2的循环控制语句loop用法?

答:loop例子:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

OPEN c1;

SET at_end = 0;

SET numrec = 0;

fetch_loop: 1

LOOP

FETCH c1 INTO proc_cusnbr, proc_cuscrd;

IF SQLCODE = 0 THEN

SET proc_cuscrd = proc_cuscrd * 1.2;

UPDATE ordapplib.customer

SET cuscrd = proc_cuscrd

WHERE CURRENT OF c1;

SET numrec = numrec + 1;

ELSE

LEAVE fetch_loop; 2

END IF;

END LOOP fetch_loop; 3

CLOSE c1;

 

32Db2的循环控制语句while用法?

答:while  例子:

OPEN c1;

SET at_end = 0;

SET numrec = 0;

WHILE at_end = 0 DO

FETCH c1 INTO proc_cusnbr, proc_cuscrd;

IF SQLCODE = 0 THEN

SET proc_cuscrd = proc_cuscrd * 1.2;

UPDATE ordapplib.customer

SET cuscrd = proc_cuscrd

WHERE CURRENT OF c1;

SET numrec = numrec + 1;

ELSE

SET at_end = 1;

END IF;

END WHILE;

CLOSE c1;

 

33Db2的循环控制语句repeat用法?

答:repeat例子

SET numrec = 0;

fetch_loop:

REPEAT

FETCH c1 INTO proc_cusnbr, proc_cuscrd;

IF SQLCODE = 0 THEN

SET proc_cuscrd = proc_cuscrd * 1.2;

UPDATE ordapplib.customer

SET cuscrd = proc_cuscrd

WHERE CURRENT OF c1;

SET numrec = numrec + 1;

END IF;

UNTIL SQLCODE <> 0

END REPEAT fetch_loop;

 

 

34Db2的循环控制语句for用法?

答:for 例子

FOR each_record AS

cursor1 CURSOR FOR

SELECT cusnbr, cuscrd FROM ordapplib.customer

DO

UPDATE ordapplib.customer

SET cuscrd = cuscrd * 1.1

WHERE CURRENT OF cursor1;

END FOR;

34Sybase 中循环控制Break,ContinueDb2用法?

答:在db2中 Break 转换为leave lab, Continue 转换为ITERATE lab

     等同于GOTO语句

举例如下:

==============  leave 例子

OPEN c1;

SET at_end = 0;

SET numrec = 0;

fetch_loop: 1

LOOP

FETCH c1 INTO proc_cusnbr, proc_cuscrd;

IF SQLCODE = 0 THEN

SET proc_cuscrd = proc_cuscrd * 1.2;

UPDATE ordapplib.customer

SET cuscrd = proc_cuscrd

WHERE CURRENT OF c1;

SET numrec = numrec + 1;

ELSE

LEAVE fetch_loop; 2

END IF;

END LOOP fetch_loop;

CLOSE c1;

============  iterate 例子

BEGIN

OPEN c1;

ins_loop: 1

LOOP

FETCH c1 INTO v_dept, v_deptname, v_admdept;

IF at_end = 1 THEN

LEAVE ins_loop;

ELSEIF v_dept = 'D11' THEN

ITERATE ins_loop; 2

END IF;

INSERT INTO sampledb02.deptnew (deptno, deptname, admrdept)

VALUES (v_dept, v_deptname, v_admdept);

END LOOP;

CLOSE c1;

END;

35.在Db2存储过程中使用滚动游标(scrollable cursor)?

答:例子

CREATE PROCEDURE MYMAX

( IN fld_name CHAR(30),

IN file_name CHAR(128),

INOUT max_value INTEGER)

LANGUAGE SQL

BEGIN atomic

DECLARE sql_stmt CHAR(256);

DECLARE not_found

CONDITION FOR '02000';

DECLARE c1 DYNAMIC SCROLL CURSOR FOR s1;  -- 声明动态滚动游标

DECLARE CONTINUE HANDLER FOR not_found

SET max_value = NULL;

SET sql_stmt = 'SELECT ' || fld_name || ' FROM ' || file_name ||

' ORDER BY 1';                            --组合sql语句

PREPARE s1 FROM sql_stmt;

OPEN c1;

FETCH LAST FROM c1 INTO max_value;       --转到最后行

CLOSE c1;

END

滚动游标的使用例子:(rpg)

EXEC SQL BEGIN DECLARE SECTION;

char fld_name[ 30 ];

char file_name[ 128 ];

integer max_value;

short ind3;

EXEC SQL END DECLARE SECTION;

Then the indicator variable is used in the call statement:

EXEC SQL

CALL MYMAX( :fld_name, :file_name, :max_value :ind3);

 

36db2中存储过程中使用动态游标(dynamic cursor)?

答:使用PREPARE , EXECUTE ,EXECUTE IMMEDIATE语句

  例子:

CREATE PROCEDURE DYNSQLSAMPLE()

LANGUAGE SQL

BEGIN

DECLARE stmt VARCHAR(256);

SET stmt = 'UPDATE employee SET salary = salary * 1.1 WHERE empno = ?'; 1

PREPARE s1 FROM stmt;

ins_loop:

FOR each_department AS

c1 CURSOR FOR

SELECT mgrno FROM department WHERE mgrno IS NOT NULL

DO

EXECUTE s1 USING mgrno;

END FOR;

END;

EXECUTE IMMEDIATE statement  例子:

PREPARE s1 FROM ‘UPDATE employee SET salary = salary * 1.1 WHERE

empno IN (SELECT DISTINCT mgrno FROM department WHERE mgrno IS NOT NULL);

EXECUTE s1;

等同于

EXECUTE IMMEDIATE ‘UPDATE employee SET salary = salary * 1.1 WHERE

empno IN (SELECT DISTINCT mgrno FROM department WHERE mgrno IS NOT NULL);

 

最基本动态游标语句

...

DECLARE stmt VARCHAR[256];

...

SET stmt = ‘SELECT COLUMN1, COLUMN2, COLUMN3 FROM TBL1’;

PREPARE PreparedStatement FROM s1;

DECLARE Cursor1 CURSOR FOR PreparedStatement;

...

37Db2下支持返回结果集合的存储过程吗?

答:支持,例子1

CREATE PROCEDURE GetCusName()

RESULT SETS  1

LANGUAGE SQL

BEGIN

DECLARE c1 CURSOR WITH RETURN FOR

SELECT cusnam FROM customer ORDER BY cusnam;

OPEN c1;

SET RESULT SETS CURSOR c1;

END

         例子2

CREATE PROCEDURE GETRANKV4R5

(IN proc_year DECIMAL(4,0),

IN proc_month DECIMAL(2,0),

INOUT proc_rank INTEGER)

RESULT SETS 2    ---- 2 两个结果集

LANGUAGE SQL

BEGIN

...

DECLARE c1 DYNAMIC SCROLL CURSOR FOR s1;

DECLARE c2 DYNAMIC SCROLL CURSOR FOR s2;

...

SET RESULT SETS CURSOR c1, CURSOR c2;

END

 

38DB2数据库中一个表的行长度、列数以及每页行数在表空间中的限制

答:DB2数据库中一个表的每行长度、列数以及每页行数在表空间中的限制如下:
[平台] Windows 9x/NT/2000, Unix, Linux
[版本] 6.x/7.x
表空间页面大小 表空间中行长度限制(bytes)表空间中列数限制 表空间中每页最大行数
4K 4005 500 255

8K 8101 1012 255

16K 16293 1012 255

32K 32677 1012 255

注:表空间页面大小只有4K,8K,16K,32K四种。

 

39.某些SQL语句可能非常复杂,比如嵌套调用多个表或触发许多触发器,在对这样的SQL语句进行编译时,出现SQL0101N错误,如何处理

答:对于一个复杂的SQL语句,在调用多个表或触发多个触发器时, 可能会占用
大量的系统资源.
当出现SQL0101N错误时, 首先需要确认系统中没有递归的触发器存在.
之后可通过增加如下参数的值来解决此问题:

1)STMTHEAP
2)APPLHEAPSZ
3)PCKCACHESZ

40.如何实施联机备份?

答:数据库建立时日志方式默认是循环日志模式(Circular Log),这时是无法做联机备份的。所以,希望实施联机备份,首先要将日志方式改为归档日志模式(Archival Log)。

sample数据库为例,可以在控制中心中改变sample数据库的配置参数LOGRETAIN为Recovery,或在命令行下用 db2 update db cfg for sample using LOGRETAIN on。改变此参数后,再次连接数据库会显示数据库处于备份暂挂(BACKUP PENDING)状态。这时,需要做一次对数据库的脱机备份。在控制中心中选择对数据库进行脱机备份或在命令行下用 db2 backup db sample 实施。此后数据库就可以进行联机备份了。
可以选择在控制中心中对数据库进行联机备份,或在命令行下用 db2 backup db sample online 实施。
注意: 利用联机备份得到的IMAGE文件进行恢复时,还需要相关的日志文件。

qq:50839655

msn:dekker@hotmail.com

email:zhangtao@xhzq.com,dekker99@163.com

DB2 AS400数据库恢复

恢复数据库的步骤:新建用户、新建数据库模式、创建数据库文件目录、上传备份文件,进行数据库恢复。 新建用户 2.1.登录iSeries,选择用户和组下面的所有用户选择创建新用户。 2.2....
  • xiashuangxi
  • xiashuangxi
  • 2016年05月09日 16:06
  • 1297

As400/db2命令详解

一、备份数据库 1.创建备份目录名,即库名 命令:CRTLIB   LIB(备份目录名)  TYPE(*PROD)   AUT(*EXCLUDE) CRTAUT(*CHANGE)   CRTOBJAU...
  • hustxiayu
  • hustxiayu
  • 2015年03月29日 11:56
  • 3992

常见数据库常用数据类型、默认端口

不管何种数据库,常用数据类型无外乎数值型、字符型、日期时间型。 下文列出常见数据库的各种常用数据类型。...
  • wangnan537
  • wangnan537
  • 2016年07月04日 11:13
  • 1997

sybase杀掉“僵死”链接

sybase是一个收费的数据库。如果是测试版,会限制链接数。比较奇葩的是,它释放死掉的链接很慢(不知道是不是设置问题),一个小组的人开发的时候,很快链接就满了,sybase很久都不会主动回收。浪费大量...
  • mahycsdn
  • mahycsdn
  • 2015年08月27日 20:10
  • 1056

sybase数据库函数基础示例

表:student(学生表) 有三列,分别为:S_NAME(学生姓名),S_AGE(学生年龄),S_SEX(学生性别); 需求:查出给定年龄和性别的所有学生姓名,并用“;”拼接返回。 函数代码: ...
  • skyfred
  • skyfred
  • 2016年07月11日 15:43
  • 667

sybase数据库的两种简单迁移方法

新上了一套sybase数据库,需要做数据迁移工作,由于可以申请周末停机时间,因此可以选择如下两种方案,方法都比较简单,同sqlserver很类似 方法1:dump和load方法,本质上是备份...
  • hijk139
  • hijk139
  • 2014年02月28日 10:52
  • 7079

linux下sybase数据库的常用操作

常用操作: 1.su - sybase -c "isql -Usa -STANK" 2.修改SA的密码(SA默认密码为空): 用ISQL连接上后   sp_password null,"新密...
  • qq_29663071
  • qq_29663071
  • 2016年07月12日 17:12
  • 2480

学习总结:sybase中bcp命令批量导出和导入

1.编辑一个文件selectout.sql: set nocount on use databasename go select 'bcp databasename..' + na...
  • colinmok
  • colinmok
  • 2014年07月17日 11:17
  • 3676

Sybase常见日期函数使用说明

Sybase常见日期函数使用说明
  • rcom10002
  • rcom10002
  • 2014年03月11日 13:23
  • 4690

sybase审计功能

1、创建审计所需的数据库设备和数据库     use master     go     --创建审计数据库sybsecurity     disk init name = 'auditdev...
  • lileizhang
  • lileizhang
  • 2013年12月05日 17:42
  • 855
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SYBASE 数据库迁移到AS 400 db2的FAQ(四)
举报原因:
原因补充:

(最多只允许输入30个字)