`

Oracle中的子程序和程序包

阅读更多
--存储过程的语法
CREATE [OR REPLACE] PROCEDURE
   <procedure name> [(<parameter list>)]
IS|AS
   <local variable declaration>
BEGIN
   <executable statements>
[EXCEPTION
   <exception handlers>]
END <procedure name> ;
--存储过程
CREATE OR REPLACE PROCEDURE
       search_emp(emp_no NUMBER)--不写参数类型时,默认为输入参数
       AS
       emp_name VARCHAR2(20);--声明变量
BEGIN
      SELECT ename INTO empname FROM emp WHERE empno =emp_no;
      dbms_output.put_line('职员的名字是:'||emp_name);
EXCEPTION
      WHEN no_data_found THEN
      dbms_output.put_line('职员的名字未找到!');
END search_emp;
--带输入参数in的存储过程(示例)
CREATE OR REPLACE PROCEDURE
        p1(emp_no IN NUMBER)
       AS
       empname VARCHAR2(20);
BEGIN SELECT ename INTO empname FROM emp WHERE empno =emp_no;
      dbms_output.put_line('职员的名字是:'||empname);
EXCEPTION
      WHEN no_data_found THEN
      dbms_output.put_line('职员的名字未找到!');
END p1;
--执行带输入参in的存储过程
SET SERVEROUTPUT ON;
execute p1(7788);
--带输出参数out的存储过程
CREATE OR REPLACE PROCEDURE
       p2( sal IN NUMBER ,rs OUT VARCHAR2)
IS
       maxsal NUMBER(7,2);
       minsal NUMBER(7,2);
BEGIN
       SELECT MAX(sal),MIN(sal) INTO maxsal,minsal FROM emp;
       IF sal >= minsal AND sal<maxsal THEN
       rs:='猜的不错,在中间';
       ELSE
       rs:='猜错了';
       END IF;
END p2;
--调用带输出参数out的存储过程
DECLARE
outvalue VARCHAR2(20);
BEGIN
p2(1500,outvalue);
dbms_output.put_line(outvalue);
END;

--带int out参数的存储过程, 交换数据(即是输入参数,又是输出参数)
CREATE OR REPLACE PROCEDURE swap
(
   num1 IN OUT NUMBER,
   num2 IN OUT NUMBER
)
AS
temp NUMBER;
BEGIN
temp:=num1;
num1:=num2;
num2:=temp;
END swap;
-- 调用带int out参数的存储过程
DECLARE --定义两个变量
num1 NUMBER:=100;
num2 NUMBER:=200;
BEGIN
swap(num1,num2);--调用存储过程
dbms_output.put_line(num1);
dbms_output.put_line(num2);
END;

--授权
GRANT EXECUTE ON find_enm TO martin;
GRANT EXECUTE ON swap TO PUBLIC ;
--删除
DROP PROCEDURE find_emp;

--函数语法
CREATE [OR REPLACE] FUNCTION
  <function name> [(param1,param2)]
RETURN <datatype>  IS|AS
  [local declarations]
BEGIN
  Executable Statements;
  RETURN result;
EXCEPTION
  Exception handlers;
END;
--示例
CREATE OR REPLACE FUNCTION f_hello
RETURN VARCHAR2
AS
BEGIN
RETURN 'hello,您好';
END;
--调用函数
SELECT f_hello FROM dual;
--返回较大值的函数
CREATE OR REPLACE FUNCTION f_max
(
v1 NUMBER,
v2 NUMBER
)
RETURN NUMBER
AS
BEGIN
IF v1>v2 THEN RETURN v1;
ELSE
RETURN v2;
END IF;
END;
--自主事务处理
CREATE TABLE  t
(ID number,NAME VARCHAR2(10));
INSERT INTO t VALUES(1,'a');
INSERT INTO t VALUES(2,'b');
INSERT INTO t VALUES(3,'c');
--第一个(子事务)
CREATE OR REPLACE PROCEDURE t_p1
AS
     n VARCHAR2(2);
     --PRAGMA AUTONOMOUS_TRANSACTION;--声明为自主事务
BEGIN
     SELECT  NAME INTO n FROM t WHERE ID=1;
     dbms_output.put_line(n);--打印id=1的name值
     ROLLBACK;
END;
--第二个(主事务)
CREATE OR REPLACE PROCEDURE t_p2
AS
     n VARCHAR2(2);
BEGIN
     UPDATE t SET NAME ='e' WHERE ID=1;
     t_p1();
     SELECT  NAME INTO n FROM t WHERE ID=1;
     dbms_output.put_line(n);--打印id=1的name值
     ROLLBACK;
END;
--程序包
--程序包规范(语法)
CREATE [OR REPLACE]
  PACKAGE
  package_name IS|AS
[Public item declarations]
[Subprogram specification]
END [package_name];
--程序包规范(示例)--只创建空包
CREATE OR REPLACE PACKAGE pack_me IS
PROCEDURE emp_prc(emp_no NUMBER);--存储过程
FUNCTION emp_fun(emp_no NUMBER) RETURN NUMBER;--函数
CURSOR emp_cur(emp_no NUMBER)--游标
RETURN emp%ROWTYPE;
END pack_me;

--程序包主体(语法)
CREATE [OR REPLACE] PACKAGE BODY package_name IS|AS
[Private item declarations]
[Subprogram bodies]
[BEGIN
Initialization]
END [package_name];
--程序包主体(示例)
CREATE OR REPLACE PACKAGE BODY pack_me AS
--r emp % ROWTYPE;--此处定义的变量为私有的
--实现存储过程
  PROCEDURE emp_prc(emp_no NUMBER)IS
    empname VARCHAR2(20);
  BEGIN
    SELECT ename INTO empname FROM emp WHERE empno =emp_no;
    dbms_output.put_line('职员的名字是:'||empname);
  EXCEPTION
    WHEN no_data_found THEN
    dbms_output.put_line('职员的名字未找到!');
  END emp_prc;
--实现函数(调用时需定义变量来接收)
  FUNCTION emp_fun(empno NUMBER) RETURN NUMBER IS
    tempsal NUMBER;
  BEGIN
    SELECT sal INTO temsal FROM emp WHERE empno=emp_no;
    RETURN tempsal;
  EXCEPTION
    WHEN  no_data_found THEN
    dbms_output.put_line('职员的名字未找到!');
  END emp_fun;
  --实现游标
     CURSOR emp_cur(emp_no NUMBER)
     RETURN emp%ROWTYPE AS
     SELECT * FROM emp WHERE empno = emp_no;
  --为调用游标而新一个存储过程
  PROCEDURE ord_pro(vcode VARCHAR2) IS
  or_rec emp%ROWTYPE;
  BEGIN
         OPEN emp_cur(vcode);
     LOOP
         FETCH emp_cur INTO or_rec;
         EXIT WHEN emp_cur%NOTFOUND;
         DBMS_OUTPUT.PUT_LIne('返回的值为' || or_rec.ename);
     END LOOP;
  END ord_pro;
END pack_me;
--程序包的调用(示例)
EXECUTE pack_me.

--在同一个包中创建一个游标和一个存储过程,
--在包内利用存储过程来调用游标
---------------------------------------------------------
--创建包中的游标规范
CREATE OR REPLACE PACKAGE pack_t AS
CURSOR emp_cur(emp_no1 NUMBER )
RETURN emp%ROWTYPE ;          --定义带参游标
PROCEDURE emp_pro(emp_no2 NUMBER);
END pack_t;                   --定义存储过程
--创建包中的游标主体
CREATE  OR REPLACE PACKAGE BODY pack_t AS
--实现游标
  CURSOR emp_cur(emp_no1 NUMBER )
  RETURN emp%ROWTYPE IS--此处返回一行,要返回多行可用 return emp;
  SELECT * FROM emp WHERE empno=emp_no1;
--实现存储过程(并调用包中的游标)
  PROCEDURE emp_pro(emp_no2 NUMBER) IS
            emp_row emp%ROWTYPE;
  BEGIN
    OPEN pack_t.emp_cur(emp_no2);--打开游标并传参
    LOOP
    FETCH pack_t.emp_cur INTO emp_row;
    EXIT WHEN pack_t.emp_cur%NOTFOUND;
    dbms_output.put_line('工号为'||emp_row.empno ||'的姓名:'|| emp_row.ename);
    END LOOP;
  END emp_pro;
END pack_t;
--调用包中的存储过程(无法直接调用其内部的游标)
execute pack_t.emp_pro(7788);
---------------------------------------------------------


---------------------------------------------------------
--查询所有的视图
SELECT object_name,object_type FROM User_Objects
WHERE object_type IN('PROCEDURE','FUNCTION','PACKAGE');
--查询原代码
SELECT line,text FROM user_source WHERE NAME='SWAP';
--查询包规范(包中的过程,函数 ,游标)
DESC PACK_ME;
---------------------------------------------------------
0
0
分享到:
评论

相关推荐

    oracle子程序和程序包

    Oracle子程序和程序包是数据库管理系统Oracle中的重要概念,它们为开发者提供了强大的功能,用于组织和执行复杂的数据库操作。在Oracle中,子程序主要包括存储过程和函数,它们都是可重复使用的代码块,可以提高开发...

    Oracle子程序和程序包

    Oracle子程序和程序包是数据库管理系统Oracle中的核心编程概念,它们是实现复杂业务逻辑和数据库操作的主要工具。本文将深入探讨这两个概念,以及如何利用它们进行高效的数据处理。 首先,让我们了解一下什么是...

    Oracle:子程序和程序包(.ppt)

    调用这个程序包中的过程,我们只需要使用`EXECUTE`关键字,如下所示: ```sql EXECUTE ItemManager.itemdesc('i201', v_description); ``` 通过这种方式,我们可以有效地管理和组织复杂的Oracle数据库应用程序,...

    Oracle数据库子程序和程序包PPT教案.pptx

    Oracle数据库子程序和程序包PPT教案.pptx

    ORACLE中的程序包.ppt

    Oracle中的程序包是数据库编程的重要组成部分,主要用于组织和管理PL/SQL代码,提供模块化、信息隐藏和性能优化等优势。下面将详细解释程序包的相关知识点。 **包的概念** 包是一种将逻辑相关的PL/SQL类型、对象和...

    老二牛车第七章上机课子程序和程序包.pdf

    1. **定义程序包规范**:定义程序包中包含的所有公共对象(如过程、函数等),以及它们的数据类型和访问权限。 2. **实现程序包体**:编写具体的实现代码,包括过程和函数的逻辑。 **示例**: - 创建一个名为`...

    Oracle 子程序and程序包

    本文将深入探讨Oracle子程序与程序包的基础知识和技术要点。 ### Oracle子程序 #### 定义 子程序是PL/SQL语言中的一种结构,它包括存储过程(Procedures)和函数(Functions)。存储过程主要用于执行一系列操作,...

    oracle 视频 教程 游标 子程序 包

    oracle视频教程(游标、子程序、包) oracle视频教程(游标、子程序、包)

    批量导出pl/sql程序包内容代码

    程序包是PL/SQL中的一种特殊组织结构,它将相关的数据类型、常量、变量、游标、异常、子程序(函数和过程)封装在一起。一个完整的程序包通常由两部分组成:程序包规范(Package Specification)和程序包体(Package...

    ORACLE8存储子程序调试.pdf

    在 Oracle 数据库中,存储子程序是一种重要的编程结构,它可以提高编程效率、提高性能、简化应用开发和维护。下面详细介绍 ORACLE8 存储子程序的概念、特点、调试方法和应用场景。 一、存储子程序概念 存储子程序...

    JDBC oracle 驱动程序包

    在"JDBC oracle 驱动程序包"中,`oracle11g驱动jar包`是针对Oracle 11g版本的JDBC驱动程序的Java类库文件。这个`.jar`文件包含了所有必要的类和方法,使得Java应用程序能够连接到Oracle 11g数据库,执行SQL查询,...

    Oracle_plsql讲义:第22章 创建子程序和包.ppt

    Oracle PL/SQL 子程序和包的概念和应用 本章要点: * 理解子程序(过程、函数)及包的概念 * 掌握如何创建、执行和删除过程、函数及包的方法 * 了解形参和实参的区别以及不同参数模式的特征 * 灵活使用过程、函数...

    oracle存储过程函数和程序包.ppt

    Oracle存储过程、函数和程序包是数据库管理中的重要概念,它们允许开发人员在数据库级别进行复杂的逻辑处理和数据操作。本教程将深入讲解这些概念及其应用。 首先,游标是数据库处理中的关键元素,用于遍历查询结果...

    Oracle数据库应用教程之过程、函数和程序包.pptx

    Oracle数据库中的过程、函数和程序包是数据库应用开发中的核心元素,它们提供了模块化、可重用和可维护的代码组织方式。本教程主要讲解了如何利用这些元素进行高效的数据库编程。 7.1 子程序 子程序是PL/SQL编程中...

    Oracle_plsql讲义:第23章 使用子程序和包.ppt

    * 掌握存储子程序在 Oracle8i 和 Oracle9i 中的新特性 子程序位置: * 子程序可以存储在数据字典中,使用命令 CREATE OR REPLACE 创建 * 可以从其他 PL/SQL 语句块中调用已创建的子程序 * 子程序可以在语句块的...

    oracle存储过程函数程序包课件ppt

    在程序包中定义局部变量和子过程,可以增强代码的复用性和结构化。局部变量仅在定义它们的PL/SQL块的范围内有效,而子过程(或称子程序)是封装在主程序中的小型过程,可以被主程序调用,实现代码的分层。 理解这些...

    oracle包的应用详解

    包定义部分主要声明包的接口,包括公有数据类型、变量、常量、游标和子程序。而包主体则实现这些声明,包含私有元素的定义以及公共元素的具体实现。 包定义的语法如下: ```sql CREATE [OR REPLACE] PACKAGE ...

    1 存储子程序

    通过`OracleTest`这样的文件,我们可以学习到如何在Oracle环境中有效地利用存储过程和函数来解决问题,同时理解如何通过测试来验证和优化这些子程序。在实际工作中,掌握这些技能对于提升数据库管理和软件开发能力至...

    Oracle程序设计

    了解PL/SQL的基本语法,如声明变量、控制流程(IF-THEN-ELSIF,CASE,LOOP)、异常处理(BEGIN-EXCEPTION-END)以及子程序(PROCEDURE和FUNCTION)的定义和调用是学习Oracle程序设计的基础。 2. **游标**:游标是...

Global site tag (gtag.js) - Google Analytics