数据库

本类阅读TOP10

·SQL语句导入导出大全
·SQL Server日期计算
·SQL语句导入导出大全
·SQL to Excel 的应用
·Oracle中password file的作用及说明
·MS SQLServer OLEDB分布式事务无法启动的一般解决方案
·sqlserver2000数据库置疑的解决方法
·一个比较实用的大数据量分页存储过程
·如何在正运行 SQL Server 7.0 的服务器之间传输登录和密码
·SQL中两台服务器间使用连接服务器

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
SYBASE 数据库迁移到AS 400 db2的FAQ(三)

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

继续上一篇文章的内容

21Db2SQLSTATE的代号如何定义?

答:如下

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

22.如何对当前游标的行数据进行删除,更新操作?

答:例如  DECLARE THISEMP CURSOR FOR SELECT EMPNO, LASTNAME,
WORKDEPT, JOB
FROM CORPDATA.EMPLOYEE
FOR UPDATE OF JOB ;

open THISEMP ;

UPDATE CORPDATA.EMPLOYEE
SET JOB = :NEW-CODE
WHERE CURRENT OF THISEMP

 

23Db2中使用 NOT  FOUND 控制游标?

答:NOT FOUND是DB2中的全局变量,可以等同于如下

IF SQLCODE =100 GO TO DATA-NOT-FOUND.

 or

 EXEC SQL

 WHENEVER NOT FOUND GO TO symbolic-address

END-EXEC.

 IF SQLSTATE ='02000' GO TO DATA-NOT-FOUND.

24DB2下动态游标如何定义和使用?

答:给出一个例子

CREATE PROCEDURE CREATE_DEPT_TABLE (IN P_DEPT CHAR(3))

        LANGUAGE SQL

   BEGIN

     DECLARE STMT CHAR(1000);

     DECLARE MESSAGE CHAR(20);

     DECLARE TABLE_NAME CHAR(30);

     DECLARE CONTINUE HANDLER FOR SQLEXCEPTION

        SET 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 CONCAT

       'SELECT EMPNO, FIRSTNME, MIDINIT, LASTNAME, SALARY

         FROM CORPDATA.EMPLOYEE

         WHERE  WORKDEPT = ?';

     PREPARE S3 FROM STMT;

     EXECUTE S3 USING P_DEPT;

END;

 

25DB2下在存储过程中,直接执行sql语句,如何定义和使用?

答:举例如下

CREATE PROCEDURE CREATE_DEPT_TABLE (IN P_DEPT CHAR(3))

        LANGUAGE SQL

   BEGIN

     DECLARE STMT CHAR(1000);

     DECLARE MESSAGE CHAR(20);

     DECLARE TABLE_NAME CHAR(30);

     DECLARE CONTINUE HANDLER FOR SQLEXCEPTION

        SET 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 CONCAT

       'SELECT EMPNO, FIRSTNME, MIDINIT, LASTNAME, SALARY

         FROM CORPDATA.EMPLOYEE

         WHERE  WORKDEPT = ?';

     PREPARE S3 FROM STMT;

     EXECUTE S3 USING P_DEPT;

END;

26DB2是否支持多重事务?是如何实现的?

: DB2支持多重事务,使用SAVEPOINT的机制管理多重事务处理。允许在一个事务中设置多个保存点,而出错是回滚到指定保存点。

COMMIT

ROLLBACK

SET TRANSACTION

 

SAVEPOINT STOP_HERE  ON ROLLBACK RETAIN CURSORS;

 

SAVEPOINT START_OVER UNIQUE    ON ROLLBACK RETAIN CURSORS;

RELEASE SAVEPOINT START_OVER

27Sybase 使用raiserror 99999 ‘xxxx’自定义错误信息,db2如何实现自定义错误?

答:使用signal SQLSTATE 'ii0002' set message_text  = ‘dddd’;  指定SQLSTATE信息返回自定义的错误信息。 注意sqlstate 必须是 5 位字符,可以是 0 – 9 ,不允许大写字符A-Z和其他特殊字符。不允许前两个字符是‘00’。Message_text 信息限制在70字节长度。

举例如下

CREATE PROCEDURE raise ( IN rating INTEGER )

  LANGUAGE SQL

    BEGIN

       DECLARE new_salary DECIMAL(9,2);

       DECLARE service DECIMAL(8,0);

       DECLARE v_empno CHAR(6) DEFAULT '123456';

            SELECT salary, current_date - hiredate

               INTO new_salary, service

               FROM employee

               WHERE empno = v_empno;

            IF service < 600

              THEN SIGNAL SQLSTATE 'II001'

                     SET MESSAGE_TEXT = 'Insufficient time in service.';

            END IF;

            IF rating = 1

             THEN SET new_salary =

                          new_salary + (new_salary * .10);

             ELSEIF rating = 2

             THEN SET new_salary =

                          new_salary + (new_salary * .05);

            END IF;

            UPDATE employee

               SET salary = new_salary

               WHERE empno = v_empno;

     END;

 

28Db2return的限制和使用?

答: return 不允许在触发器中使用。

    

29Db2中如何创建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

30Db2CASE 控制语句用法和例子?

答:用法举例如下:

   CASE evaluation

WHEN 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;

或者:

CASE

WHEN 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;

 

QQ:50839655

email:[email protected],[email protected]

html://www.xhzq.com




相关文章

相关软件