您的位置:首页 > 数据库

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

2008-05-01 03:09 453 查看
31.db2的循环控制语句loop用法?答:loop例子:AS-microsoft-com:office:office" />OPEN c1;SET at_end = 0;SET numrec = 0;fetch_loop: 1LOOPFETCH c1 INTO proc_cusnbr, proc_cuscrd;IF SQLCODE = 0 THENSET proc_cuscrd = proc_cuscrd * 1.2;UPDATE ordapplib.customerSET cuscrd = proc_cuscrdWHERE CURRENT OF c1;SET numrec = numrec + 1;ELSELEAVE fetch_loop; 2END IF;END LOOP fetch_loop; 3CLOSE c1; 32.db2的循环控制语句while用法?答:while 例子:OPEN c1;SET at_end = 0;SET numrec = 0;WHILE at_end = 0 DOFETCH c1 INTO proc_cusnbr, proc_cuscrd;IF SQLCODE = 0 THENSET proc_cuscrd = proc_cuscrd * 1.2;UPDATE ordapplib.customerSET cuscrd = proc_cuscrdWHERE CURRENT OF c1;SET numrec = numrec + 1;ELSESET at_end = 1;END IF;END WHILE;CLOSE c1; 33.db2的循环控制语句repeat用法?答:repeat例子SET numrec = 0;fetch_loop:REPEAT FETCH c1 INTO proc_cusnbr, proc_cuscrd;IF SQLCODE = 0 THENSET proc_cuscrd = proc_cuscrd * 1.2;UPDATE ordapplib.customerSET cuscrd = proc_cuscrdWHERE CURRENT OF c1;SET numrec = numrec + 1;END IF;UNTIL SQLCODE <> 0 END REPEAT fetch_loop; 34.db2的循环控制语句for用法?答:for 例子FOR each_record AS cursor1 CURSOR FOR SELECT cusnbr, cuscrd FROM ordapplib.customerDOUPDATE ordapplib.customer SET cuscrd = cuscrd * 1.1WHERE CURRENT OF cursor1; END FOR;34.SYBASE 中循环控制Break,Continue在db2用法?答:在db2中 Break 转换为leave lab, Continue 转换为ITERATE lab 等同于GOTO语句举例如下:============== leave 例子OPEN c1;SET at_end = 0;SET numrec = 0;fetch_loop: 1LOOPFETCH c1 INTO proc_cusnbr, proc_cuscrd;IF SQLCODE = 0 THENSET proc_cuscrd = proc_cuscrd * 1.2;UPDATE ordapplib.customerSET cuscrd = proc_cuscrdWHERE CURRENT OF c1;SET numrec = numrec + 1;ELSELEAVE fetch_loop; 2END IF;END LOOP fetch_loop;CLOSE c1;============ iterate 例子BEGINOPEN c1;ins_loop: 1LOOPFETCH c1 INTO v_dept, v_deptname, v_admdept;IF at_end = 1 THENLEAVE ins_loop;ELSEIF v_dept = 'D11' THENITERATE ins_loop; 2END 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 SQLBEGIN atomicDECLARE sql_stmt CHAR(256);DECLARE not_foundCONDITION FOR '02000';DECLARE c1 DYNAMIC SCROLL CURSOR FOR s1; -- 声明动态滚动游标DECLARE CONTINUE HANDLER FOR not_foundSET 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 SQLCALL MYMAX( :fld_name, :file_name, :max_value :ind3); 36.db2中存储过程中使用动态游标(dynamic cursor)?答:使用PREPARE , EXECUTE ,EXECUTE IMMEDIATE语句 例子:CREATE PROCEDURE DYNSQLSAMPLE()LANGUAGE SQLBEGINDECLARE stmt VARCHAR(256);SET stmt = 'UPDATE employee SET salary = salary * 1.1 WHERE empno = ?'; 1PREPARE s1 FROM stmt; ins_loop:FOR each_department ASc1 CURSOR FORSELECT mgrno FROM department WHERE mgrno IS NOT NULLDOEXECUTE s1 USING mgrno; END FOR;END;EXECUTE IMMEDIATE statement 例子:PREPARE s1 FROM ‘UPDATE employee SET salary = salary * 1.1 WHEREempno IN (SELECT DISTINCT mgrno FROM department WHERE mgrno IS NOT NULL);EXECUTE s1;等同于EXECUTE IMMEDIATE ‘UPDATE employee SET salary = salary * 1.1 WHEREempno 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;...37.db2下支持返回结果集合的存储过程吗?答:支持,例子1CREATE PROCEDURE GetCusName()RESULT SETS 1LANGUAGE SQLBEGINDECLARE c1 CURSOR WITH RETURN FOR SELECT cusnam FROM customer ORDER BY cusnam;OPEN c1; SET RESULT SETS CURSOR c1;END 例子2CREATE PROCEDURE GETRANKV4R5(IN proc_year DECIMAL(4,0),IN proc_month DECIMAL(2,0),INOUT proc_rank INTEGER)RESULT SETS 2 ---- 2 两个结果集LANGUAGE SQLBEGIN...DECLARE c1 DYNAMIC SCROLL CURSOR FOR s1;DECLARE c2 DYNAMIC SCROLL CURSOR FOR s2;...SET RESULT SETS CURSOR c1, CURSOR c2;END 38.db2数据库中一个表的行长度、列数以及每页行数在表空间中的限制答:在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)PCKCACHESZ40.如何实施联机备份?答:数据库建立时日志方式默认是循环日志模式(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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: