oracle存储过程创建语法及常见异常

oracle存储过程创建语法及常见异常:

oracle存储过程语法:

CREATE[ORReplace]PROCEDURE[schema.]procedure_name

  [(argument[{IN|OUT|INOUT}]datatype,

  ...

  argument[{IN|OUT|INOUT}]datatype)]

  {IS|AS}

  [descriptionpart说明部分]

  BEGIN

  SQLSTATEMENT语句序列

  [EXCEPTION例外处理]

  END[procedureName过程名];

oracle存储过程

www.MyException.Cn  网友分享于:2015-02-04  浏览:14746次

一,oracle存储过程语法

1.oracle存储过程结构

CREATE OR REPLACE
PROCEDURE oracle存储过程名字

(

参数1 IN NUMBER,

参数2 IN NUMBER

) IS

变量1
INTEGER :=0;

变量2
DATE;

BEGIN

END oracle存储过程名字

2.无返回值的oracle存储过程

create or replace
procedure xs_proc_no is

begin

insert into xuesheng values (3, ‘wangwu‘, 90,
90);

commit;

end xs_proc_no;

3.有单个数据值返回的oracle存储过程

create or replace
procedure xs_proc(temp_name in varchar2,

temp_num  out number) is

num_1 number;

num_2 number;

begin

select yu_wen, shu_xue

into num_1, num_2

from xuesheng

where xing_ming = temp_name;

--dbms_output.put_line(num_1 + num_2);

temp_num := num_1 + num_2;

end;

其中,以上两种与sql server基本类似,而对于返回数据集时,上述方法则不能满足我们的要求。在Oracle中,一般使用ref cursor来返回数据集。示例代码如下:

4.有返回值的oracle存储过程(列表返回)

首先,建立我们自己的包。并定义包中的一个自定义ref cursor

create or replace
package mypackage as

type my_cursor is ref cursor;

end mypackage;

在定义了ref
cursor后,可以书写我们的程序代码

create or replace
procedure xs_proc_list(shuxue   in
number,

p_cursor out mypackage.my_cursor) is

begin

open p_cursor for

select * from xuesheng where shu_xue >
shuxue;

end xs_proc_list;

5.SELECT INTO
STATEMENT

将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条

记录,否则抛出异常(若没有记录则抛出NO_DATA_FOUND)

例子:

BEGIN

SELECT name,age into 变量1,变量2 FROM user where xxx;

EXCEPTION

WHEN NO_DATA_FOUND THEN

xxxx;

END;

...

6.IF 判断

IF V_TEST=1 THEN

BEGIN

do something

END;

END IF;

7.WHILE 循环

WHILE V_TEST=1 LOOP

BEGIN

XXXX

END;

END LOOP;

8.变量赋值

V_TEST := 123;

9.用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;

10.带参数的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;

11.用pl/sql developer debug

连接数据库后建立一个Test WINDOW

在窗口输入调用SP的代码,F9开始debug,CTRL+N单步调试

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(‘打印信息’);

Elsif (判断条件) then

Dbms_output。Put_line(‘打印信息’);

Else

Raise 异常名(NO_DATA_FOUND);

End if;

Exception

When others then

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 的最大值

SUBSCRIPT_OUTSIDE_LIMIT       使用嵌套表或 VARRAY
时,将下标指定为负数

VALUE_ERROR                             赋值时,变量长度不足以容纳实际数据

LOGIN_DENIED                           PL/SQL 应用程序连接到 oracle 数据库时,提供了不

正确的用户名或密码

NOT_LOGGED_ON                       PL/SQL 应用程序在没有连接 oralce 数据库的情况下

访问数据

PROGRAM_ERROR                       PL/SQL 内部问题,可能需要重装数据字典& pl./SQL

系统包

ROWTYPE_MISMATCH                宿主游标变量与
PL/SQL 游标变量的返回类型不兼容

SELF_IS_NULL                             使用对象类型时,在 null 对象上调用对象方法

STORAGE_ERROR                        运行 PL/SQL 时,超出内存空间

SYS_INVALID_ID                         无效的 ROWID 字符串

TIMEOUT_ON_RESOURCE         Oracle 在等待资源时超时

原文地址:https://www.cnblogs.com/heartwarming/p/10372708.html

时间: 2024-11-10 13:27:03

oracle存储过程创建语法及常见异常的相关文章

Oracle存储过程基本语法介绍

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语句表明什么事都不做,这句不能删

Oracle存储过程基本语法 存储过程

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语句表明什么事都不做,这句不能删

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

(转)Oracle存储过程基本语法

本文转载自:http://www.cnblogs.com/hero4china/articles/base_rule_oracle_procedure.html 存储过程 1  CREATE OR REPLACE PROCEDURE 存储过程名 2  IS 3  BEGIN 4  NULL; 5  END; 行1: CREATE OR REPLACE PROCEDURE 是一个SQL语句通知Oracle数据库去创建一个叫做skeleton存储过程, 如果存在就覆盖它; 行2: IS关键词表明后面

Oracle存储过程function语法及案例

create or replace function F01_SX03_SUM(statdate varchar2, code varchar2, para varchar2) RETURN number IS v_me number; v_mb number; begin if para = 'me' then select nvl(sum(nvl(me, 0)), 0) / 10000 into v_me from sx03_gl_accass t where t.ccode like (c

Oracle存储过程Procedure语法及案例

create or replace procedure replace(desstr in varchar2, replacestr in varchar2, tablename in varchar2, strgranularity in varchar2, strorgankey in varchar2, strstatisticdate in date) is begin update t41_systemcal_upday t1 set t1.calchar = replace(t1.c

ORACLE存储过程创建失败,如何查看其原因

工作中用SQL Server比较多,Oracle可以说是小白,最近想用存储过程来完成单据复制的功能,结果遇到各种问题,其实都是非常简单的问题,但是对我来说还是花了很多时间来解决,浪费这些时间非常不值得,也由此让我越发喜爱微软的产品,不管是Visual Studio.SQL Server Management Studio还是Office,易用性都是非常的好. 我要创建的存储过程并不复杂,就是插入表的字段真TMD多,代码如下: create or replace procedure procPus

Oracle 存储过程简单语法

一.无参数的存储过程 --创建存储过程create or replace procedure getdate as datetime varchar2(100); begin select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') into datetime from dual; dbms_output.put_line('当前时间为:'||datetime); end; --调用存储过程begin   getdate;end: 执行结果输出系统当前时间

Oracle procedure 基本语法

转自:http://lorry1113.javaeye.com/blog/513851 关键字: 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查询的结果存入到变量中,可以同时将多个列存储多个变量