SYBASE数据库迁移到AS 400 db2的FAQ.docx_第1页
SYBASE数据库迁移到AS 400 db2的FAQ.docx_第2页
SYBASE数据库迁移到AS 400 db2的FAQ.docx_第3页
SYBASE数据库迁移到AS 400 db2的FAQ.docx_第4页
SYBASE数据库迁移到AS 400 db2的FAQ.docx_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

SYBASE数据库迁移到AS 400 db2的FAQ1Sybase数据类型和db2有那些不同?答:Datetime 对应 timestampTinyint ,smallint 对应 smallintMoney 类型对应 numeric(19,4)2db2数据库是否支持自增加列设置?答:支持,例如:SYSID BIGINT GENERATED ALWAYS AS IDENTITY将原来sysid 的 numerical(18,0) 改为 BIGINT类型3Db2是否有convert()函数,sybase 下这样语句如何转换?答:convert(datetime,convert(char(8),dateadd(day,-1,getdate(),112)db2下没有convert()函数,关于转换可以使用如下函数char(),timestamp(),date(),time() 另外可以使用系统内部的系统变量current timestamp , current date , current time 代表系统当前日期时间如上语句可以这样转换timestamp( current date 1 days,time(00.00.00)4Sybase的isnull(vc_pici_id,0) 如何转换? 答:DB2下使用value(vc_pici_id,0)或者coalesce(vc_pici_id,0)5Db2下如何调用存储过程和调用代返回值得存储过程?答: (1)无返回参数调用CALL proc1(v_empno, v_salary)(2)有返回参数调用declare ret_var integer default 0;CALL proc1(var1,var2) ;Get Diagnostics ret_var = RETURN_STATUS;-declare err_code integer default 0;call proc1(var1,err_code);IF ERR_CODE = 1 THEN XXXX;END IF;6Sybase 下游标控制是非常方便的,使用sqlcode,sqlstate来控制,不知道db2下游标是如何控制的?答:DB2下游标控制不是非常的轻松和方便的,同样也可以使用sqlcode,sqlstate,或者用户自己控制,DB2下SQLCODE,SQLSTATE不能直接使用,必须声明后使用,(也就是说将系统的SQLCODE,SQLSTATE本地实例化一分拷贝)。一般采用用户定义游标开关和sqlcode返回信息一起共同控制的方法.举例1:(这里说明一个问题,游标开关是和SQLCODE捆绑的。02000就是SQLCODE号)/-标准使用游标的例子标准WHILE DO 控制游标/-CREATE PROCEDURE CREDITP (IN i_perinc DECIMAL(3,2),INOUT o_numrec DECIMAL(5,0)LANGUAGE SQLBEGIN - 这里是用户管理事务DECLARE proc_cusnbr CHAR(5);DECLARE proc_cuscrd DECIMAL(11,2);DECLARE numrec DECIMAL(5,0);DECLARE at_end INT DEFAULT 0; - 开关定义 DECLARE not_found CONDITION FOR 02000; - 没有数据,游标结尾定义 DECLARE c1 CURSOR FOR SELECT cusnbr, cuscrd FROM ordapplib.customer;DECLARE CONTINUE HANDLER FOR not_found SET at_end = 1; -定义CONTINUE 条件DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK ; -sqlcode 非010002则退出并回滚事务SET numrec = 0;OPEN c1;FETCH c1 INTO proc_cusnbr, proc_cuscrd;WHILE at_end = 0 DOSET proc_cuscrd = proc_cuscrd +(proc_cuscrd * i_perinc);SET numrec = numrec + 1;FETCH c1 INTO proc_cusnbr, proc_cuscrd;END WHILE;SET o_numrec = numrec;CLOSE c1;COMMIT; -提交事务 END举例2:-声明游标C1DECLARE c1 CURSOR FOR SELECT cusnbr, cuscrdFROM ordapplib.customer;OPEN c1; -打开游标FETCH c1 INTO proc_cusnbr, proc_cuscrd; -从游标获取数据IF SQLSTATE = 02000 THEN -判断游标是否有数据(无)CALL DATA_NOT_FOUND; -返回调用ELSEDO WHILE (SUBSTR(SQLSTATE,1,2) = 00 | SUBSTR(SQLSTATE,1,2) = 01);FETCH c1 INTO proc_cusnbr, proc_cuscrd;.END IF ;CLOSE c1; -关闭游标7DB2存储过程的标准格式如何?答:DB2存储过程的编写比较灵活,但是语法格式是非常严格的。基本如下CTEATE PROCEDURE XHZQ_DB.PROCNAME (IN PARA_1 TYPE DEFAULT VALUE ,OUT PARA_2 TYPE DEFAULT VALUE)BEGIN ( 用户管理事务)-用户定义变量DECLARE VAR1 TYPE DEFAULT VALUE;-用户定义控制临时变量DECLARE ERROR_CODE INT DEFAULT 0;DECLARE AT_END INT DEFAULT 0;- 用户定义条件控制变量DECLARE not_found CONDITION FOR 02000;- 用户定义游标DECLARE C1 CURSOR FOR SELECT COL FROM TABLE_NAME ;- 用户定义条件和开关变量关联DECLARE CONTINUE HANDLER FOR not_found SET at_end = 1; - 用户定义事务回滚处理条件DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK ;- 初始化变量直SET VAR = 0;- 判断入口参数IF (PARA_1 IS NULL) THEN SET PARA = 100;END IF;- 存储过程语句体集合OPEN C1 ;FETCH C1 INTO XX,XX2,XX3 ;.CLOSE C1;- 提交事务COMMIT WORK HOLD;SET PARA_2 = 0 ;RETURN PARA_2 ; - 返回参数0 成功END 8Db2下char()函数用法答: CHAR(DATE,Keyword) , CHAR(TIME,Keyword)KeywordDate FormatTime FormatUSA07/17/200101:48PMISO2001-07-1713.48.04EUR17.07.200113.48.04JIS2001-07-1713.48.049如果是单字符,如“”如何组合拼接?答:同样可以使用CHAR(),进行ASCii 转换例如:DECLARE VC_CHAR CHAR(1);DECLARE VC_TEMP CHAR(10);SET VC_CHAR = CHAR(39); - 39 IS ASCii10Db2如何创建约束?答:语法如下:ALTER TABLE XHZQ.INFO_SKU_TAB ADD CONSTRAINT XHZQ.CKC_C_DIANZICHENG_FLA_INFO_SKU CHECK( C_DIANZICHENG_FLAG IN ( 0 , 1 , 2 ) ) ;11Db2下如何创建索引?答:CREATE UNIQUE INDEX UNIQUE_NAME ON PROJECT (PROJNAME)CREATE INDEX JOB_BY_DPT ON EMPLOYEE (WORKDEPT, JOB)12Sybase 中的全局变量rowcount,db2中如何使用?答:db2中也有此全局变量,具体使用如下:通过声明变量tempCount,使用语句DECLARE TEMPCOUNT BIGINT DEFAULT = 0;GET DIAGNOSTICS tempCount = ROW_COUNT;获得,DB2下的ROW_COUNT等价于rowcount13DB2是如何管理事务的?答:DB2中事务管理,也是支持自动事务管理和用户管理事务。CREATE PROCEDURE XXX.PROC_NAME( 。)BEGIN AUTMIC -系统自动管理事务END BEGIN 如果系统自动管理事务,脚本中不允许出现COMMIT, ROLLBACK ,使用这种方式,如果使用捆绑SQLCODE,SQLSTATE和游标,可以达到系统自动控制游标的功能。IF (XX) THEN COMMIT WORK HOLD;ELSE ROLLBACK WORK HOLD;END IF;END 14DB2的VARCHAR()函数用法?答:VARCHAR(Par,length)功能,将par转换为变长字符串par : 参数character, integer , decimal , numeric, float ,graphlength: 参数字符串长度例如:SELECT VARCHAR(EMPNO,10)INTO :VARHVFROM EMPLOYEE15Db2的SING()函数用法?答:sing(par) 功能判断par的大小和零比较如果par 0 返回 1如果par = 0 返回 0例如:SELECT SIGN(ROFIT)FROM EMPLOYEE16DB2如何创建用户自定义函数?答:给出例子如下/*function name to_charargument: (in) timestamp, format comm:将日期转换为制定的字符格式ruturn:制定格式的字符串author: Dekker date: 2003-09-12*/CREATE FUNCTION xhzq_db.to_char ( t1 TIMESTAMP, format VARCHAR(32) )RETURNS VARCHAR(26)LANGUAGE SQLREADS SQL DATANO EXTERNAL ACTIONBEGINDECLARE chs_tmstmp CHAR( 26 );DECLARE retval VARCHAR( 26 );SET chs_tmstmp = CHAR( t1 );CASE TRIM(format)WHEN DDTHEN SET RETVAL = SUBSTR( chs_tmstmp, 9, 2);WHEN MMTHEN SET RETVAL = SUBSTR( chs_tmstmp, 6, 2);WHEN YYYYTHEN SET RETVAL = SUBSTR( chs_tmstmp, 1, 4);WHEN YYYY-MM-DDTHEN SET RETVAL = SUBSTR( chs_tmstmp, 1, 10);ELSE SIGNAL SQLSTATE 38Z01SET MESSAGE_TEXT = INVALID FORMAT SPECIFIED.;END CASE;RETURN retval;END;17Sybase 中使用Getdate()获得当前日期时间,DB2时如何获得?答:Now(),VALUES CURRENT DATE;VALUES CURRENT TIME;VALUES CURRENT TIMESTAMP;18Db2的在线帮助网址是什么?答/is . /rbafzmsthctabl.htm19Db2中SQLSTATE的代号如何定义?答:如下Class Code 00: Unqualified Successful Completion Class Code 01: Warning Class Code 02: No Data Class Code 07: Dynamic SQL Error Class Code 08: Connection Exception Class Code 09: Triggered Action Exception Class Code 0A: Feature Not Supported Class Code 0E: Invalid Schema Name List Specification Class Code 0F: Invalid Token Class Code 0K: Resignal When Handler Not Active Class Code 20: Case Not Found for Case Statement Class Code 21: Cardinality Violation Class Code 22: Data Exception Class Code 23: Constraint Violation Class Code 24: Invalid Cursor State Class Code 25: Invalid Transaction State Class Code 26: Invalid SQL Statement Identifier Class Code 27: Triggered Data Change Violation Class Code 28: Invalid Authorization Specification Class Code 2D: Invalid Transaction Termination Class Code 2E: Invalid Connection Name Class Code 2F: SQL Function Exception Class Code 34: Invalid Cursor Name Class Code 38: External Function Exception Class Code 39: External Function Call Exception Class Code 3B: Savepoint Exception Class Code 3C: Ambiguous Cursor Name Class Code 42: Syntax Error or Access Rule Violation Class Code 44: WITH CHECK OPTION Violation Class Code 46: Java Errors Class Code 51: Invalid Application State Class Code 54: SQL or Product Limit Exceeded Class Code 55: Object Not in Prerequisite State Class Code 56: Miscellaneous SQL or Product Error Class Code 57: Resource Not Available or Operator Intervention Class Code 58: System Error 20如何对当前游标的行数据进行删除,更新操作?答:例如 DECLARE THISEMP CURSOR FOR SELECT EMPNO, LASTNAME,WORKDEPT, JOBFROM CORPDATA.EMPLOYEEFOR UPDATE OF JOB ;open THISEMP ;UPDATE CORPDATA.EMPLOYEESET JOB = :NEW-CODEWHERE CURRENT OF THISEMP21Db2中使用 NOT FOUND 控制游标?答:NOT FOUND是DB2中的全局变量,可以等同于如下IF SQLCODE =100 GO TO DATA-NOT-FOUND.orEXEC SQLWHENEVER NOT FOUND GO TO symbolic-addressEND-EXEC.IF SQLSTATE =02000 GO TO DATA-NOT-FOUND.22DB2下动态游标如何定义和使用?答:给出一个例子CREATE PROCEDURE CREATE_DEPT_TABLE (IN P_DEPT CHAR(3)LANGUAGE SQLBEGINDECLARE STMT CHAR(1000);DECLARE MESSAGE CHAR(20);DECLARE TABLE_NAME CHAR(30);DECLARE CONTINUE HANDLER FOR SQLEXCEPTIONSET MESSAGE = ok;SET TABLE_NAME = CORPDATA.DEPT_ CONCAT P_DEPT CONCAT _T;SET STMT = DROP TABLE CONCAT TABLE_NAME;PREPARE S1 FROM STMT;EXECUTE S1;SET STMT = CREATE TABLE CONCAT TABLE_NAME CONCAT( EMPNO CHAR(6) NOT NULL,FIRSTNME VARCHAR(12) NOT NULL,MIDINIT CHAR(1) NOT NULL,LASTNAME CHAR(15) NOT NULL,SALARY DECIMAL(9,2);PREPARE S2 FROM STMT;EXECUTE S2;SET STMT = INSERT INTO CONCAT TABLE_NAME CONCATSELECT EMPNO, FIRSTNME, MIDINIT, LASTNAME, SALARYFROM CORPDATA.EMPLOYEEWHERE WORKDEPT = ?;PREPARE S3 FROM STMT;EXECUTE S3 USING P_DEPT;END;23DB2下在存储过程中,直接执行sql语句,如何定义和使用?答:举例如下CREATE PROCEDURE CREATE_DEPT_TABLE (IN P_DEPT CHAR(3)LANGUAGE SQLBEGINDECLARE STMT CHAR(1000);DECLARE MESSAGE CHAR(20);DECLARE TABLE_NAME CHAR(30);DECLARE CONTINUE HANDLER FOR SQLEXCEPTIONSET MESSAGE = ok;SET TABLE_NAME = CORPDATA.DEPT_ CONCAT P_DEPT CONCAT _T;SET STMT = DROP TABLE CONCAT TABLE_NAME;PREPARE S1 FROM STMT;EXECUTE S1;SET STMT = CREATE TABLE CONCAT TABLE_NAME CONCAT( EMPNO CHAR(6) NOT NULL,FIRSTNME VARCHAR(12) NOT NULL,MIDINIT CHAR(1) NOT NULL,LASTNAME CHAR(15) NOT NULL,SALARY DECIMAL(9,2);PREPARE S2 FROM STMT;EXECUTE S2;SET STMT = INSERT INTO CONCAT TABLE_NAME CONCATSELECT EMPNO, FIRSTNME, MIDINIT, LASTNAME, SALARYFROM CORPDATA.EMPLOYEEWHERE WORKDEPT = ?;PREPARE S3 FROM STMT;EXECUTE S3 USING P_DEPT;END;24DB2是否支持多重事务?是如何实现的?答: DB2支持多重事务,使用SAVEPOINT的机制管理多重事务处理。允许在一个事务中设置多个保存点,而出错是回滚到指定保存点。COMMITROLLBACKSET TRANSACTIONSAVEPOINT STOP_HERE ON ROLLBACK RETAIN CURSORS;SAVEPOINT START_OVER UNIQUE ON ROLLBACK RETAIN CURSORS;RELEASE SAVEPOINT START_OVER25Sybase 使用raiserror 99999 xxxx自定义错误信息,db2如何实现自定义错误?答:使用signal SQLSTATEii0002 set message_text = dddd; 指定SQLSTATE信息返回自定义的错误信息。 注意sqlstate 必须是 5 位字符,可以是 0 9 ,不允许大写字符A-Z和其他特殊字符。不允许前两个字符是00。Message_text 信息限制在70字节长度。举例如下CREATE PROCEDURE raise ( IN rating INTEGER )LANGUAGE SQLBEGINDECLARE new_salary DECIMAL(9,2);DECLARE service DECIMAL(8,0);DECLARE v_empno CHAR(6) DEFAULT 123456;SELECT salary, current_date - hiredateINTO new_salary, serviceFROM employeeWHERE empno = v_empno;IF service 600THEN SIGNAL SQLSTATE II001SET MESSAGE_TEXT = Insufficient time in service.;END IF;IF rating = 1THEN SET new_salary =new_salary + (new_salary * .10);ELSEIF rating = 2THEN SET new_salary =new_salary + (new_salary * .05);END IF;UPDATE employeeSET salary = new_salaryWHERE empno = v_empno;END;26Db2中return的限制和使用?答: return 不允许在触发器中使用。27Db2中如何创建trigger?答:Db2的trigger 和Sybase 的触发器有些区别,Sybase中触发器全部市after方式。Db2可以定义触发器的触发时机(after,before)具体格式:create Trigger info_plu_ti after insert on info_plu_tab Referencing New as new for each row 28Db2的CASE 控制语句用法和例子?答:用法举例如下:CASE evaluationWHEN 100 THEN UPDATE employee SET salary = salary * 1.3;WHEN 90 THEN UPDATE employee SET salary = salary * 1.2;WHEN 80 THEN UPDATE employee SET salary = salary * 1.1;ELSE UPDATE employee SET salary = salary * 1.05;END CASE;或者:CASEWHEN evaluation = 100 THEN UPDATE employee SET salary = salary * 1.3;WHEN evaluation = 90 THEN UPDATE employee SET salary = salary * 1.2;WHEN evaluation = 80 THEN UPDATE employee SET salary = salary * 1.1;ELSE UPDATE employee SET salary = salary * 1.05;END CASE;29Db2的循环控制语句loop用法?答:loop例子: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;30Db2的循环控制语句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;31Db2的循环控制语句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;32Db2的循环控制语句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;33Sybase 中循环控制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;34在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);35db2中存储过程中使用动态游标(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 VARCHAR256;.SET stmt = SELECT COLUMN1, COLUMN2, COLUMN3 FROM TBL1;PREPARE PreparedStatement FROM s1;DECLARE Cursor1 CURSOR FOR PreparedStatement;.36Db2下支持返回结果集合的存储过程吗?答:支持,例子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;END37DB2数据库中一个表的行长度、列数以及每页行数在表空间中的限制答:在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四种。38某些SQL语句可能非常复杂,比如嵌套调用多个表或触发许多触发器,在对这样的SQL语句进行编译时,出现SQL0101N错误,如何处理答:对于一个复杂的SQL语句,在调用多个表或触发多个触发器时, 可能会占用 大量的系统资源. 当出现SQL0101N错误时, 首先需要确认系统中没有递归的触发器存在. 之后可通过增加如下参数的值来解决此问题: 1)STMTHEAP 2)APPLHEAPSZ 3)PCKCACHESZ39如何实施联机备份?答:数据库建立时日志方式默认是循环日志模式(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文件进行恢复时,还需要相关的日志文件。40quiesce是一种持续状态的锁,它属于一个连接,当该连接失败时,quiesce状态依然存在。如何将表空间的状态置为正常状态?答:除去quiesce状态: 1. 连接到数据库 2. 用 list tablespaces 判断哪个tablespace处于quiesce状态和和取得对象(object)ID 3. 判断对象ID对应的表 用 db2 select tabname from syscat.tables where tablid=对象ID 得到表名 b)用 db2 list history 判断是那个表 4. 用 db2 quiesce tablespaces for table 表名 reset 去除quiesce状态 41在DB2 UDB中如何创建用户定义临时表?答:可使用 DECLARE GLOBAL TEMPORARY TABLE 语句来定义临时表。此语句需在应用程序中使用。只有在应用程序与数据库断开连接之前,用户定义临时表才是持续的。 此表的说明并不出现在系统目录中,使其对于其他应用程序而言不是持续的,也不能与其他应用程序共享此表。 当使用此表的应用程序终止或与数据库断开连接时,此表中的数据被删除, 此表被隐式卸下。 下面是定义临时表的一个示例: DECLARE GLOBAL TEMPORARY TABLE gbl_temp LIKE empltabl ON COMMIT DELETE ROWS NOT LOGGED IN usr_tbsp 此语句创建一个名为 gbl_temp 的用户临时表。定义此用户临时表 所使用的列的名称和说明与 empltabl 的列的名称和说明完全相同。隐式定义只包括列名、数据类型、可为空特性和列缺省值属性。未定义所有其他列属性,包括唯一约束、外部关键字约束、触发器和索引。执行 COMMIT 操作时, 若未对该表打开 WITH HOLD 游标,则该表中的所有数据都被删除。不记录 对用户临时表所作的更改。用户临时表被放在指定的用户临时表空间中。此表空间必须存在,否则此表的声明将失败。42在使用IMPORT命令向数据库出入数据时,如何避免日志空间满错误?答:在执行IMPORT命令时, 如果使用循环日志, 有时会出现日志满错误, 这时可用COMMITCOUNT参数来解决. 因为日志空间满往往是因为所有的日志均处于活动状态导致的. 而COMMIT执行后, 会释放所占据的资源, 其中包括日志 . 这样, 被当前事务使用的日志在COMMIT命令执行后, 即变成非活动状态了43怎么样检查数据库连接有关的错误?答:以TCP/IP连接为例, 若连接失败,您可以检查下列项目: A) 在服务器上: 1) db2co

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论