过程是指用于执行特定操作的PL/SQL块。如果客户应用经常需要执行特定操作,那么可以考虑基于这些操作建立过程。通过使用过程,不仅可以简化客户应用的开发和维护,而且可以提高应用程序的运行机能。
一、 使用过程参数
当建立过程时,既可以指定过程参数,也可以不提供任何参数。过程参数包括输入参数、输出参数和输入输出参数,其中输入参数(IN)用于接收调用环境的输入数据,输出参数(OUT)用于将输出数据传递到调用环境,而输入输出参数(IN OUT)不仅要接收输入数据,而且还要输出数据到调用环境。不写明IN or OUT默认 是in。
创建一个存储过程的基本语句如下:
CREATE [OR REPLACE] PROCEDURE 存储过程名[(参数[IN|OUT|IN OUT] 数据类型...)]
{AS|IS}
[说明部分]
BEGIN
可执行部分
[EXCEPTION
错误处理部分]
END [过程名];
注意,当定义参数时,只能指定数据类型,不能指定长度
例一:建立无参数的过程
alter user scott account unlock;--解锁 scott 用户
下面以建立用于输出当前日期和时间的过程OUT_TIME为例,说明建立无参数过程的方法。
CREATE OR REPLACE PROCEDURE getDeptCount
AS
deptCount INT;
BEGIN
SELECT COUNT(*) INTO deptCount FROM DEPT;
DBMS_OUTPUT.PUT_LINE('DEPT表的共有记录数:'||deptCount);
END getDeptCount;
执行存储过程语句:
---
BEGIN
getDeptCount;
END;
---
CALL getDeptCount();
例二:创建带有输入参数的存储过程,该过程通过员工编号打印工资额
create or replace procedure getsalarybyempno(eno number) ----参数的数据类型不能指定长度
as
salary emp.sal%type;
begin
select sal into salary from emp where empno=eno;
dbms_output.put_line(eno||'号员工的工资为'||salary);
end getsalarybyempno;
当我们创建的存储过程没有参数时,在存储过程名字后面
不能有括号。在AS或者IS后至BEGIN之前是声明部分,存储过程中的声明
不使用DECLARE关键字。同匿名PL/SQL块一样,EXCEPTION和声明部分都是
可选的。
当我们创建的过程带有错误时,我们可以通过
SELECT * FROM USER_ERRORS查看,或者使用
SHOW ERRORS [ PROCEDURE Proc_Name]查看。
当定义的存储过程含有参数时,参数的数据类型不能指定长度。参数还有输入和输出之分,本例中没有指定,默认情况为输入参数,也可显示的指定某个参数是输入参数,如(eNo IN NUMBER)。同示例1不同,该例中加入了
异常处理。
例三:创建含有输入和输出参数的存储过程,该过程通过员工编号查找工资额,工资额以输出参数返回
CREATE OR REPLACE PROCEDURE getsalaryout(eNo IN NUMBER,salary OUT NUMBER)
AS
BEGIN
SELECT SAL INTO salary FROM EMP WHERE EMPNO=eNo;
return;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('没有找到该编号的员工');
END getsalaryout;
/*
当过程中含有输出参数时,调用时必须通过BEGIN END块,不能通过EXEC或CALL调用。
*/
DECLARE
salary NUMBER(7,2);
BEGIN
getsalaryout(7788,salary);
DBMS_OUTPUT.PUT_LINE('该员工的工资为:'||salary||'元!');
END;
例四:创建参数类型既是输入参数也是输出参数的过程
CREATE OR REPLACE PROCEDURE getsalaryoutput(noSalary IN OUT NUMBER)
AS
BEGIN
SELECT SAL INTO noSalary FROM EMP WHERE EMPNO=noSalary;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('没有找到该编号的员工');
END getsalaryoutput;
/*
调用如下
*/
DECLARE
salary NUMBER(7,2);
BEGIN
salary:=7369;
getsalaryoutput(salary);
DBMS_OUTPUT.PUT_LINE('该员工的工资为:'||salary||'元!!');
END;
例五:创建带有默认值的过程
create or replace procedure addEmp
(
empNo NUMBER,
eName VARCHAR2,
job VARCHAR2 :='CLERK',
mgr NUMBER,
hiredate DATE DEFAULT SYSDATE,
sal NUMBER DEFAULT 1000,
comm NUMBER DEFAULT 0,
deptNo NUMBER DEFAULT 30
)
AS
BEGIN
INSERT INTO emp VALUES(empNo,eName,job,mgr,hiredate,sal,comm,deptNo);
END addEmp;
/*
调用如下
*/
begin
addEmp(7776,'zhangsan','CODER',7788,'06-1月-2000',2000,0,10); --没有使用默认值
end;
begin
addEmp(7777,'lisi','CODER',7788,'06-1月-2000',2000,NULL,10);--可以使用NULL值
end;
begin
addEmp(7778,'wangwu',mgr=>7788); --使用默认值 =>给参数赋值
end;
begin
addEmp(mgr=>7789,empNo=>7779,eName=>'sunliu'); --更改参数顺序
end;
二、维护过程
1、删除存储过程
DROP PROCEDURE Proc_Name;
2、查看过程状态
SELECT object_name,status FROM USER_OBJECTS WHERE object_type='PROCEDURE';
3、重新编译过程
ALTER PROCEDURE Proc_Name COMPILE;
4、查看过程代码
SELECT * FROM USER_SOURCE WHERE TYPE='PROCEDURE';
三、参数的理解
-- 输出参数不可以修改解决的方法有两种
--1 把参数改成输入参数
--2 就是参数改成 可输入输出的参数;
调用过程的 三个方式
1 就是使用call
在只用call方式调用函数的时候,必须加要括号,有参数,还要加参数值
这个方式在命令窗口,调用过程,将不会出现输入的数据.
2 就是使用exec 命令,进行命令调用过程, 使用命令,就必须在命令行里面输入
过程名,这个命令窗口中,可加可不加() ,如果有参数的,就一定要加,还有参数值,参数值的类型要与
变量类型相同.
3 在语句块中进行调用过程,这个方式和命令模式类似,他们都是可要可不要(),
-- 在2 和 3 中的 没有括号的情况是,过程没有参数 ,如果有,就必须要有()
输出参数的特点
1 一个过程中,如果有输出参数(OUT 参数),在调用过程的使用,也要传入一个参数, 这个参数可以不用在调用的地方
进行赋值,就直接传入一个声明好的一个变量,用来接受存储过程中的输出参数的值(OUT 参数)
2 输入参数 值不可以改变在过程中,
注意: 在存储过程中,他的参数类型不可以设置它的大小 ;
补充:sqlplus中执行含有输出参数为游标的存储过程
分享到:
相关推荐
Oracle procedure 存储过程 创建+执行+删除
本文实例讲述了Python使用cx_Oracle调用Oracle存储过程的方法。分享给大家供大家参考,具体如下: 这里主要测试在Python中通过cx_Oracle调用PL/SQL。 首先,在数据库端创建简单的存储过程。 create or replace ...
oracle 存储过程教程,带有完整实例的说明,清晰易懂,面面俱到。
该文档详细讲解Oracle在存储过程中如何利用Out参数返回一个结果集。示例简单易懂。
比较齐全的oracleProcedure存储过程
oracle存储过程教程
Oracle数据库存储过程、函数、以及包的创建与高级应用。
3.1 oracle 存储过程的基本语法 3.1.1 基本结构 CREATE OR REPLACE PROCEDURE 存储过程名字 ( 参数1 IN NUMBER, 参数2 IN NUMBER ) IS 变量1 INTEGER :=0; 变量2 DATE; BEGIN END 存储过程名字 3.1.2 ...
1.1 存储过程基本结构(PROCEDURE) 3 1.1.1创建存储过程 3 1.1.2 存储过程删除 5 1.1.3 调用存储过程 5 1.2存储函数(FUNCTIONE) 6 1.2.1 创建存储函数 6 1.2.2 删除存储函数 7 1.3 包(package) 7 1.3.1 包的基本结构 ...
C# 传入自定义列表List 到Oracle存储过程 亲测有效,执行速度极快
pb中执行oracle存储过程脚本; 使用批处理进行oracle存储过程脚本的创建和更新的处理。 此程序在pb中进行实现;
CREATE OR REPLACE PROCEDURE 存储过程名字 ( 参数1 IN NUMBER, 参数2 IN NUMBER ) IS 变量1 INTEGER :=0; 变量2 DATE; BEGIN END 存储过程名字 2.SELECT INTO STATEMENT 将select查询的结果存入到变量中,可以...
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查询的结果存入到变量中...
Oracle存储过程 基础培训 异常处理 事务处理 优化存储过程
存储过程(Stored Procedure)是一组为了完 成特定功能的 SQL 语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给 出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,...
内有三个文件 TESTPACKAGE.txt和CURSOR_TEST2.txt中为oracle建存储过程语句,OracleProcedure.java为java操作存储过程的程序
2022oracle存储过程procedure秘籍借鉴.pdf
2022oracle存储过程procedure秘籍参照.pdf
1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程名字 ( 参数1 IN NUMBER, 参数2 IN NUMBER ) IS 变量1 INTEGER :=0; 变量2 DATE; BEGIN END 存储过程名字