文档库 最新最全的文档下载
当前位置:文档库 › Oracle存储过程异常处理

Oracle存储过程异常处理

Oracle存储过程异常处理
Oracle存储过程异常处理

1、异常的优点

如果没有异常,在程序中,应当检查每个命令的成功还是失败,如

BEGIN

SELECT ...

-- check for ’no data found’ error

SELECT ...

-- check for ’no data found’ error

SELECT ...

-- check for ’no data found’ error

这种实现的方法缺点在于错误处理没有与正常处理分开,可读性差,使用异常,可以方便处理错误,而且异常处理程序与正常的事务逻辑分开,提高了可读性,如BEGIN

SELECT ...

SELECT ...

SELECT ...

...

EXCEPTION

WHEN NO_DATA_FOUND THEN -- catches all ’no data found’ errors

2、异常的分类

有两种类型的异常,一种为内部异常,一种为用户自定义异常,内部异常是执行期间返回到PL/SQL块的ORACLE错误或由PL/SQL代码的某操作引起的错误,如除数为零或内存溢出的情况。用户自定义异常由开发者显示定义,在PL/SQL块中传递信息以控制对于应用的错误处理。

每当PL/SQL违背了ORACLE原则或超越了系统依赖的原则就会隐式的产生内部异常。因为每个ORACLE错误都有一个号码并且在PL/SQL中异常通过名字处理,ORACLE提供了预定义的内部异常。如SELECT INTO 语句不返回行时产生的ORACLE异常NO_DATA_FOUND。对于预定义异常,现将最常用的异常列举如下:

exception oracle error sqlcode value condition

no_data_found ora-01403 +100 select into 语句没有符合条件的记录返回

too_many_rows ora-01422 -1422 select into 语句符合条件的记录有多条返

dup_val_on_index ora-00001 -1 对于数据库表中的某一列,该列已经被限制为唯一索引,程序试图存储两个重复的值

value_error ora-06502 -6502 在转换字符类型,截取或长度受限时,会发生该异常,如一个字符分配给一个变量,而该变量声明的长度比该字符短,就会引发该异常storage_error ora-06500 -6500 内存溢出

zero_divide ora-01476 -1476 除数为零

case_not_found ora-06592 -6530 对于选择case语句,没有与之相匹配的条件,同时,也没有else语句捕获其他的条件

cursor_already_open ora-06511 -6511 程序试图打开一个已经打开的游标

timeout_on_resource ora-00051 -51 系统在等待某一资源,时间超时

如果要处理未命名的内部异常,必须使用OTHERS异常处理器或PRAGMA

EXCEPTION_INIT 。PRAGMA由编译器控制,或者是对于编译器的注释。PRAGMA在编译时处理,而不是在运行时处理。EXCEPTION_INIT告诉编译器将异常名与ORACLE错误码结合起来,这样可以通过名字引用任意的内部异常,并且可以通过名字为异常编写一适当的异常处理器。

在子程序中使用EXCEPTION_INIT的语法如下:

PRAGMA EXCEPTION_INIT(exception_name, -Oracle_error_number);

在该语法中,异常名是声明的异常,下例是其用法:

DECLARE

deadlock_detected EXCEPTION;

PRAGMA EXCEPTION_INIT(deadlock_detected, -60);

BEGIN

... -- Some operation that causes an ORA-00060 error

EXCEPTION

WHEN deadlock_detected THEN

-- handle the error

END;

对于用户自定义异常,只能在PL/SQL块中的声明部分声明异常,异常的名字由EXCEPTION关键字引入:

reserved_loaned Exception

产生异常后,控制传给了子程序的异常部分,将异常转向各自异常控制块,必须在代码中使用如下的结构处理错误:

Exception

When exception1 then

Sequence of statements;

When exception2 then

Sequence of statements;

When others then

3、异常的抛出

由三种方式抛出异常

1.通过PL/SQL运行时引擎

2. 使用RAISE语句

3. 调用RAISE_APPLICATION_ERROR存储过程

当数据库或PL/SQL在运行时发生错误时,一个异常被PL/SQL运行时引擎自动抛出。异常也可以通过RAISE语句抛出

RAISE exception_name;

显式抛出异常是程序员处理声明的异常的习惯用法,但RAISE不限于声明了的异常,它可以抛出任何任何异常。例如,你希望用TIMEOUT_ON_RESOURCE错误检测新的运行时异常处理器,你只需简单的在程序中使用下面的语句:

RAISE TIMEOUT_ON_RESOUCE;

比如下面一个订单输入的例子,若当订单小于库存数量,则抛出异常,并且捕获该异常,处理异常

DECLARE

inventory_too_low EXCEPTION;

---其他声明语句

BEGIN

IF order_rec.qty>inventory_rec.qty THEN

RAISE inventory_too_low;

END IF

EXCEPTION

WHEN inventory_too_low THEN

order_rec.staus:='backordered';

END;

RAISE_APPLICATION_ERROR内建函数用于抛出一个异常并给异常赋予一个错误号以及错误信息。自定义异常的缺省错误号是+1,缺省信息是User_Defined_Exception。

RAISE_APPLICATION_ERROR函数能够在pl/sql程序块的执行部分和异常部分调用,显式抛出带特殊错误号的命名异常。

Raise_application_error(error_number,message[,true,false]))

错误号的范围是-20,000到-20,999。错误信息是文本字符串,最多为2048字节。TRUE 和FALSE表示是添加(TRUE)进错误堆(ERROR STACK)还是覆盖(overwrite)错误堆(FALSE)。缺省情况下是FALSE。

如下代码所示:

IF product_not_found THEN

RAISE_APPLICATION_ERROR(-20123,'Invald product code' TRUE);

END IF;

4、异常的处理

PL/SQL程序块的异常部分包含了程序处理错误的代码,当异常被抛出时,一个异常陷阱就自动发生,程序控制离开执行部分转入异常部分,一旦程序进入异常部分就不能再回到同一块的执行部分。下面是异常部分的一般语法:

EXCEPTION

WHEN exception_name THEN

Code for handing exception_name

[WHEN another_exception THEN

Code for handing another_exception]

[WHEN others THEN

code for handing any other exception.]

用户必须在独立的WHEN子串中为每个异常设计异常处理代码,WHEN OTHERS子串必须放置在最后面作为缺省处理器处理没有显式处理的异常。当异常发生时,控制转到异常部分,ORACLE查找当前异常相应的WHEN..THEN语句,捕捉异常,THEN之后的代码被执行,如果错误陷阱代码只是退出相应的嵌套块,那么程序将继续执行内部块END后面的语句。如果没有找到相应的异常陷阱,那么将执行WHEN OTHERS。在异常部分WHEN 子串没有数量限制。

EXCEPTION

WHEN inventory_too_low THEN

order_rec.staus:='backordered';

replenish_inventory(inventory_nbr=>

inventory_rec.sku,min_amount=>order_rec.qty-inventory_rec.qty);

WHEN discontinued_item THEN

--code for discontinued_item processing

WHEN zero_divide THEN

--code for zero_divide

WHEN OTHERS THEN

--code for any other exception

END;

当异常抛出后,控制无条件转到异常部分,这就意味着控制不能回到异常发生的位置,当异常被处理和解决后,控制返回到上一层执行部分的下一条语句。

BEGIN

DECLARE

bad_credit exception;

BEGIN

RAISE bad_credit;

--发生异常,控制转向;

EXCEPTION

WHEN bad_credit THEN

dbms_output.put_line('bad_credit');

END;

--bad_credit异常处理后,控制转到这里

EXCEPTION

WHEN OTHERS THEN

--控制不会从bad_credit异常转到这里

--因为bad_credit已被处理

END;

当异常发生时,在块的内部没有该异常处理器时,控制将转到或传播到上一层块的异常处理部分。

BEGIN

DECLARE ---内部块开始

bad_credit exception;

BEGIN

RAISE bad_credit;

--发生异常,控制转向;

EXCEPTION

WHEN ZERO_DIVIDE THEN --不能处理bad_credite异常

dbms_output.put_line('divide by zero error');

END --结束内部块

--控制不能到达这里,因为异常没有解决;

--异常部分

EXCEPTION

WHEN OTHERS THEN

--由于bad_credit没有解决,控制将转到这里

END;

5、异常的传播

没有处理的异常将沿检测异常调用程序传播到外面,当异常被处理并解决或到达程序最

外层传播停止。在声明部分抛出的异常将控制转到上一层的异常部分。

BEGIN

executable statements

BEGIN

today DATE:='SYADATE'; --ERRROR

BEGIN --内部块开始

dbms_output.put_line('this line will not execute');

EXCEPTION

WHEN OTHERS THEN

--异常不会在这里处理

END;--内部块结束

EXCEPTION

WHEN OTHERS THEN

处理异常

END

-------------------------------------------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------------------------------------------

处理 oracle 系统自动生成系统异常外,可以使用 raise 来手动生成错误。

l Raise exception;

l Raise package.exception;

l Raise;

以上是 raise 的三种使用方法。第一种用于生成当前程序中定义的异常或在 standard 中的系统异常。

Declare

Invalid_id exception;

Id_values varchar(2);

Begin

Id_value:=id_for(‘smith’);

If substr(id_value,1,1)!=’x’

Then

Raise invalid_id;

End if;

Exception

When invalid_id

Then

Dbms_output.put_line(‘this is an invalid id!’);

End;

这是一个生成自定义异常的例子,当然也可以生成系统异常:

declare

employee_id_in number;

Begin

Select employee_id into employee_id_in from employ_list where employee_name=&n; If employee_id_in=0

Then

Raise zero_devided;

End if;

Exception

When zero_devided

Then

Dbms_output.put_line(‘wrong!’);

End;

有一些异常是定义在非标准包中的,如 UTL_FILE , DBMS_SQL 以及程序员创建的包中异常。可以使用 raise 的第二种用法来生成异常。

If day_overdue(isbn_in, browser_in) > 365

Then

Raise overdue_pkg.book_is_lost

End if;

在最后一种 raise 的形式中,不带任何参数。这种情况只出现在希望将当前的异常传到外部程序时。

Exception

When no_data_found

Then

Raise;

End;

Pl.sql 使用 raise_application_error 过程来生成一个有具体描述的异常。当使用这个过程时,当前程序被中止,输入输出参数被置为原先的值,但任何 DML 对数据库所做的改动将被保留,可以在之后用 rollback 命令回滚。下面是该过程的原型:

Procedure raise_application_error(

Num binary_integer;

Msg varchar2;

Keeperrorstack Boolean default false

)

其中 num 是在 -20999 到 -20000 之间的任何数字(但事实

上, DBMS_OUPUT 和 DBMS_DESCRIBLE 包使用了 -20005 到 -20000 的数字); msg 是小于 2K 个字符的描述语,任何大于 2K 的字符都将被自动丢弃; keeperrorstack 默认

为 false ,是指清空异常栈,再将当前异常入栈,如果指定 true 的话就直接将当前异常压入栈中。

CREATE OR REPLACE PROCEDURE raise_by_language (code_in IN PLS_INTEGER)

IS

l_message error_table.error_string%TYPE;

BEGIN

SELECT error_string

INTO l_message

FROM error_table, v$nls_parameters v

WHERE error_number = code_in

AND string_language = v.VALUE

AND v.parameter = 'NLS_LANGUAGE';

RAISE_APPLICATION_ERROR (code_in, l_message);

END;

ORACL内部异常:

ORA-00001: 违反唯一约束条件 (.)

ORA-00017: 请求会话以设置跟踪事件

ORA-00018: 超出最大会话数

ORA-00019: 超出最大会话许可数

ORA-00020: 超出最大进程数 ()

ORA-00021: 会话附属于其它某些进程;无法转换会话

ORA-00022: 无效的会话 ID;访问被拒绝

ORA-00023: 会话引用进程私用内存;无法分离会话

ORA-00024: 单一进程模式下不允许从多个进程注册

ORA-00025: 无法分配

ORA-00026: 丢失或无效的会话 ID

ORA-00027: 无法删去当前会话

ORA-00028: 您的会话己被删去

ORA-00029: 会话不是用户会话

ORA-00030: 用户会话 ID 不存在。

ORA-00031: 标记要删去的会话

ORA-00032: 无效的会话移植口令

ORA-00033: 当前的会话具有空的移植口令

ORA-00034: 无法在当前 PL/SQL 会话中

ORA-00035: LICENSE_MAX_USERS 不能小于当前用户数

ORA-00036: 超过递归 SQL () 级的最大值

ORA-00037: 无法转换到属于不同服务器组的会话

ORA-00038: 无法创建会话: 服务器组属于其它用户

ORA-00050: 获取入队时操作系统出错

ORA-00051: 等待资源超时

ORA-00052: 超出最大入队资源数 ()

ORA-00053: 超出最大入队数

ORA-00054: 资源正忙,要求指定 NOWAIT

ORA-00055: 超出 DML 锁的最大数

ORA-00056: 对象 '.' 上的 DDL 锁以不兼容模式挂起

ORA-00057: 超出临时表锁的最大数

ORA-00058: DB_BLOCK_SIZE 必须为才可安装此数据库 (非 ) ORA-00059: 超出 DB_FILES 的最大值

ORA-00060: 等待资源时检测到死锁

ORA-00061: 另一个例程设置了不同的 DML_LOCKS

ORA-00062: 无法获得 DML 全表锁定;DML_LOCKS 为 0

ORA-00063: 超出 LOG_FILES 的最大数

ORA-00064: 对象过大以至无法分配在此 O/S (,)

ORA-00065: FIXED_DATE 的初始化失败

ORA-00066: LOG_FILES 为但需要成为才可兼容

ORA-00067: 值对参数无效;至少必须为

ORA-00068: 值对参数无效,必须在和之间

ORA-00069: 无法获得锁定 -- 禁用了表锁定

ORA-00070: 命令无效

ORA-00071: 进程号必须介于 1 和之间

ORA-00072: 进程""不活动

ORA-00073: 命令介于和个参数之间时使用

ORA-00074: 未指定进程

ORA-00075: 在此例程未找到进程 ""

ORA-00076: 未找到转储

ORA-00077: 转储无效

ORA-00078: 无法按名称转储变量

ORA-00079: 未找到变量

ORA-00080: 层次指定的全局区域无效

ORA-00081: 地址范围 [,) 不可读

ORA-00082: 的内存大小不在有效集合 [1], [2], [4] 之内ORA-00083: 警告: 可能损坏映射的 SGA

ORA-00084: 全局区域必须为 PGA, SGA 或 UGA

ORA-00085: 当前调用不存在

ORA-00086: 用户调用不存在

ORA-00087: 命令无法在远程例程上执行

ORA-00088: 共享服务器无法执行命令

ORA-00089: ORADEBUG 命令中无效的例程号

ORA-00090: 未能将内存分配给群集数据库 ORADEBUG 命令

ORA-00091: LARGE_POOL_SIZE 至少必须为

ORA-00092: LARGE_POOL_SIZE 必须大于 LARGE_POOL_MIN_ALLOC ORA-00093: 必须介于和之间

ORA-00094: 要求整数值

ORA-00096: 值对参数无效,它必须来自之间

ORA-00097: 使用 Oracle SQL 特性不在 SQL92 级中

ORA-00099: 等待资源时发生超时,可能是 PDML 死锁所致

ORA-00100: 未找到数据

ORA-00101: 系统参数 DISPATCHERS 的说明无效

ORA-00102: 调度程序无法使用网络协议

ORA-00103: 无效的网络协议;供调度程序备用

ORA-00104: 检测到死锁;全部公用服务器已锁定等待资源

ORA-00105: 未配置网络协议的调度机制

ORA-00106: 无法在连接到调度程序时启动/关闭数据库

ORA-00107: 无法连接到 ORACLE 监听器进程

ORA-00108: 无法设置调度程序以同步进行连接

ORA-00111: 由于服务器数目限制在 , 所以没有启动所有服务器

ORA-00112: 仅能创建多达 (最多指定) 个调度程序

ORA-00113: 协议名过长

ORA-00114: 缺少系统参数 SERVICE_NAMES 的值

ORA-00115: 连接被拒绝;调度程序连接表已满

ORA-00116: SERVICE_NAMES 名过长

ORA-00117: 系统参数 SERVICE_NAMES 的值超出范围

ORA-00118: 系统参数 DISPATCHERS 的值超出范围

ORA-00119: 系统参数的说明无效

ORA-00120: 未启用或安装调度机制

ORA-00121: 在缺少 DISPATCHERS 的情况下指定了 SHARED_SERVERS ORA-00122: 无法初始化网络配置

ORA-00123: 空闲公用服务器终止

ORA-00124: 在缺少 MAX_SHARED_SERVERS 的情况下指定了 DISPATCHERS ORA-00125: 连接被拒绝;无效的演示文稿

ORA-00126: 连接被拒绝;无效的重复

ORA-00127: 调度进程不存在

ORA-00128: 此命令需要调度进程名

ORA-00129: 监听程序地址验证失败 ''

ORA-00130: 监听程序地址 '' 无效

ORA-00131: 网络协议不支持注册 ''

ORA-00132: 语法错误或无法解析的网络名称 ''

ORA-00150: 重复的事务处理 ID

ORA-00151: 无效的事务处理 ID

ORA-00152: 当前会话与请求的会话不匹配

ORA-00153: XA 库中的内部错误

ORA-00154: 事务处理监视器中的协议错误

ORA-00155: 无法在全局事务处理之外执行工作

ORA-00160: 全局事务处理长度超出了最大值 ()

ORA-00161: 事务处理的分支长度非法 (允许的最大长度为 ) ORA-00162: 外部 dbid 的长度超出了最大值 ()

ORA-00163: 内部数据库名长度超出了最大值 ()

ORA-00164: 在分布式事务处理中不允许独立的事务处理

ORA-00165: 不允许对远程操作进行可移植分布式自治转换

ORA-00200: 无法创建控制文件

ORA-00201: 控制文件版本与 ORACLE 版本不兼容

ORA-00202: 控制文件: ''

ORA-00203: 使用错误的控制文件

ORA-00204: 读控制文件时出错 (块,# 块 )

ORA-00205: 标识控制文件出错,有关详情,请检查警告日志

ORA-00206: 写控制文件时出错 (块,# 块 )

ORA-00207: 控制文件不能用于同一数据库

ORA-00208: 控制文件的名称数超出限制

ORA-00209: 控制文件块大小不匹配,有关详情,请检查警告日志ORA-00210: 无法打开指定的控制文件

ORA-00211: 控制文件与先前的控制文件不匹配

ORA-00212: 块大小低于要求的最小大小 ( 字节)

ORA-00213: 不能重新使用控制文件;原文件大小为,还需

ORA-00214: 控制文件 '' 版本与文件 '' 版本不一致

ORA-00215: 必须至少存在一个控制文件

ORA-00216: 无法重新调整从 8.0.2 移植的控制文件大小

ORA-00217: 从 9.0.1 进行移植无法重新调整控制文件的大小

ORA-00218: 控制文件的块大小与 DB_BLOCK_SIZE () 不匹配

ORA-00219: 要求的控制文件大小超出了允许的最大值

ORA-00220: 第一个例程未安装控制文件,有关详情,请检查警告日志ORA-00221: 写入控制文件出错

ORA-00222: 操作将重新使用当前已安装控制文件的名称

ORA-00223: 转换文件无效或版本不正确

ORA-00224: 控制文件重设大小尝试使用非法记录类型 ()

ORA-00225: 控制文件的预期大小与实际大小不同

ORA-00226: 备用控制文件打开时不允许进行操作

ORA-00227: 控制文件中检测到损坏的块: (块,# 块 )

ORA-00228: 备用控制文件名长度超出了最大长度

ORA-00229: 操作不允许: 已挂起快照控制文件入队

ORA-00230: 操作不允许: 无法使用快照控制文件入队

ORA-00231: 快照控制文件未命名

ORA-00232: 快照控制文件不存在, 已损坏或无法读取

ORA-00233: 控制文件副本已损坏或无法读取

ORA-00234: 标识或打开快照或复制控制文件时出错

ORA-00235: 控制文件固定表因并发更新而不一致

ORA-00236: 快照操作不允许: 挂上的控制文件为备份文件

ORA-00237: 快照操作不允许: 控制文件新近创建

ORA-00238: 操作将重用属于数据库一部分的文件名

ORA-00250: 未启动存档器

ORA-00251: LOG_ARCHIVE_DUPLEX_DEST 不能是与字符串相同的目的地ORA-00252: 日志在线程上为空,无法存档

ORA-00253: 字符限制在以内,归档目的字符串超出此限制

ORA-00254: 存档控制字符串 '' 时出错

ORA-00255: 存档日志 (线程 , 序列 # ) 时出错

ORA-00256: 无法翻译归档目的字符串

ORA-00257: 存档器错误。在释放之前仅限于内部连接

ORA-00258: NOARCHIVELOG 模式下的人工存档必须标识日志

ORA-00259: 日志 (打开线程 ) 为当前日志,无法存档

ORA-00260: 无法找到联机日志序列 (线程 )

ORA-00261: 正在存档或修改日志 (线程 )

ORA-00262: 当前日志 (关闭线程 ) 无法切换

ORA-00263: 线程没有需要存档的记录

ORA-00264: 不要求恢复

ORA-00265: 要求例程恢复,无法设置 ARCHIVELOG 模式

ORA-00266: 需要存档日志文件名

ORA-00267: 无需存档日志文件名

ORA-00268: 指定的日志文件不存在 ''

ORA-00269: 指定的日志文件为线程的一部分 (非 )

ORA-00270: 创建存档日志时出错

ORA-00271: 没有需要存档的日志

ORA-00272: 写存档日志时出错

ORA-00273: 未记录的直接加载数据的介质恢复

ORA-00274: 非法恢复选项

ORA-00275: 已经开始介质恢复

ORA-00276: CHANGE 关键字已指定但未给出更改编号

ORA-00277: UNTIL 恢复标志的非法选项

ORA-00278: 此恢复不再需要日志文件 ''

ORA-00279: 更改 (在生成) 对于线程是必需的

ORA-00280: 更改对于线程是按序列 # 进行的

ORA-00281: 不能使用调度进程执行介质恢复

ORA-00282: UPI 调用不被支持,请使用 ALTER DATABASE RECOVER

ORA-00283: 恢复会话因错误而取消

ORA-00284: 恢复会话仍在进行

ORA-00285: TIME 未作为字符串常数给出

ORA-00286: 无可用成员,或成员无有效数据

ORA-00287: 未找到指定的更改编号 (在线程中)

ORA-00288: 要继续恢复,请键入 ALTER DATABASE RECOVER CONTINUE

ORA-00289: 建议:

ORA-00290: 操作系统出现存档错误。请参阅下面的错误

ORA-00291: PARALLEL 选项要求数字值

ORA-00292: 未安装并行恢复功能

ORA-00293: 控制文件与重做日志不同步

ORA-00294: 无效的存档日志格式标识 ''

ORA-00295: 数据文件号无效,必须介于 1 与之间

ORA-00296: 已超出 RECOVER DATAFILE LIST 的最大文件数 ()

ORA-00297: 必须在 RECOVER DATAFILE START 之前指定 RECOVER DATAFILE LIST ORA-00298: 丢失或无效的 TIMEOUT 间隔

ORA-00299: 必须在数据文件上使用文件级介质恢复

ORA-00300: 指定的重做日志块大小非法 - 超出限制

ORA-00301: 添加日志文件 '' 时出错 - 无法创建文件

ORA-00302: 日志超出限制

ORA-00303: 无法处理多次中断的重做

ORA-00304: 请求的 INSTANCE_NUMBER 在使用中

ORA-00305: 日志 (线程 ) 不一致;属于另一个数据库

ORA-00306: 此数据库中的例程限制

ORA-00307: 请求的 INSTANCE_NUMBER 超出限制,最大为

ORA-00308: 无法打开存档日志 ''

ORA-00309: 日志属于错误的数据库

ORA-00310: 存档日志包含序列;要求序列

ORA-00311: 无法从存档日志读取标题

ORA-00312: 联机日志线程 : ''

ORA-00313: 无法打开日志组 (线程 ) 的成员

ORA-00314: 日志 (线程 ),预计序号与不匹配

ORA-00315: 日志 (线程 ),标题中的线程 # 错误

ORA-00316: 日志 (线程 ),标题中的类型不是日志文件ORA-00317: 标题中的文件类型不是日志文件

ORA-00318: 日志 (线程 ),预计文件大小与不匹配

ORA-00319: 日志 (线程 ) 具有错误的日志重置状态

ORA-00320: 无法从日志 (线程 ) 读取文件标题

ORA-00321: 日志 (线程 ),无法更新日志文件标题

ORA-00322: 日志 (线程 ) 不是当前副本

ORA-00323: 线程的当前日志不可用而所有其它日志均需要存档ORA-00324: 日志文件 '' 的翻译名 '' 太长,字符超出限制ORA-00325: 已归档线程的日志,标题中的线程 # 错误

ORA-00326: 日志在更改开始,需要更早的更改

ORA-00327: 日志 (线程 ),实际大小小于需要的

ORA-00328: 归档日志在更改结束,需要稍后的更改

ORA-00329: 归档日志在更改开始,需要更改

ORA-00330: 归档日志在更改结束,需要更改

ORA-00331: 日志版本与 ORACLE 版本不兼容

ORA-00332: 归档日志过小 - 可能未完全归档

ORA-00333: 重做日志读取块计数出错

ORA-00334: 归档日志: ''

ORA-00335: 联机日志 : 没有此编号的日志,日志不存在

ORA-00336: 大小为的日志文件块数小于最小块数

ORA-00337: 日志文件 '' 不存在且未指定大小

ORA-00338: 日志 (线程 ) 比控制文件更新

ORA-00339: 归档日志未包含任何重做

ORA-00340: 处理联机日志 (线程 ) 时出现 I/O 错误

ORA-00341: 日志 (线程 ),标题中的日志 # 错误

ORA-00342: 归档日志在上一个 RESETLOGS 之前创建程序包

ORA-00343: 错误过多,已关闭日志成员

ORA-00344: 无法重新创建联机日志 ''

ORA-00345: 重做日志写入块计数出错

ORA-00346: 日志成员标记为 STALE

ORA-00347: 日志 (线程 ),预计块大小与不匹配

ORA-00348: 单一进程重做失败;必须中止例程

ORA-00349: 无法获得 '' 的块大小

ORA-00350: 日志 (线程 ) 中需要归档

ORA-00351: recover-to 时间无效

ORA-00352: 线程的所有日志均需要归档 - 无法启用

ORA-00353: 日志损坏接近块更改时间

ORA-00354: 损坏重做日志块标题

ORA-00355: 更改编号无次序

ORA-00356: 更改说明中的长度不一致

ORA-00357: 日志文件指定了过多成员,最大为

ORA-00358: 指定了过多文件成员,最大为

ORA-00359: 日志文件组不存在

ORA-00360: 非日志文件成员:

ORA-00361: 无法删除最后一个日志成员 (组 )

ORA-00362: 组成组中的有效日志文件要求输入成员

ORA-00363: 日志不是归档版本

ORA-00364: 无法将标题写入新日志成员

ORA-00365: 指定日志不是正确的下一个日志

ORA-00366: 日志 (线程 ),文件标题中的校验和错误

ORA-00367: 日志文件标题中的校验和错误

ORA-00368: 重做日志块中的校验和错误

ORA-00369: 线程的当前日志不可用且其它日志已被清除

ORA-00370: Rcbchange 操作过程中可能出现死锁

ORA-00371: 共享池内存不足

ORA-00372: 此时无法修改文件

ORA-00373: 联机日志版本与 ORACLE 版本不兼容

ORA-00374: 参数 db_block_size = 无效; 它必须是的倍数, 范围为 [..] ORA-00375: 无法获得默认 db_block_size

ORA-00376: 此时无法读取文件

ORA-00377: 文件的频繁备份导致写操作延迟

ORA-00378: 无法按指定创建缓冲池

ORA-00379: 缓冲池中无法提供 K 块大小的空闲缓冲区

ORA-00380: 无法指定 db_k_cache_size, 因为 K 是标准块大小

ORA-00381: 无法将新参数和旧参数同时用于缓冲区高速缓存的大小说明

ORA-00382: 不是有效的块大小, 有效范围为 [..]

ORA-00383: DEFAULT 高速缓存的块大小不能减少至零

ORA-00384: 没有足够的内存来增加高速缓存的大小

ORA-00385: cannot enable Very Large Memory with new buffer cache parameters ORA-00390: 日志 (线程 ) 正被清除,无法成为当前日志

ORA-00391: 所有线程必须同时转换为新的日志格式

ORA-00392: 日志 (线程 ) 正被清除,不允许操作

ORA-00393: 脱机数据文件的恢复需要日志 (线程 )

ORA-00394: 在尝试存档时重新使用联机日志

ORA-00395: '克隆' 数据库的联机日志必须重命名

ORA-00396: 错误需要退回到单次遍历恢复

ORA-00397: 对于文件 (块 ), 检测到写入丢失情况

ORA-00398: 由于重新配置而中止了线程恢复

ORA-00399: 重做日志中的更改说明已损坏

ORA-00400: 无效的版本值 (对于参数 )

ORA-00401: 此版本不支持参数的值

ORA-00402: 版本的数据库更改无法用于版本

ORA-00403: () 不同于其它例程 ()

ORA-00404: 未找到转换文件: ''

ORA-00405: 兼容类型""

ORA-00406: COMPATIBLE 参数需要为或更大

ORA-00407: 不允许从版本 . 到 . 滚动升级

ORA-00408: 参数设置为 TRUE

ORA-00409: COMPATIBLE 必须是或更高值才能使用 AUTO SEGMENT SPACE MANAGEMENT ORA-00436: 没有 ORACLE 软件使用权,请与 Oracle 公司联系获得帮助

ORA-00437: 没有 ORACLE 软件功能使用权,请与 Oracle 公司联系获得帮助

ORA-00438: 未安装选项

ORA-00439: 未启用特性:

ORA-00443: 背景进程 "" 未启动

ORA-00444: 背景进程 "" 启动时失败

ORA-00445: 背景进程 "" 在秒之后仍没有启动

ORA-00446: 背景进程意外启动

ORA-00447: 背景进程出现致命错误

ORA-00448: 背景进程正常结束

ORA-00449: 背景进程 '' 因错误异常终止

ORA-00470: LGWR 进程因错误而终止

ORA-00471: DBWR 进程因错误而终止

ORA-00472: PMON 进程因错误而终止

ORA-00473: ARCH 进程因错误而终止

ORA-00474: SMON 进程因错误而终止

ORA-00475: TRWR 进程因错误而终止

ORA-00476: RECO 进程因错误而终止

ORA-00477: SNP* 进程因错误而终止

ORA-00478: SMON 进程由于错误终止

ORA-00480: LCK* 进程因错误而终止

ORA-00481: LMON 进程因错误而终止

ORA-00482: LMD* 进程因错误而终止

ORA-00483: 关闭进程过程中异常终止

ORA-00484: LMS* 进程因错误而终止

ORA-00485: DIAG 进程由于错误终止

ORA-00486: 功能不可用

ORA-00568: 超出中断处理程序的最大数

ORA-00574: osndnt: $CANCEL 失败 (中断)

ORA-00575: osndnt: $QIO 失败 (发送 out-of-band 中断) ORA-00576: 带内中断协议错误

ORA-00577: 带外中断协议错误

ORA-00578: 重置协议错误

ORA-00579: osndnt: 服务器收到连接请求格式不正确

ORA-00580: 协议版本不匹配

ORA-00581: osndnt: 无法分配上下文区域

ORA-00582: osndnt: 无法撤消分配上下文区域

ORA-00583: osndnt: $TRNLOG 失败

ORA-00584: 无法关闭连接

ORA-00585: 主机名称格式错误

ORA-00586: osndnt: LIB$ASN_WTH_MBX 失败

ORA-00587: 无法连接到远程主机

ORA-00588: 来自主机的信息过短

ORA-00589: 来自主机的信息数据长度错误

ORA-00590: 来自主机的信息类型错误

ORA-00591: 写入的字节数错误

ORA-00592: osndnt: $QIO 失败 (邮箱队列)

ORA-00593: osndnt: $DASSGN 失败 (网络设备)

ORA-00594: osndnt: $DASSGN 失败 (邮箱)

ORA-00595: osndnt: $QIO 失败 (接收)

ORA-00596: osndnt: $QIO 失败 (发送)

ORA-00597: osndnt: $QIO 失败 (邮箱队列)

ORA-00598: osndnt: $QIO IO 失败 (邮箱读取)

ORA-00600: 内部错误代码,参数: [], [], [], [], [], [], [], [] ORA-00601: 清除锁定冲突

ORA-00602: 内部编程异常错误

ORA-00603: ORACLE 服务器会话因致命错误而终止

ORA-00604: 递归 SQL 层出现错误

ORA-00606: 内部错误代码

ORA-00607: 当更改数据块时出现内部错误

ORA-00701: 无法改变热启动数据库所需的对象

ORA-00702: 引导程序版本 '' 与版本 '' 不一致

ORA-00703: 超出行高速缓存例程锁的最大数

ORA-00704: 引导程序进程失败

ORA-00705: 启动过程中的状态不一致;请在关闭例程后重新启动

ORA-00706: 更改文件 '' 的格式时出错

ORA-00816: 错误信息无法转换

ORA-00900: 无效 SQL 语句

ORA-00901: 无效 CREATE 命令

ORA-00902: 无效数据类型

ORA-00903: 表名无效

ORA-00904: : 无效的标识符

ORA-00905: 缺少关键字

ORA-00906: 缺少左括号

ORA-00907: 缺少右括号

ORA-00908: 缺少 NULL 关键字

2020年(Oracle管理)华为oracle培训教材

(Oracle管理)华为oracle培训教材

SQL语言简介 1、SQL概述 SQL是一种面向数据库的通用数据处理语言规范,能完成以下几类功能:提取查询数据,插入修改删除数据,生成修改和删除数据库对象,数据库安全控制,数据库完整性及数据保护控制。 数据库对象包括表、视图、索引、同义词、簇、触发器、函数、过程、包、数据库链、快照等(表空间、回滚段、角色、用户)。数据库通过对表的操作来管理存储在其中的数据。 1)SQL*PLUS界面: 登录:输入SQLPLUS回车;输入正确的ORACLE用户名并回车;输入用户口令并回车,显示提示符:SQL> 退出:输入EXIT即可。 2)命令的编辑与运行: ●在命令提示符后输入SQL命令并运行,以分号结束输入;以斜杠结束输入;以空行结束输入; ●利用SQL缓冲区进行PL/SQL块的编辑和运行; ●利用命令文件进行PL/SQL块的编辑和运行。 2、数据库查询 1)用SELECT语句从表中提取查询数据。语法为 SELECT[DISTINCT]{column1,column2,…}FROMtablenameWHERE{conditi ons}GROUPBY{conditions}ORDERBY{expressions}[ASC/DESC]; 说明:SELECT子句用于指定检索数据库的中哪些列,FROM子句用于指定从哪一个表或视图中检索数据。

2)SELECT中的操作符及多表查询WHERE子句。(LIKE,IS,…) WHERE子句中的条件可以是一个包含等号或不等号的条件表达式,也可以是一个含有IN、NOTIN、BETWEEN、LIKE、ISNOTNULL等比较运算符的条件式,还可以是由单一的条件表达通过逻辑运算符组合成复合条件。 3)ORDERBY子句 ORDERBY子句使得SQL在显示查询结果时将各返回行按顺序排列,返回行的排列顺序由ORDERBY子句指定的表达式的值确定。 4)连接查询 利用SELECT语句进行数据库查询时,可以把多个表、视图的数据结合起来,使得查询结果的每一行中包含来自多个表达式或视图的数据,这种操作被称为连接查询。 连接查询的方法是在SELECT命令的FROM子句中指定两个或多个将被连接查询的表或视图,并且在WHERE子句告诉ORACLE如何把多个表的数据进行合并。根据WHERE子句中的条件表达式是等还是不等式,可以把连接查询分为等式连接和不等式连接。 5)子查询 如果某一个SELECT命令(查询1)出现在另一个SQL命令(查询2)的一个子句中,则称查询1是查询2的子查询。 3、基本数据类型(NUMBER,VARCHAR2,DATE)O RACEL支持下列内部数据类型: ●VARCHAR2变长字符串,最长为2000字符。 ●NUMBER数值型。

ORACLE存储过程

ORACLE提供了四种类型的可存储的程序: 函数, 过程. 包,触发器 一.声明部分(Declarationsection) (1)声明部分包含了变量和常量的数据类型和初始值 (2)这个部分是由关键字DECLARE开始 (3)如果不需要声明变量或常量,那么可以忽略这一部分; 二.执行部分(Executablesection) (1)执行部分是PL/SQL块中的指令部分, (2)由关键字BEGIN开始,所有的可执行语句都放在这一部分,其他的PL/SQL块也可以放在这一部分。 三.异常处理部分(Exceptionsection) 这一部分是可选的,在这一部分中处理异常或错误。 过程存储过程是一个PL/SQL程序块,接受零个或多个参数作为输入(INPUT)或输出(OUTPUT)、或既作输入又作输出(INOUT),与函数不同,存储过程没有返回值,存储过程不能由SQL语句直接使用,只能通过EXECUT命令或PL/SQL程序块内部调用。 1.创建存储过程 CREATE[ORREPLACE]PROCEDURE过程名 (参数1{IN/OUT/INOUT}类型, 参数2{IN/OUT/INOUT}类型, …….

参数N{IN/OUT/INOUT}类型, )IS/AS 过程体 BEGIN END存储过程名字 说明: (1)ORREPLACE关键字可选,但一般会使用,功能为如果同名的过程已存在,则删除同名过程,然后重建,以此来实现修改过程的目的。 (2)过程可以包括多个参数,参数模式有IN/OUT/INOUT三种,默认为IN,也可以没参数。 (3)IS/AS键字也等价 (4)过程体为该过程的代码部分,是一个含有声明部分,执行部分和异常处理部分的PL/SQL块。但需要注意的是,在过程的声明体中不能使用DECLARE关键字,由IS或AS来代替。 注意事项: 1,存储过程参数不带取值范围,in表示传入,out表示输出 类型可以使用任意Oracle中的合法类型。 2,变量带取值范围,后面接分号 3,在判断语句前最好先用count(*)函数判断是否存在该条操作记录 4,用select。。。into。。。给变量赋值 5,在代码中抛异常用raise+异常名 2.查看过程

oracle存储过程讲解及实例

存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR REPLACE PROCEDURE 是一个SQL语句通知Oracle数据库去创建一个叫做skeleton存储过程, 如果存在就覆盖它; 行2: IS关键词表明后面将跟随一个PL/SQL体。 行3: BEGIN关键词表明PL/SQL体的开始。 行4: NULL PL/SQL语句表明什么事都不做,这句不能删去,因为PL/SQL体中至少需要有一句; 行5: END关键词表明PL/SQL体的结束

存储过程创建语法: create or replace procedure 存储过程名(param1 in type,param2 out type) as 变量1 类型(值范围); --vs_msg VARCHAR2(4000); 变量2 类型(值范围); Begin Select count(*) into 变量1 from 表A where列名 =param1; If (判断条件) then Select 列名into 变量2 from 表A where列名 =param1; Dbms_output。Put_line(‘打印信息’); Elsif (判断条件) then Dbms_output。Put_line(‘打印信息’); Else Raise 异常名(NO_DATA_FOUND); End if; Exception When others then Rollback;

End; 注意事项: 1,存储过程参数不带取值范围,in表示传入,out表示输出 类型可以使用任意Oracle中的合法类型。 2,变量带取值范围,后面接分号 3,在判断语句前最好先用count(*)函数判断是否存在该条操作记录 4,用select 。。。into。。。给变量赋值 5,在代码中抛异常用 raise+异常名 CREATE OR REPLACE PROCEDURE存储过程名 ( --定义参数 is_ym IN CHAR(6) ,

oracle-存储过程练习题

1.创建用户kaifa(密码亦为kaifa),并分配connect,create table,resource权限。 CREATE user KAIFA IDENTIFIED BY KAIFA DEFAULT TABLESPACE HOSDATA TEMPOARY TABLESPACE TEMPDATA; GRANT CONNECT , CREATE TABLE , RESOURCE TO KAIFA 2.在做报表统计时,需要根据报表日期和币种从概要表中查询本期余额。 概要表(CCB_GYB)信息如下: --RMB 人民币 --CNY 本位币 --USD 外币折美元 如果币种为RMB,则取出人民币余额作为本期余额;为CNY,则取本位币余额;为USD 则取外币折美元余额。 请编写一个函数GetCurrBal( qrp_rq IN VARCHAR2, --报表日期 qrp_code IN VARCHAR2--币种 ) CREATE OR REPLACE FUNCTION GetCurrBal( Vqrp_rq Date , --报表日期 Vqrp_code VARCHAR2--币种 ) RETURN NUMBER IS VAMOUNT NUMBER ; VDATE Date; BEGIN SELECT ACCOUNTING_DATE INTO VDATE FROM CCB_GYB Where ACCOUNTING_DATE = Vqrp_rq; IF Vqrp_code = 'RMB'THEN SELECT RMB_YTD_BALANCE INTO VAMOUNT FROM CCB_GYB WHERE Vqrp_code= 'RMB' AND ACCOUNTING_DATE= VDATE; ELSE IF Vqrp_code = 'CNY'THEN SELECT CNY_YTD_BALANCE INTO VAMOUNT FROM CCB_GYB WHERE Vqrp_code= 'CNY';

oracle实验--存储过程

实验八存储过程的使用 一、实验目的 1、熟练掌握存储过程的定义及使用 二、实验要求 1、实验前做好上机实验的准备,针对实验内容,认真复习与本次实验有关的知识,完成 实验内容的预习准备工作; 2、能认真独立完成实验内容; 3、实验后做好实验总结,根据实验情况完成实验报告。 三、实验内容 创建图书管理库的图书、读者和借阅三个基本表的表结构: 图书表: BOOK ( BOOK_ID NUMBER(10), SORT V ARCHAR2(10), BOOK_NAME V ARCHAR2(50), WRITER V ARCHAR2(10), OUTPUT V ARCHAR2(50), PRICE NUMBER(3)); 读者表 READER ( READER_ID NUMBER(3), COMPANY V ARCHAR2(10), NAME V ARCHAR2(10), SEX V ARCHAR2(2), GRADE V ARCHAR2(10), ADDR V ARCHAR2(50)); 借阅表 BORROW ( READER_ID NUMBER(3),

BOOK_ID NUMBER(10), BORROW_DA TE DA TE); 插入数据: BOOK表: insert into book values(445501,'TP3/12','数据库导论','王强','科学出版社',17.90); insert into book values(445502,'TP3/12','数据库导论','王强','科学出版社',17.90); insert into book values(445503,'TP3/12','数据库导论','王强','科学出版社',17.90); insert into book values(332211,'TP5/10','计算机基础','李伟','高等教育出版社',18.00); insert into book values(112266,'TP3/12','FoxBASE','张三','电子工业出版社',23.60); insert into book values(665544,'TS7/21','高等数学','刘明','高等教育出版社',20.00); insert into book values(114455,'TR9/12','线性代数','孙业','北京大学出版社',20.80); insert into book values(113388,'TR7/90','大学英语','胡玲','清华大学出版社',12.50); insert into book values(446601,'TP4/13','数据库基础','马凌云','人民邮电出版社',22.50); insert into book values(446602,'TP4/13','数据库基础','马凌云','人民邮电出版社',22.50); insert into book values(446603,'TP4/13','数据库基础','马凌云','人民邮电出版社',22.50); insert into book values(449901,'TP4/14','FoxPro大全','周虹','科学出版社',32.70); insert into book values(449902,'TP4/14','FoxPro大全','周虹','科学出版社',32.70); insert into book values(118801,'TP4/15','计算机网络','黄力钧','高等教育出版社',21.80); insert into book values(118802,'TP4/15','计算机网络','黄力钧','高等教育出版社',21.80); READER表: insert into reader values(111,'信息系','王维利','女','教授','1号楼424'); insert into reader values(112,'财会系','李立','男','副教授','2号楼316'); insert into reader values(113,'经济系','张三','男','讲师','3号楼105'); insert into reader values(114,'信息系','周华发','男','讲师','1号楼316'); insert into reader values(115,'信息系','赵正义','男','工程师','1号楼224'); insert into reader values(116,'信息系','李明','男','副教授','1号楼318'); insert into reader values(117,'计算机系','李小峰','男','助教','1号楼214'); insert into reader values(118,'计算机系','许鹏飞','男','助工','1号楼216'); insert into reader values(119,'计算机系','刘大龙','男','教授','1号楼318'); insert into reader values(120,'国际贸易','李雪','男','副教授','4号楼506'); insert into reader values(121,'国际贸易','李爽','女','讲师','4号楼510'); insert into reader values(122,'国际贸易','王纯','女','讲师','4号楼512'); insert into reader values(123,'财会系','沈小霞','女','助教','2号楼202'); insert into reader values(124,'财会系','朱海','男','讲师','2号楼210'); insert into reader values(125,'财会系','马英明','男','副教授','2号楼212'); BORROW表:

oracle存储过程学习经典[语法实例调用]

Oracl e 存储过程学习 目录 Oracle 存储过程1 Oracle存储过程基础知识1 Oracle存储过程的基本语法2 关于Oracle存储过程的若干问题备忘4 1.在Oracle中,数据表别名不能加as。5 2.在存储过程中,select某一字段时,后面必须紧跟into,如果select整个记录,利用 游标的话就另当别论了。5 3.在利用select...into...语法时,必须先确保数据库中有该条记录,否则会报出"no data found"异常。5 4.在存储过程中,别名不能和字段名称相同,否则虽然编译可以通过,但在运行阶段 会报错5 5.在存储过程中,关于出现null的问题5 6.Hibernate调用Oracle存储过程6 用Java调用Oracle存储过程总结6 一、无返回值的存储过程6 二、有返回值的存储过程(非列表)8 三、返回列表10 在存储过程中做简单动态查询11 一、本地动态SQL12 二、使用DBMS_SQL包14 Oracle存储过程调用Java方法16 Oracle高效分页存储过程实例17 Oracle存储过程基础知识 商业规则和业务逻辑可以通过程序存储在Oracle中,这个程序就是存储过程。 存储过程是SQL, PL/SQL, Java 语句的组合,它使你能将执行商业规则的代码从你的应用程序中移动到数据库。这样的结果就是,代码存储一次但是能够被多个程序使用。 要创建一个过程对象(procedural object),必须有CREATE PROCEDURE 系统权限。如果这个过程对象需要被其他的用户schema 使用,那么你必须有CREATE ANY PROCEDURE 权限。执行procedure 的时候,可能需要excute权限。或者EXCUTE ANY PROCEDURE 权限。如果单独赋予权限,如下例所示: grant execute on MY_PROCEDURE to Jelly 调用一个存储过程的例子: execute MY_PROCEDURE( 'ONE PARAMETER'); 存储过程(PROCEDURE)和函数(FUNCTION)的区别。

如何在Oracle中使用Java存储过程(详解)

如何在Oracle中使用Java存储过程 (详解) 一、如何缔造java存储过程? 通常有三种步骤来缔造java存储过程。 1. 使用oracle的sql语句来缔造: e.g. 使用create or replace and compile java source named "" as 后边跟上java源程序。要求类的步骤必须是public static的,威力用于存储过程。 1.SQL> create or replace and compile java source named "javademo1 " 2. as 3. import java.sql.*; 4. public class JavaDemo1 5. { 6. public static void main(String[] argv) 7. { 8. System.out.println("hello, java demo1"); 9. } 10. } 11. / 12. 13.Java 已 14. 15.缔造。 16. 17.SQL> show errors java source "javademo1" 18.没有 19. 20.舛误。 21. 22.SQL> create or replace procedure javademo1 23. 2 as 24.3 language java name JavaDemo1.main(https://www.wendangku.net/doc/1f13990307.html,ng.String[]); 25. 4 / 26. 27.过程已 28.

30. 31.SQL> set serveroutput on 32.SQL> call javademo1(); 33. 34.调用 35.实现。 36. 37.SQL> call dbms_java.set_output(5000); 38. 39.调用 40.实现。 41. 42.SQL> call javademo1(); 43.hello, java demo1 44. 45.调用 46.实现。 47. 48.SQL> call javademo1(); 49.hello, java demo1 50.调用 51.实现。 2. 使用外部class文件来装载缔造 e.g. 这里既然用到了外部文件,必定要将class文件放到oracle Server 的某一目录下边。 1.public class OracleJavaProc 2.{ 3. public static void main(String[] argv) 4. { 5. System.out.println("Its a Java Oracle procedure."); 6. } 7.} 8. 9. 10.SQL> grant create any directory to scott; 11. 12.授权 13.顺利。 14. 15.SQL> conn scott/tiger@iihero.oracledb

Oracle+PlSql存储过程 学习文档

Oracl e 存储过程 目录 Oracle 存储过程 (1) Oracle存储过程基础知识 (1) Oracle存储过程的基本语法 (2) 关于Oracle存储过程的若干问题备忘 (4) 1. 在Oracle中,数据表别名不能加as。 (4) 2. 在存储过程中,select某一字段时,后面必须紧跟into,如果select整个记录,利 用游标的话就另当别论了。 (5) 3. 在利用select...into...语法时,必须先确保数据库中有该条记录,否则会报出"no data found"异常。 (5) 4. 在存储过程中,别名不能和字段名称相同,否则虽然编译可以通过,但在运行阶段 会报错 (5) 5. 在存储过程中,关于出现null的问题 (5) 6. Hibernate调用Oracle存储过程 (6) 用Java调用Oracle存储过程总结 (6) 一、无返回值的存储过程 (6) 二、有返回值的存储过程(非列表) (8) 三、返回列表 (9) 在存储过程中做简单动态查询 (11) 一、本地动态SQL (12) 二、使用DBMS_SQL包 (13) Oracle存储过程调用Java方法 (16) Oracle高效分页存储过程实例 (17) Oracle存储过程基础知识 商业规则和业务逻辑可以通过程序存储在Oracle中,这个程序就是存储过程。 存储过程是SQL, PL/SQL, Java 语句的组合,它使你能将执行商业规则的代码从你的应用程序中移动到数据库。这样的结果就是,代码存储一次但是能够被多个程序使用。 要创建一个过程对象(procedural object),必须有CREATE PROCEDURE 系统权限。如果这个过程对象需要被其他的用户schema 使用,那么你必须有CREATE ANY PROCEDURE 权限。执行procedure 的时候,可能需要excute权限。或者EXCUTE ANY PROCEDURE 权限。如果单独赋予权限,如下例所示: grant execute on MY_PROCEDURE to Jelly 调用一个存储过程的例子: execute MY_PROCEDURE( 'ONE PARAMETER'); 存储过程(PROCEDURE)和函数(FUNCTION)的区别。

oracle存储过程例子

oracle存储过程学习过程 一直没有使用过存储过程 今天特意学习一下oracle的存储过程 一步一步学习,今天学习如下: 建立一个最简单的存储过程 create or replace procedure test_xg_p1 is begin dbms_output.put_line('hello world! this is the first procedure'); end; 建立一个带输入输出参数的存储过程:把输入的数据传给输出参数 create or replace procedure test_xg_p2(a in number,x out number) is begin x:=a; end test_xg_p2; 建立一个逻辑判断的存储过程,并包含输入输出参数:近似分数的登记判断create or replace procedure test_xg_p3(a in number,x out varchar2) is begin if a>=90 then begin x := 'A'; end; end if; if a<90 then begin x:='B'; end; end if; if a<80 then begin x:='C'; end; end if; if a<70 then begin x:='D'; end; end if; if a<60 then begin x:='E'; end; end if; end test_xg_p3; 建立一个带循环逻辑的存储过程:近似累加函数

create or replace procedure test_xg_p4(a in number,x out varchar2) is tempresult number(16); begin tempresult :=0; for tempa in 0..a loop begin tempresult := tempresult + tempa; end; end loop; x:=tempresult; end test_xg_p4; 建立一个能从数据库中特定表中返回数据的存储过程: create or replace procedure test_xg_p5(x out varchar2) is tempresult varchar2(1024); begin tempresult := 'start->'; select hotelid||hotelname into tempresult from hotel where hotelid =10041764; x:=tempresult; end test_xg_p5; 建立一个能使用游标的带循环的存储过程: create or replace procedure test_xg_p6(x out varchar2) is tempresult varchar2(10240); cursor cursor1 is select * from hotel where hotelname like '浙江%'; begin tempresult := 'start->'; for cursor_result in cursor1 loop begin tempresult :=tempresult||cursor_result.hotelid||cursor_result.hotelname; end; end loop; x:=tempresult; end test_xg_p6;

Oracle存储过程基本结构

1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程名字 ( 参数1 IN NUMBER, 参数2 IN NUMBER ) IS 变量1 INTEGER :=0; 变量2 DATE; BEGIN END 存储过程名字 2.SELECT INTO STATEMENT 将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条 记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND) 例子: BEGIN

SELECT col1,col2 into 变量1,变量2 FROM typestruct wher e xxx; EXCEPTION WHEN NO_DATA_FOUND THEN xxxx; END; ... 3.IF 判断 IF V_TEST=1 THEN BEGIN do something END; END IF; 4.while 循环 WHILE V_TEST=1 LOOP BEGIN

XXXX END; END LOOP; 5.变量赋值 V_TEST := 123; 6.用for in 使用cursor ... IS CURSOR cur IS SELECT * FROM xxx; BEGIN FOR cur_result in cur LOOP BEGIN V_SUM :=cur_result.列名1+cur_result.列名2 END; END LOOP;

END; 7.带参数的cursor CURSOR C_USER(C_ID NUMBER) IS SELECT NAME FROM USER WHE RE TYPEID=C_ID; OPEN C_USER(变量值); LOOP FETCH C_USER INTO V_NAME; EXIT FETCH C_USER%NOTFOUND; do something END LOOP; CLOSE C_USER; 8.用pl/sql developer debug 连接数据库后建立一个Test WINDOW 在窗口输入调用SP的代码,F9开始debug,CTRL+N单步调试 关于oracle存储过程的若干问题备忘 1.在oracle中,数据表别名不能加as,如:

Oracle存储过程基本语法

Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR REPLACE PROCEDURE 是一个SQL语句通知Oracl e数据库去创建一个叫做skeleton存储过程, 如果存在就覆盖它;行2: IS关键词表明后面将跟随一个PL/SQL体。 行3: BEGIN关键词表明PL/SQL体的开始。 行4:

NULL PL/SQL语句表明什么事都不做,这句不能删去,因为PL /SQL体中至少需要有一句; 行5: END关键词表明PL/SQL体的结束 存储过程创建语法: create or replace procedure 存储过程名(param1 in t ype,param2 out type) as 变量1 类型(值范围); --vs_msg VARCHAR2(4000); 变量2 类型(值范围); Begin Select count(*) into 变量1 from 表A where列名=param1; If (判断条件) then Select 列名into 变量2 from 表A where 列名=param1; Dbms_output。Put_line(‘打印信息’);

Elsif (判断条件) then Dbms_output。Put_line(‘打印信息’); Else Raise 异常名(NO_DATA_FOUND); End if; Exception When others then Rollback; End; 注意事项: 1,存储过程参数不带取值范围,in表示传入,out表示输出类型可以使用任意Oracle中的合法类型。 2,变量带取值范围,后面接分号

oracle存储过程的详细列子说明加分析

文章分类:数据库存储过程创建语法: (1)无参 create or replace procedure 存储过程名as 变量1类型(值范围); 变量2类型(值范围); Begin Excepti on End; (2)带参 create or replace procedure 存储过程名(param1 in type,param2 out type)as 变量1类型(值范围); 变量2类型(值范围); Begin Select count(*) into 变量1 from 表A where 列名=param1 ; If (判断条件)then Select 列名into 变量2 from 表A where 列名=param1; Dbms_output.Put_line(打印信息'); Elseif (判断条件)then Dbms_output.Put_line(打印信息'); Else Raise 异常名(NO DATA FOUND); End if; Excepti on When others the n Rollback; End; 注意事项: 1,存储过程参数不带取值范围,in表示传入,out表示输出

2, 变量带取值范围,后面接分号 3, 在判断语句前最好先用count ( *)函数判断是否存在该条操作记录 4, 用select。。。into。。。给变量赋值 5,在代码中抛异常用raise+异常名 以命名的异常 命名的系统异常产生原因 ACCESS INTO NULL 未定义对象 CASE_NOT_FOUND CASE中若未包含相应的WHEN,并且没有设置 ELSE 时 COLLECTION_IS_NULL 集合元素未初始化 CURSER ALREADY OPEN 游标已经打开 DUP VAL ON INDEX 唯一索引对应的列上有重复的值 INVALID_CURSOR 在不合法的游标上进行操作 INVALID_NUMBER 内嵌的SQL语句不能将字符转换为数字 NO_DATA_FOUND 使用select into未返回行,或应用索引表未初始化的 TOO MANY ROWS 执行select into时,结果集超过一行ZERO_DIVIDE 除数为0 SUBSCRIPT_BEYOND_COUNT 元素下标超过嵌套表或VARRAY的最大值

oracle存储过程函数汇总().docx

oracle存储过程函数汇总() Character function return character value These functions all received is the character parameter type group (except CHR) and returns the character value? In addition to the special instructions, the function returns VARCHAR2 most numerical types? The restrictions on the return type of the character function are the same as those for the basic database type? The maximum value of character variable storage: The VARCHAR2 value is limited to 2000 characters (ORACLE 8 to 4000 characters) The CHAR value is limited to 255 characters (0RACLE8 2000) The long type is 2GB The Clob type is 4GB 1,CHR Syntax: Chr (x) Function: return in the database character set with numerical equivalence with the character of X. CHR and ASCII are a pair of inverse functions? After CHR conversion character after ASCII conversion and obtained the original word

Oracle数据库中存储过程的学习实例

测试用表student: 1.实例1:Oracle存储过程返回结果集 --声明一个package create or replace package package_pro_test as type cursor_rs is ref cursor; Procedure proc_test(p_rs out cursor_rs); end package_pro_test; --实现package体,创建存储过程 -- IN 和OUT 参数 --java将IN 参数传给 CallableStatement 对象是通过 setXXX 方法完成 --的。该方法继承自 --PreparedStatement。所传入参数的类型决定了所用的setXXX 方法 --(例如,用 setFloat 来传入float 值等)。 CREATE OR REPLACE Package Body PACKAGE_PRO_TEST Is Procedure proc_test(p_rs out cursor_rs) is begin open p_rs for'select * from student'; end proc_test; end PACKAGE_PRO_TEST; //java中调用存储过程 import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager;

import java.sql.ResultSet; import java.sql.Statement; import oracle.jdbc.OracleResultSet; /*** * 调用存储过程获取查询结果集 * @author gwy **/ public class Test1 { public static void main(String[] args) { Connection conn = null; Statement stmt = null; ResultSet rs = null; try { Class.forName("oracle.jdbc.driver.OracleDriver"); conn = DriverManager.getConnection( "jdbc:oracle:thin:@localhost:1521:orcl", "scott", "tiger"); System.out.println("连接成功!"); //核心代码: /** * 通过call调用PACKAGE_PRO_TEST.proc_test存储过程。通过数据库连接对象 * conn调用prepareCall()方法创建CallableStatement对象。 * 存储过程调用形式:①conn.prepareCall(“call 存储过程名(?,?,…)”)

oracle存储过程基本语法

oracle 存储过程的基本语法及注意事项 oracle 存储过程的基本语法 1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程名字 ( 参数1 IN NUMBER, 参数2 IN NUMBER ) IS 变量1 INTEGER :=0; 变量2 DATE; BEGIN END 存储过程名字 2.SELECT INTO STATEMENT 将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条 记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND) 例子: BEGIN SELECT col1,col2 into 变量1,变量2 FROM typestruct where xxx; EXCEPTION WHEN NO_DATA_FOUND THEN xxxx; END; ... 3.IF 判断 IF V_TEST=1 THEN BEGIN do something END; END IF;

4.while 循环 WHILE V_TEST=1 LOOP BEGIN XXXX END; END LOOP; 5.变量赋值 V_TEST := 123; 6.用for in 使用cursor ... IS CURSOR cur IS SELECT * FROM xxx; BEGIN FOR cur_result in cur LOOP BEGIN V_SUM :=cur_result.列名1+cur_result.列名2 END; END LOOP; END; 7.带参数的cursor CURSOR C_USER(C_ID NUMBER) IS SELECT NAME FROM USER WHERE TYPEID=C_ID; OPEN C_USER(变量值); LOOP FETCH C_USER INTO V_NAME; EXIT FETCH C_USER%NOTFOUND; do something END LOOP; CLOSE C_USER; 8.用pl/sql developer debug

oracle存储过程(语法实例)

Oracl e 存储过程学习资料(内部适用) 目录 Oracle 存储过程1 Oracle存储过程基础知识2 Oracle存储过程的基本语法3 关于Oracle存储过程的若干问题备忘5 1.在Oracle中,数据表别名不能加as。5 2.在存储过程中,select某一字段时,后面必须紧跟into,如果select整个记录,利用 游标的话就另当别论了。5 3.在利用select...into...语法时,必须先确保数据库中有该条记录,否则会报出"no data found"异常。5 4.在存储过程中,别名不能和字段名称相同,否则虽然编译可以通过,但在运行阶段会 报错5 5.在存储过程中,关于出现null的问题6 6.Hibernate调用Oracle存储过程6 用Java调用Oracle存储过程总结6 一、无返回值的存储过程7 二、有返回值的存储过程(非列表)8 三、返回列表10 在存储过程中做简单动态查询11 一、本地动态SQL12 二、使用DBMS_SQL包14 Oracle存储过程调用Java方法16 Oracle高效分页存储过程实例17

Oracle存储过程基础知识 商业规则和业务逻辑可以通过程序存储在Oracle中,这个程序就是存储过程。 存储过程是SQL, PL/SQL, Java 语句的组合,它使你能将执行商业规则的代码从你的应用程序中移动到数据库。这样的结果就是,代码存储一次但是能够被多个程序使用。 要创建一个过程对象(procedural object),必须有CREATE PROCEDURE 系统权限。如果这个过程对象需要被其他的用户schema 使用,那么你必须有CREATE ANY PROCEDURE 权限。执行procedure 的时候,可能需要excute权限。或者EXCUTE ANY PROCEDURE 权限。如果单独赋予权限,如下例所示: grant execute on MY_PROCEDURE to Jelly 调用一个存储过程的例子: execute MY_PROCEDURE( 'ONE PARAMETER'); 存储过程(PROCEDURE)和函数(FUNCTION)的区别。function有返回值,并且可以直接在Query中引用function和或者使用function的返回值。 本质上没有区别,都是PL/SQL 程序,都可以有返回值。最根本的区别是:存储过程是命令, 而函数是表达式的一部分。比如: select max(NAME) FROM 但是不能exec max(NAME) 如果此时max是函数。 PACKAGE是function,procedure,variables 和sql 语句的组合。package允许多个procedure使用同一个变量和游标。 创建procedure的语法: 可以使用create or replace procedure 语句,这个语句的用处在于,你之前赋予的excute 权限都将被保留。 IN, OUT, IN OUT用来修饰参数。 IN 表示这个变量必须被调用者赋值然后传入到PROCEDURE进行处理。 OUT 表示PRCEDURE 通过这个变量将值传回给调用者。 IN OUT 则是这两种的组合。

相关文档
相关文档 最新文档