一.存储过程(PROCEDURE)

  使用过程, 不仅可以简化客户端应用程序的开发和维护,而且可以提高应用程序的运行性能. 
  CREATE [OR REPLACE] PROCUDURE procedure_name 
  (arg1 [model1] datatype1, arg2[model2] datatype2) 
  IS [AS] 
  PL/SQL Block; 
  arg1,arg2用于指定过程的参数,IS/AS用于开始一个PL/SQL块.当指定参数数据类型时,不能指定其长度. 
  在建立过程的时间,既可以指定输入参数(IN),也可以指定输出参数(OUT)以及输入输出参数(IN OUT).如果不定义参数模式,则默认为输入参数,如果要定义输出参数,则需要指定OUT关键字,如果定义输入输出参数,   要指定IN OUT关键字. 一般使用execute(或exec) 过程名 或者 call 过程名来调用过程.

  set serveroutput on打开oracle 的输出. 
  (1)不带参数的过程 
  CREATE OR REPLACE PROCEDURE out_time 
  IS 
  BEGIN 
  dbms_output.put_line(systimestamp); 
  END; 
  call out_time();或者 exec out_time; 
  (2)带IN参数的过程 
  如果不指定参数模式,则默认的为IN,也可以显示的指定输入模式IN. 
  CREATE OR REPLACE PROCEDURE add_employee 
  (eno NUMBER,name VARCHAR2,sal NUMBER,job VARCHAR2 DEFAULT 'CCC', dno NUMBER) 
  IS 
  BEGIN 
  INSERT INTO emp(empno, ename,sal,job,deptno) 
  VALUES(eno,ename,sal,job,dno); 
  EXCEPTION 
  WHEN DUP_VAL_ON_INDEX THEN 
  RAISE_APPLICATION_ERROR(-20000, '雇员不能重复'); 
  END; 
  除了默认值的参数外,其余的都要输入. 
  (3)带OUT的过程 
  在过程中输出结果是使用OUT或者IN OUT来完成的. 
  定义输出参数的时间,必须要使用OUT来定义输出. 
  CREATE OR REPLACE PROCEDURE query_employee 
  (eno NUMBER,name OUT VARCHAR2,sal OUT NUMBER) 
  IS 
  BEGIN 
  SELECT ename, sal INTO name, sal FROM emp WHERE empno=eno; 
  EXCEPTION 
  WHEN NO_DATA_FOUND THEN 
  RAISE_APPLICATION_ERROR(-20000, '雇员不存在'); 
  END; 
  对于指定为OUT类型的参数,必须定义变量接收输出参数的数据.调用实例: 
  SQL> var name VARCHAR2(10) 
  SQL> var sal NUMBER 
  SQL> exec query_employee(77,:name,:sal) 
  SQL> print name sal 
  (4)带IN和OUT的过程 
  在调用前要通过变量给参数传递数据,在调用结束后,会通过此变量将值传递给应用程序 
  CREATE OR PROCEDURE compute 
  (num IN OUT NUMBER, num2 IN OUT NUMBER) 
  IS 
  v1 NUMBER; 
  v2 NUMBER; 
  BEGIN 
  v1:=num1/num2; 
  v2:=MOD(num1, num2); 
  num1 := v1; 
  num2 := v2; 
  END;

  在应用程序调用IN OUT的存储过程时,必须提供两个变量临时存放数值,运行如下: 
  SQL> var n1 NUMBER 
  SQL> var n2 NUMBER 
  SQL> exec :n1:=100 
  SQL> exec :n2:=30 
  SQL> exec compute(:n1, :n2) 
  SQL> PRINT n1 n2 
  (5)为参数传递变量和数据

  [1]位置传递 
  如 SQL> exec add_dept(50, 'SALES', 'NEW YORK') 
  [2]名称传递,使用=>符号来指定值 
  如 SQL> exec add_dept(dno=>50) 
  [3]组合传递,以上两种传递方法交替 
  (6)查看过程的源代码 
  过程名,源代码,执行代码放到了数据字典中,通过查询数据字典USER_SOURCE,可以显示当前用户定义的过程 
  SELECT text FROM user_source WHERE name='ADD_DEPT'; 
  (7)删除过程 
  DROP PROCEDURE 过程名

二.函数 (FUNCTION)

  CREATE [OR REPLACE] FUNCTION function_name 
  (arg1 [model1] datatype1,arg2 [model2] datatype2) 
  RETURN datatype 
  IS|AS 
  PL/SQL Block; 
  arg1,arg2指定函数 的参数,当不指定参数数据类型时,不能指定其长度 
  RETURN 指定函数 返回的数据类型.注意,函数 前面必须要有RETURN子句.在函数 体内至少含有一条RETURN子句.函数 的参数MODEl和过程的一样 
  (1)不带参数的函数 
  CREATE OR REPLACE FUNCTION get_user 
  RETURN VARCHAR2 
  IS 
  v_user VARCHAR2(100); 
  BEGIN 
  SELECT username INTO v_user FROM user_users; 
  RETURN v_user; 
  END; 
  调用方法 
  SQL> var v1 VARCHAR2(100) 
  SQL> exec :v1:=get_user 
  SQL> PRINT v1 
  (2)带IN参数 
  CREATE OR REPLACE FUNCTION get_sal(name IN VARCHAR2) 
  RETURN NUMBER 
  IS 
  v_sal emp.sal%TYPE; 
  BEGIN 
  SELECT sal INTO v_sal FROM emp 
  WHERE upper(ename)=upper(name); 
  RETURN v_sal; 
  EXCEPTION 
  WHEN NO_DATA_FOUND THEN 
  raise-application_error(-20000,'该雇员不存在'); 
  END; 
  调用方法如下: 
  SQL> var sal NUMBER 
  SQL> exec :sal:=get_sal('scott') 
  SQL> print sal 
  (3)带OUT参数 
  一般情况下,函数 只需要单个返回数据,如果希望使用函数 同事返回多个数据,就需要用到输出参数了. 
  CREATE OR REPLACR FUNCTION get_info 
  (name VARCHAR2, title OUT VARCHAR2) 
  RETURN VARCHAR2 
  AS 
  deptname dept.dname%TYPE; 
  BEGIN 
  SELECT a.job,b.dname INTO title, deptname 
  FROM emp a, dept b 
  WHERE a.deptno = b.deptno 
  AND upper(a.ename) = upper(a.ename) 
  RETURN deptname; 
  EXCEPTION 
  WHEN NO_DATA_FOUND THEN 
  raise_application_erro(-20000, '雇员不存在'); 
  END; 
  由于此函数 带有OUT参数,所以要定义变量接收OUT参数和函数 的返回值 
  SQL> var job varchar2(20) 
  SQL> var dname varchar2920) 
  SQL> exec :dname:=getinfo('scott',:job) 
  SQL> print dname job 
  (4)带IN OUT参数 
  在调用函数 之前需要通过变量给该种参数传递数据 
  CREATE OR REPLACE FUNCTION result 
  (num1 NUMBER, num2 IN OUT NUMBER) 
  RETURN NUMBER 
  AS 
  v_result NUMBER(6); 
  v_remain NUMBER; 
  BEGIN 
  v_result:=num1/num2; 
  v_remain:=MOD(num1, num2); 
  num2 := v_remain; 
  RETURN v_result; 
  EXCEPTION 
  WHEN ZERO_DIVIDE THEN 
  raise_application_error(-20000, '不能除0'); 
  END; 
  执行如下: 
  SQL> var result1 NUMBER 
  SQL> var result2 NUMBER 
  SQL> exec :result2:=30 
  SQL> exec :result1:=result(100, :result2) 
  SQL> print result1 result2 
  (5)函数 的删除 
  DROP FUNCTION 函数 名

三.子程序的管理 
  列出当前用户的子程序 
  数据字典视图USER_OBJECTS显示当前用户所包含的所有对象.可以列出用户的表,视图,索引,也可以列出用户的过程,函数 等. 
  SELECT object_name, created, status FROM user_object2 WHERE object_type IN ('PROCEDURE', 'FUNCTION');

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/JHHJA/archive/2010/12/07/6060486.aspx

Oracle存储过程和函数使用方法的更多相关文章

  1. Oracle数据库中调用Java类开发存储过程、函数的方法

    Oracle数据库中调用Java类开发存储过程.函数的方法 时间:2014年12月24日  浏览:5538次 oracle数据库的开发非常灵活,不仅支持最基本的SQL,而且还提供了独有的PL/SQL, ...

  2. Oracle调用Java类开发的存储过程、函数的方法

    oracle调用java类的基本步骤 1. 编写java代码,后续可以直接使用java代码,class文件或者jar包 2. 将写好的java代码导入到oracle数据库中,有两种方法:一种是使用lo ...

  3. oracle 存储过程,存储函数,包,

    http://heisetoufa.iteye.com/blog/366957 认识存储过程和函数 存储过程和函数也是一种PL/SQL块,是存入数据库的PL/SQL块.但存储过程和函数不同于已经介绍过 ...

  4. Oracle存储过程、函数、包加密wrap

    wrap加密可以将PL/SQL的代码实现部分隐藏,提高代码的安全性,如存储过程.函数.包等都隐藏. wrap加密的方法有两种,下面以函数为例分别介绍一下: 方法一: 编写好函数后保存到 d:\test ...

  5. oracle 存储过程,函数和包

    创建存储过程: 语法:create [or replace] PROCEDURE 过程名(参数列表)  AS PLSQL子程序体: 调用 存储过程的方式 两种1.execute(exec)     - ...

  6. JAVA调用Oracle存储过程和函数

    连接数据库的工具类: import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; imp ...

  7. Oracle————存储过程与函数

    存储过程存储过程参数模式包括IN.OUT. IN OUT. IN(默认参数模式):表示当存储过程别调用时,实参值被传递给形参:形参起变量作用,只能读该参数,而不能修改该参数.IN模式参数可以是变量或表 ...

  8. Oracle存储过程及函数的练习题

    --存储过程.函数练习题 --(1)创建一个存储过程,以员工号为参数,输出该员工的工资create or replace procedure p_sxt1(v_empno in emp.empno%t ...

  9. Oracle存储过程及函数

    1.在Oracle中,存储过程包括三部分组成:定义部分.执行部分.和异常处理部分(即例外) eg1:输入员工编号,查询员工的姓名和薪资 create or repalce  procedure myp ...

随机推荐

  1. EJB系列 - EJB高级概念

    本人博客文章网址:https://www.peretang.com/ejb-advanced-concepts/ EJB内幕 幕后的EJB:容器会为每一个bean实例自动生成称为EJB对象的代理, 由 ...

  2. 浅谈 Requests包

    浅谈 Requests包 一:Requests包是做什么的? 简单地说,是用python处理HTTP的一个包. 它的标志也非常有气质,是一个双蛇杖,按照官方的说法,一条蛇代表client,一条代表se ...

  3. Linux 下挂在ntfs 硬盘

    CentOS 7 下想要挂载NTFS的文件系统该怎么办呢? 我们需要一个NTFS-3G工具,并编译它之后在mount就可以了,就这么简单. 首先要进入官网下载NTFS-3G工具 http://www. ...

  4. hdfs文件系统架构详解

    hdfs文件系统架构详解 官方hdfs分布式介绍 NameNode *Namenode负责文件系统的namespace以及客户端文件访问 *NameNode负责文件元数据操作,DataNode负责文件 ...

  5. Python的元类

    1.用元类验证子类 每当我们定义新类的时候,元类就会运行雅正代码,以确保这个新类符合规定的规范. Python系统把子类的class语句处理完毕,就会调用元类的 __new__ 方法.元类可以通过 _ ...

  6. 部署服务能在Dynamics CRM Online上使用吗?

    部署服务有些时候有用,改动一些参数不需要重启IIS,也不需要去数据库中更改.比如,系统默认设置一个仪表盘(Dashboard)最多6个组件,不能超过这个数量,通过部署服务是可以更改的.部署服务既可以通 ...

  7. input输入框自动填充黄色背景解决方案

    chrome表单自动填充后,input文本框的背景会变成偏黄色的,这是由于chrome会默认给自动填充的input表单加上input:-webkit-autofill私有属性,然后对其赋予以下样式: ...

  8. nyoj_323:Drainage Ditches(网络流入门)

    题目链接 网络流入门@_@,此处本人用的刘汝佳的Dinic模板 #include<bits/stdc++.h> using namespace std; const int INF = 0 ...

  9. 关于tomcat下startup.bat双击闪退的问题

    背景:之前做单点登录,复制了几个tomcat,改了各自端口,当做不同服务器用. 今天无意间随便点击了一个tomcat下的startup.bat批处理文件,结果出来控制台,没出几行信息就闪退了.点击其他 ...

  10. 关于Class.forName(className).newInstance()介绍

    Class.forName(xxx.xx.xx) 返回的是一个类 首先你要明白在java里面任何class都要装载在虚拟机上才能运行.这句话就是装载类用的(和new 不一样,要分清楚). 至于什么时候 ...