`
insertyou
  • 浏览: 914592 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

PL/SQL --> 存储过程

 
阅读更多

--=====================

-- PL/SQL --> 存储过程

--=====================

存储过程子程序的一种类型,能够完成一些任务,作为schema对象存储于数据库。是一个有名字的PL/SQL代码块,支持接收或不接受参数

,同时也支持参数输出。一个存储过程通常包含定于部分,执行部分,Exception部分,可以被其他子程序调用,也可以被重用。

一、过程定义

CREATE OR REPLACEPROCEDURE procedure_name

[(argument_name [IN | OUT | IN OUT] argument_type)]

AS | IS

BEGIN

procedure_body;

END [procedure_name];

存储过程中参数的类型

IN:表示是一个输入参数,可以指定缺省值。如省略参数类型,则缺省为in类型

OUT:表示是一个输出参数

IN OUT:既可以作为一个输入参数,也可以作为一个输出参数来输出结果

二、过程调用

EXECUTE CALL procedure_name [(argument_list)]

--例:定义一个过程,以JOB为参数,查询该JOB的最高工资、最低工资、平均工资。

CREATE OR REPLACE PROCEDURE display_sal(v_job emp.job%TYPE) --该形参缺省为in类型,数据类型为emp.job%TYPE

AS

v_avg_sal emp.sal%TYPE;

v_max_sal emp.sal%TYPE;

v_min_sal emp.sal%TYPE;

BEGIN

SELECT avg(sal) INTO v_avg_sal FROM emp WHERE job=v_job;

SELECT max(sal) INTO v_max_sal FROM emp WHERE Job=v_job;

SELECT min(sal) INTO v_min_sal FROM emp WHERE job=v_job;

DBMS_OUTPUT.PUT_LINE('DEPT '||v_job||' avg sal:'||v_avg_sal);

DBMS_OUTPUT.PUT_LINE('DEPT '||v_job||' max sal:'||v_max_sal);

DBMS_OUTPUT.PUT_LINE('DEPT '||v_job||' min sal:'||v_min_sal);

EXCEPTION

WHEN NO_DATA_FOUND THEN

DBMS_OUTPUT.PUT_LINE('NOT FOUND RECORD!');

END display_sal;

/

scott@ORCL> set serveroutput on;

scott@ORCL> exec display_sal('SALESMAN');

DEPT SALESMAN avg sal:1400

DEPT SALESMAN max sal:1600

DEPT SALESMAN min sal:1250

PL/SQL procedure successfully completed.

三、参数及其传递方式:

在建立过程时,传递的参数为可选项,如果省略参数选项,则过程为无参过程(定义时不指定参数,调用时也不需要参数)。

如果指定参数选项,则过程为有参过程(定义时需要指定参数名字、模式、数据类型,调时时需要给出对应的参数值),定义时的参数,

称为形参,调用时的参数称为实参。

1.无参过程

CREATE OR REPLACE PROCEDURE display_systime

AS

BEGIN

DBMS_OUTPUT.PUT_LINE('CURRENT TIME IS '||sysdate);

END display_systime;

/

execute display_systime; --调用

2.有参过程

定义时需要指定参数的名字、模式、数据类型

--例:定义一个添加记录的过程(全部为输入参数)

CREATE OR REPLACE PROCEDURE add_emp

(

v_no IN emp.empno%TYPE,

v_name IN emp.ename%TYPE,

v_dept IN emp.deptno%TYPE default 20 --此过程中指定了缺省的输入值,即部门号为

)

AS

BEGIN

INSERT INTO emp (empno,ename,deptno) VALUES (v_no,v_name,v_dept);

EXCEPTION

WHEN DUP_VAL_ON_INDEX THEN

DBMS_OUTPUT.PUT_LINE('Record Is Exist!');

END add_emp;

/

execute add_emp(8000,'TEST2',20); --调用

--例:定义一个输入员工编号,修改记录,再返回修改后的结果(姓名和工资)。

CREATE OR REPLACE PROCEDURE ed_emp

(

v_no IN emp.empno%TYPE, --定义了一个in类型,二个out类型的参数

v_name OUT emp.ename%TYPE,

v_sal OUT emp.sal%TYPE

)

AS

BEGIN

UPDATE emp SET sal=sal+100 WHERE empno=v_no;

SELECT ename,sal INTO v_name,v_sal FROM emp WHERE empno=v_no;

EXCEPTION

WHEN NO_DATA_FOUND THEN

DBMS_OUTPUT.PUT_LINE('NOT FOUND RECORD!');

END ed_emp;

/

scott@ORCL> VARIABLE t_name varchar2(20);

scott@ORCL> VARIABLE t_sal number;

scott@ORCL> call ed_emp(7788,:t_name,:t_sal);

Call completed.

scott@ORCL> print t_name t_sal;

T_NAME

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

SCOTT

T_SAL

----------

3100

--例:IN OUT类型参数的使用

CREATE OR REPLACE PROCEDURE comp

(num1 IN OUT NUMBER,num2 IN OUT NUMBER)

AS

v1 NUMBER;

v2 NUMBER;

BEGIN

v1:=num1+num2;

v2:=num1*num2;

num1:=v1;

num2:=v2;

END;

/

scott@ORCL> var n1 number;

scott@ORCL> var n2 number;

scott@ORCL> exec :n1:=5;

scott@ORCL> exec :n2:=3;

scott@ORCL> exec comp(:n1,:n2);

scott@ORCL> print n1 n2;

N1

----------

8

N2

----------

15

存储过程参数的传递方式:

按位置传递:

实参按顺序将值传给形参

EXECUTE ED_EMP(7900,:t_name,:t_sal);

EXECUTE ED_EMP(8000,'TEST2',20);

按名字传递

EXECUTE ED_EMP(v_name=>'ABCDE',v_dept=>10,v_no=>8003);

混合传递

EXECUTE ED_EMP(8005,v_dept=>20,v_name=>'TEST5');

注意host variable 的使用

host 变量指的是一个绑定变量,也称之为全局变量

host 变量通常在存储过程之外被声明,如SQL*Plus使用variable来声明或使用Java来声明

host 变量在声明是使用variable关键字声明,如VARIABLE t_name varchar2(20)

host 变量在引用时使用:variable_name来引用该全局变量,如上面的引用为:t_name

可以被任意的匿名块调用并传入或传出数据值

四、过程管理

查看系统过程信息

DBA_OBJECTS

DBA_PROCEDURES

DBA_SOURCE

--使用desc procedure_name 查看存储过程的参数信息

scott@ORCL> desc ed_emp;

PROCEDURE ed_emp

Argument Name Type In/Out Default?

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

V_NO NUMBER(4) IN

V_NAME VARCHAR2(10) OUT

V_SAL NUMBER(7,2) OUT

--dba_objects获得存储过程的信息

idle> select owner,object_name,object_type,status from dba_objects where object_name = 'ED_EMP';

OWNER OBJECT_NAME OBJECT_TYPE STATUS

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

SCOTT ED_EMP PROCEDURE VALID

scott@ORCL> select object_name,procedure_name,interface,authid from user_procedures;

OBJECT_NAME PROCEDURE_NAME INT AUTHID

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

DISPLAY_SAL NO DEFINER

ED_EMP NO DEFINER

--查看存储过程的源代码

scott@ORCL> select line, text from user_source where name='ED_EMP';

LINE TEXT

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

1 PROCEDURE ed_emp

2 (

3 v_no IN emp.empno%TYPE,

4 v_name OUT emp.ename%TYPE,

5 v_sal OUT emp.sal%TYPE

6 )

7 AS

8 BEGIN

9 UPDATE emp SET sal=sal+100 WHERE empno=v_no;

10 SELECT ename,sal INTO v_name,v_sal FROM emp WHERE empno=v_no;

11 EXCEPTION

12 WHEN NO_DATA_FOUND THEN

13 DBMS_OUTPUT.PUT_LINE('NOT FOUND RECORD!');

14 END ed_emp;

--查看错误信息

SHOW ERRORS

scott@ORCL> CREATE OR REPLACE PROCEDURE comp

2 (num1 IN OUT NUMBER,num2 IN OUT NUMBER)

3 AS

4 v1 NUMBER;

5 v2 NUMMBER;

6 BEGIN

7 v1:=num1+num2;

8 v2:=num1*num2;

9 num1:=v1;

10 num2:=v2;

11 END;

12 /

Warning: Procedure created with compilation errors.

scott@ORCL> show errors;

Errors for PROCEDURE COMP:

LINE/COL ERROR

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

5/4 PL/SQL: Item ignored

5/4 PLS-00201: identifier 'NUMMBER' must be declared

8/3 PL/SQL: Statement ignored

8/3 PLS-00320: the declaration of the type of this expression is

incomplete or malformed

10/3 PL/SQL: Statement ignored

10/9 PLS-00320: the declaration of the type of this expression is

incomplete or malformed

删除过程

DROP PROCEDURE procedure_name

scott@ORCL> drop procedure comp;

Procedure dropped.

五、更多参考

有关SQL请参考

SQL 基础--> 子查询

SQL 基础-->多表查询

SQL基础-->分组与分组函数

SQL 基础-->常用函数

SQL 基础--> ROLLUP与CUBE运算符实现数据汇总

SQL基础-->层次化查询(START BY ... CONNECT BY PRIOR)

有关PL/SQL请参考

PL/SQL --> 语言基础

PL/SQL --> 流程控制

PL/SQL --> 存储过程

PL/SQL --> 函数

PL/SQL --> 游标

PL/SQL -->隐式游标(SQL%FOUND)

PL/SQL --> 异常处理(Exception)

PL/SQL --> PL/SQL记录

PL/SQL --> 包的创建与管理

PL/SQL --> 包重载、初始化

PL/SQL --> DBMS_DDL包的使用

PL/SQL --> DML 触发器

PL/SQL --> INSTEAD OF 触发器

分享到:
评论

相关推荐

    pl/sql-7.1.5

    PL/SQL Developer是一种集成的开发环境,专门用于开发、测试、调试和优化Oracle PL/SQL存储程序单元,比如触发器等。PL/SQL Developer功能十分全面,大大缩短了程序员的开发周期。强大的PL/SQL编辑器,完善的Debugger...

    Oracle-PL/SQL-windows-32位-客户端

    Oracle PL/SQL是Oracle数据库与开发人员之间交互的重要工具,特别是在Windows 32位系统上。这个压缩包“Oracle-PL/SQL-windows-32位-客户端”包含了Oracle数据库32位客户端所需的组件,主要用于在Windows环境下进行...

    oracle10g_pl/sql

    Oracle 10g PL/SQL 是Oracle数据库系统中用于创建和管理存储过程、函数、触发器等数据库对象的编程语言。本教程旨在为初学者提供一个全面的学习平台,同时也为经验丰富的开发者提供参考资料。PL/SQL是Oracle特有的...

    PL/SQL 基本知识

    例如,在`jbpm.sql`文件中,可能包含了与业务流程管理(BPM)相关的PL/SQL存储过程或函数,用于定义和执行工作流任务。 此外,PL/SQL还支持块的概念,如匿名块,这使得在不创建独立的存储过程或函数的情况下,也能...

    pl/sql最新中文手册

    PL/SQL是Oracle数据库系统中的一个关键组成部分,它是一种过程化语言,专为数据库操作设计。这个"PL/SQL最新中文手册"显然是一份详细解释PL/SQL 7.0版本的指南,对于学习和精通Oracle数据库编程至关重要。以下是手册...

    一个对数据库的操作工具PL/SQLpl/sqL工具

    PL/SQL是Oracle公司开发的一种过程化语言,全称为Procedural Language/Structured Query Language,它是SQL的一个扩展,专门用于处理Oracle数据库系统。这个“PL/SQL工具”显然是一个用于辅助管理和操作Oracle数据库...

    Oracle PL/SQL实战(待续)

    Oracle PL/SQL是一种强大的编程语言,它结合了SQL的数据处理能力与PL的程序设计特性,是Oracle数据库系统中用于创建存储过程、函数、触发器和包的主要工具。在这个"Oracle PL/SQL实战(待续)"的主题中,我们将深入...

    Oracle资料学习PL/SQL必备

    7. **存储过程和函数**:存储过程是一组可重用的PL/SQL代码,可以在数据库中保存并按需调用,而函数则返回一个值。它们可以接受参数,提高代码复用性和性能。 8. **触发器**:触发器是在特定数据库事件(如INSERT、...

    Oracle PL/SQL专家指南-高级PL/SQL解决方案的设计与开发

    PL/SQL是Oracle数据库特有的编程语言,它结合了SQL的查询能力与过程式编程语言的功能,使得数据库管理、数据处理和业务逻辑实现更为高效。本书针对那些希望提升PL/SQL编程技能,设计和开发复杂数据库解决方案的...

    pl/sql developer11.0

    PL/SQL Developer是一款由Allround Automations公司开发的专业Oracle数据库开发工具,专为编写、调试、测试和管理PL/SQL代码而设计。标题中的“pl/sql developer11.0”指的是该软件的第11个主要版本。在本文中,我们...

    ORACLE PL/SQL从入门到精通

    ORACLE PL/SQL是从入门到精通的专业知识,涵盖了数据库开发与管理的多个方面,包括触发器、过程、函数、软件包、异常处理、游标、循环、分支、变量使用、数据库安装等关键知识点。 触发器是数据库中用来保证数据...

    Oracle PL/SQL程序设计(第5版)(上下册)

    - **PL/SQL简介**:PL/SQL(Procedural Language for SQL)是Oracle数据库的一种内嵌式过程化语言,用于增强SQL的功能。它允许在SQL查询的基础上添加控制流语句、变量定义、错误处理等特性。 - **环境搭建与配置**:...

    oracle pl/sql从入门到精通 配套源代码

    2. **存储过程和函数**:这些是PL/SQL的核心组成部分,它们封装了一系列操作,可以被多次调用,提高代码复用性。书中可能包含各种示例,如自定义计算函数、处理业务逻辑的存储过程等。 3. **触发器**:当数据库中的...

    pl/sql 免安装,绿色版pl/sql

    免安装的绿色版PL/SQL Developer使得用户无需经历复杂的安装过程,只需解压即可使用,大大简化了软件部署,方便在不同的计算机环境间快速切换。 这款绿色版PL/SQL Developer包含了所有必要的组件和配置文件,确保...

    PL/SQL编程基础知识

    PL/SQL(Procedural Language for SQL)是一种过程化语言,它结合了SQL的数据操纵功能和过程化语言的控制结构,使用户能够灵活地控制数据操作流程。作为Oracle数据库的核心组成部分之一,PL/SQL在数据库应用程序开发...

    PL/SQL VCS插件安装包+PL/SQL

    PL/SQL VCS插件是为开发者提供的一种增强工具,它与PL/SQL Developer整合,目的是为了更好地管理和控制Oracle数据库中的SQL脚本和存储过程的版本。这个安装包结合了Version Control System (VCS)的功能,如Visual ...

    pl/sql快捷插件

    PL/SQL Developer是一款由Allround Automations公司开发的专门用于Oracle数据库管理的集成开发环境(IDE)。这款软件为Oracle数据库管理员、开发人员和测试人员提供了便捷的SQL和PL/SQL编写、调试和执行功能。而“pl...

    PL/SQL下载

    PL/SQL是Oracle数据库系统中的一个关键组成部分,它是一种结合了SQL语言与过程编程的语言,专为数据库管理和应用程序开发设计。PL/SQL全称为“Procedural Language/Structured Query Language”,它提供了丰富的控制...

    Oracle PL/SQL实例编程(PL/SQL经典书籍)

    Oracle PL/SQL是一种...书中可能包含各种类型的PL/SQL程序设计技巧,从简单的存储过程和函数到复杂的事务处理和并发控制策略。通过实例学习,你将能够更好地理解和运用这些概念,提升你在Oracle数据库开发中的技能。

Global site tag (gtag.js) - Google Analytics