ITPub博客

首页 > 数据库 > Oracle > [PL/SQL]10g PL/SQL学习笔记(三)

[PL/SQL]10g PL/SQL学习笔记(三)

原创 Oracle 作者:chenyan995 时间:2008-12-09 22:18:43 0 删除 编辑

Declaring the Cursor

CURSOR cursor_name IS

select_statement;

Open, Fetch&Close

OPEN emp_cursor;

FETCH emp_cursor INTO empno, lname;

CLOSE emp_cursor;

Cursors and Records

emp_record emp_cursor%ROWTYPE;

……

FETCH emp_cursor INTO emp_record;

Cursor FOR Loops

FOR record_name IN cursor_name LOOP

statement1;

statement2;

. . .

END LOOP;

说明:无须显式地打开、fetch、关闭游标。无须定义record_name。

Explicit Cursor Attributes

%ISOPEN, %NOTFOUND, %FOUND, %ROWCOUNT

Cursor FOR Loops Using Subqueries

FOR emp_record IN (SELECT employee_id, last_name

FROM employees WHERE department_id =30)

说明:无须显式声明CURSOR变量。但不能直接引用cursor attributes。

Cursors with Parameters

CURSOR cursor_name

[(parameter_name datatype, ...)]

IS

select_statement;

OPEN cursor_name(parameter_value,.....) ;

说明:一般用于在查询表达式中代入不同的变量值,多用于用同一个cursor先后打开多个不同的结果集。

FOR UPDATE Clause

SELECT ...

FROM ...

FOR UPDATE [OF column_reference][NOWAIT | WAIT n];

显式地锁定某些记录,避免其他会话修改记录导致游标失效。

WHERE CURRENT OF Clause

WHERE CURRENT OF cursor ;

UPDATE employees

SET salary = ...

WHERE CURRENT OF emp_cursor;

与FOR UPDATE合用,一般用于update或delete当前游标所指向的记录。

Handling Exceptions with PL/SQL

抛出异常的两种方式:

– Implicitly by the Oracle server

– Explicitly by the program

处理异常的两种方式:

– By trapping it with a handler

– By propagating it to the calling environment

Exception Types

• Predefined Oracle server Implicitly raised

• Non-predefined Oracle server Implicitly raised

• User-defined Explicitly raised

Trapping Exceptions

EXCEPTION

WHEN exception1 [OR exception2 . . .] THEN

statement1;

statement2;

. . .

[WHEN exception3 [OR exception4 . . .] THEN

statement1;

statement2;

. . .]

[WHEN OTHERS THEN

statement1;

statement2;

. . .]

Trapping Predefined Oracle Server Errors

20种左右预先定义的常见错误,可以在exception模块中直接引用

Sample predefined exceptions:

– NO_DATA_FOUND

– TOO_MANY_ROWS

– INVALID_CURSOR

– ZERO_DIVIDE

– DUP_VAL_ON_INDEX

Trapping Non-Predefined Oracle Server Errors

1. Declare: Name the exception.

insert_excep EXCEPTION;

2. Associate: Use PRAGMA EXCEPTION_INIT.

PRAGMA EXCEPTION_INIT(insert_excep, -01400);

3. Reference: Handle the raised exception.

EXCEPTION

WHEN insert_excep THEN ……

Functions for Trapping Exceptions

SQLCODE, SQLERRM

不能直接在SQL中使用,而必须先赋给一个变量值

Trapping User-Defined Exceptions

1. Declare: Name the exception.

invalid_department EXCEPTION;

2. Raise: Explicitly raise the exception by using the RAISE statement.

RAISE invalid_department;

3. Reference: Handle the raised exception.

EXCEPTION

WHEN invalid_department THEN

Propagating Exceptions in a Subblock

在subblock中直接处理异常或到外层block中处理,在哪一层中处理就跳出哪一层继续执行

One advantage of this behavior is that you can enclose statements that require their own exclusive error handling in their own block, while leaving more general exception handling to the enclosing block.

RAISE_APPLICATION_ERROR Procedure

raise_application_error (error_number, message[, {TRUE | FALSE}]);

error_number在-20000到-20999之间

Procedures and Functions

存储在数据库中,创建时编译一次,以后发生修改才再次编译。

Procedure: Syntax

CREATE [OR REPLACE] PROCEDURE procedure_name

[(argument1 [mode1] datatype1,

argument2 [mode2] datatype2,

. . .)]

IS|AS

procedure_body;

Invoking the Procedure

BEGIN

add_dept;

END;

/

You can also invoke a procedure with the SQL statement CALL .

Function: Syntax

CREATE [OR REPLACE] FUNCTION function_name

[(argument1 [mode1] datatype1,

argument2 [mode2] datatype2,

. . .)]

RETURN datatype

IS|AS

function_body;

Defining REF CURSOR Types

1.定义type(return有无-strong或weak)

TYPE ref_type_name IS REF CURSOR [RETURN return_type];

2.定义变量

ref_cv ref_type_name;

Using the OPEN-FOR, FETCH, and CLOSE Statements

OPEN {cursor_variable | :host_cursor_variable} FOR dynamic_string

[USING bind_argument[, bind_argument]...];

FETCH {cursor_variable | :host_cursor_variable}

INTO {define_variable[, define_variable]... | record};

CLOSE {cursor_variable | :host_cursor_variable};

[@more@]

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/8558093/viewspace-1014419/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
  • 博文量
    34
  • 访问量
    73625