各位用户为了找寻关于全面解析Oracle Procedure 基本语法的资料费劲了很多周折。这里教程网为您整理了关于全面解析Oracle Procedure 基本语法的相关资料,仅供查阅,以下为您介绍关于全面解析Oracle Procedure 基本语法的详细内容
关键字: oracle 存储过程
1.基本结构
? 1 2 3 4 5 6 7 8CREATE
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)
例子:
? 1 2 3 4 5 6 7BEGIN
SELECT
col1,col2
into
变量1,变量2
FROM
typestruct
where
xxx;
EXCEPTION
WHEN
NO_DATA_FOUND
THEN
xxxx;
END
;
...
3.IF 判断
? 1 2 3 4 5IF V_TEST=1
THEN
BEGIN
do something
END
;
END
IF;
4.while 循环
? 1 2 3 4 5WHILE V_TEST=1 LOOP
BEGIN
XXXX
END
;
END
LOOP;
5.变量赋值
V_TEST := 123;
6.用for in 使用cursor
? 1 2 3 4 5 6 7 8 9 10...
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
? 1 2 3 4 5 6 7 8CURSOR
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
连接数据库后建立一个Test WINDOW
在窗口输入调用SP的代码,F9开始debug,CTRL+N单步调试
转载:
oracle 存储过程
关键字: oracle 存储过程
存储过程创建语法:
? 1create
or
replace
procedure
存储过程名(param1
in
type,param2
out
type)
as
变量1 类型(值范围);
变量2 类型(值范围);
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14Begin
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+异常名
以命名的异常
命名的系统异常 产生原因
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25ACCESS_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 在等待资源时超时
语法及示例:
1、存储过程创建存储过程的语法:
? 1CREATE
[
OR
REPLACE
]
PROCEDURE
procedure_name[(parameter_list)]{
IS
|
AS
}[local_declarations]BEGINexecutable_statements[EXCEPTIONexception_handlers]
END
[procedure_name];
其中:procedure_name是过程的名称。
parameter_list是参数列表。
local_declarations是局部声明。
executable_statements是可执行语句。
exception_handlers是异常处理程序。
示例1:
演示创建过程(参数列表中为IN参数赋予一个默认值,不能为OUT、IN OUT参数赋予默认值)
? 1create
or
replace
procedure
find_emp(emp_no
in
number:=7900)asempname varchar2(20);beginselect ename
into
empname
from
emp
where
empno=emp_no;dbms_output.put_line(
'雇员姓名是 '
||empname);exceptionwhen no_data_found thendbms_output.put_line(
'雇员编号未找到'
);
end
find_emp;
调用过程:
? 1EXECUTE
procudure_name(parameters_list);
也可以在过程里面调用,直接写上procudure_name而不必写EXECUTE。
示例2:演示创建带OUT参数的过程
? 1create
or
replace
procedure
test(value1 varchar2,value2
out
number)
is
identity number;
begin
select
sal
into
identity
from
emp
where
empno=value1; if identity<2000
then
value2:=1000;
else
value2:=500;
end
if;
end
;
调用带OUT参数的过程:
? 1declare
value2 number;
begin
test(
'7900'
,value2); dbms_output.put_line(value2);
end
;
示例3:
演示创建带IN OUT参数的过程
? 1create
or
replace
procedure
swap(p1
in
out
number,p2
in
out
number)
is
v_temp number;
begin
v_temp:=p1; p1:=p2; p2:=v_temp;
end
;
调用带IN OUT参数的过程:
? 1declare
num1 number:=100; num2 number:=200;
begin
swap(num1,num2); dbms_output.put_line(
'num1= '
||num1); dbms_output.put_line(
'num2= '
||num2);
end
;
示例4:将过程的执行权限授予其他用户
? 1GRANT
EXECUTE
ON
find_emp
TO
scott;
GRANT
EXECUTE
ON
swap
TO
PUBLIC
;
将find_emp过程的执行权限授予给用户scott,将执行swap过程的权限授予所有数据库用户。
删除过程语法:
? 1DROP
PROCEDURE
procudure_name;
2、函数 定义函数的语法如下:
? 1CREATE
[
OR
REPLACE
]
FUNCTION
function_name [(parameter_list)]
RETURN
datatype {
IS
|
AS
} [local_declarations]
BEGIN
executable_statements [EXCEPTION exception_handlers]
END
[function_name];
其中:function_name是函数的名称。
parameter_list是参数列表。
local_declarations是局部声明。
executable_statements是可执行语句。
exception_handlers是异常处理程序。
使用函数时注意:形式参数必须只使用数据库类型,不得使用PL/SQL类型。函数的返回类型也必须是数据库类型。 函数不能单独执行,只能通过SQL语句或PL/SQL程序块来调用。
示例5:
演示如何创建函数
? 1create
or
replace
function
fun_hello
return
varchar2
is
begin
return
'朋友,您好'
;
end
;
调用函数:
? 1select
fun_hello
from
dual;
函数的授权:同过和的授权一样具体请看示例4。
删除函数:
? 1DROP
FUNCTION
function_name
过程和函数的差异 过程 函数 作为PL/SQL语句执行 作为表达式的一部分调用 在规范中不包含RETURN子句 必须在规范中包含RETURN子句 不返回任何值 必须返回单个值 可以包含RETURN语句,但是与函数不同,它不能用于返回值 必须包含至少一条RETURN语句
3、程序包 创建包规范的语法:
? 1CREATE
[
OR
REPLACE
] PACKAGE package_name
IS
|
AS
[
Public
type
and
item declarations] [Subprogram specifications]
END
[package_name];
其中:package_name是包的名称。
Public type and item declarations是声明类型、常量、变量、异常和游标等。 Subprogram specifications声明PL/SQL子程序。
示例6:
演示创建程序包规范
? 1create
or
replace
package pack_op
is
procedure
pro_print_ename(id number);
procedure
pro_print_sal(id number);
function
fun_re_date(id number)
return
date
;
end
;
创建包主体的语法:
? 1CREATE
[
OR
REPLACE
] PACKAGE BODY package_name
IS
|
AS
[
Public
type
and
item declarations] [Subprogram bodies] [
BEGIN
Initialization_statements]
END
[package_name];
其中:package_name是包的名称。
Public type and item declarations是声明类型、常量、变量、异常和游标等。
Subprogram bodies是定义公共和私有PL/SQL子程序。
示例7:演示创建程序包主体
? 1create
or
replace
package body pack_op
is
procedure
pro_print_ename(id number)
is
name
emp.ename%type;
begin
select
ename
into
name
from
emp
where
empno=id; dbms_output.put_line(
'职员姓名:'
||
name
);
end
pro_print_ename;
procedure
pro_print_sal(id number)
is
salary emp.sal%type;
begin
select
sal
into
salary
from
emp
where
empno=id; dbms_output.put_line(
'职员工资:'
||salary);
end
pro_print_sal;
function
fun_re_date(id number)
return
date
is
bedate emp.hiredate%type;
begin
select
hiredate
into
bedate
from
emp
where
empno=id;
return
bedate;
end
fun_re_date;
end
pack_op;
示例8:调用程序包中创建的过程和函数
? 1exec
pack_op.pro_print_ename(7900);
exec
pack_op.pro_print_sal(7900);
select
pack_op.fun_re_date(7900)
from
dual;
示例9:演示程序包中的游标 创建包规范
? 1create
or
replace
package pack_emp
is
cursor
cur_emp
return
emp%rowtype;
procedure
pro_cur;
end
pack_emp;
创建包主体
? 1create
or
replace
package body pack_emp
is
cursor
cur_emp
return
emp%rowtype
is
select
*
from
emp;
procedure
pro_cur
is
rec_emp emp%rowtype;
begin
open
cur_emp; loop
fetch
cur_emp
into
rec_emp; exit
when
cur_emp%notfound; if rec_emp.sal<1000
then
dbms_output.put_line(
'员工工资:'
||rec_emp.sal||
',需加倍努力争取提高工资'
); elsif rec_emp.sal>=1000
and
rec_emp.sal<2000
then
dbms_output.put_line(
'员工工资:'
||rec_emp.sal||
',工资一般,争取搞个部门经理做做'
);
else
dbms_output.put_line(
'员工工资:'
||rec_emp.sal||
',工资不错,争取搞个总经理做做'
);
end
if;
end
loop;
end
pro_cur;
end
pack_emp;
调用程序包中的过程以调用程序包中的游标
? 1exec
pack_emp.pro_cur;
示例10:存储过程返回游标的子程序包(此程序包返回r_cur游标)
? 1 2CREATE
OR
REPLACE
package SCOTT.pk_wt
is
type mytype
is
ref
cursor
;
procedure
p_wt(mycs
out
mytype);
end
;
CREATE
OR
REPLACE
package BODY SCOTT.pk_wt
is
procedure
p_wt(mycs
out
mytype)
is
r_cur mytype;
begin
open
r_cur
for
select
*
from
emp; mycs:=r_cur;
end
p_wt;
end
pk_wt;
查询有关过程、函数和程序包的信息:
? 1USER_OBJECTS数据字典视图
column
object_name format a18
select
object_name,object_type
from
user_objects
where
object_type
in
(
'PROCEDURE'
,
'FUNCTION'
,
'PACKAGE'
,
'PACKAGE BODY'
);
以上所述是小编给大家介绍的Oracle Procedure知识,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
原文链接:http://www.cnblogs.com/wuhenke/archive/2010/03/20/1690535.html