存储过程
1 什么是存储过程?
用于在数据库中完成特定的操作或者任务。是一个PLSQL程序块,可以永久的保存在数据库中以供其他程序调用。
2 存储过程的参数模式

存储过程的参数特性:
IN类型的参数 OUT类型的参数 IN-OUT类型的参数
值被 传递给子程序 返回给调用环境 传递给子程序
返回给调用环境
参数形式 常量 未初始化的变量 初始化的变量
使用时 默认类型 必须明确指定 必须明确指定

在oracle10中写好了存储过程,代码如下:

 CREATE OR REPLACE Procedure Proc_Insert
 (
        sName     in     varchar2,
        sAge      in     int,
        sExeTime  in     varchar2
 )
 is  

 begin
        Insert into T_TEST(C_ID, C_NAME, C_AGE, C_INTIME, C_EXETIME)
        values(T_TEST_CID.nextval,sName,sAge, sysdate, to_date(sExeTime, 'yyyy-mm-dd'));
 end Proc_Insert;

为了在PL/SQL中调用这个存储过程,采用了如下的代码:

 begin
 Proc_Insert(,'2005-12-24');
 commit;
 end; 

另外增加了一个存储过程,但是sExeTime是date类型,那么调用的时候,就必须先把字符串转换成date类型,否则将会调用失败。

存储过程:

 CREATE OR REPLACE Procedure Proc_Insert2
 (
        sName     in     varchar2,
        sAge      in     int,
        sExeTime  in     date
 )
 is  

 begin
        Insert into T_TEST(C_ID, C_NAME, C_AGE, C_INTIME, C_EXETIME)
        values(T_TEST_CID.nextval,sName,sAge, sysdate, sExeTime);
 end Proc_Insert2; 

调用的代码:

 begin
 Proc_Insert2(, to_date('2010-10-20', 'yyyy-mm-dd'));
 commit;
 end; 

调用存储过程
存储过程建立完成后,只要通过授权,用户就可以在SQLPLUS 、ORACLE开发工具或第三方开发工具中来调用运行。ORACLE 使用EXECUTE 语句来实现对存储过程的调用:
EXEC[UTE] Procedure_name( parameter1, parameter2…);

例:查询指定员工记录

 CREATE OR REPLACE PROCEDURE QueryEmp
 (v_empno IN emp.empno%TYPE,
      v_ename OUT emp.ename%TYPE,
      v_sal OUT emp.sal%TYPE)
 AS
 BEGIN
      SELECT ename, sal INTO v_ename, v_sal FROM emp WHERE empno=v_empno;
      DBMS_OUTPUT.PUT_LINE('编码为'||v_empno||'的员工已经查到!');
 EXCEPTION
      WHEN NO_DATA_FOUND THEN
       DBMS_OUTPUT.PUT_LINE('你需要的数据不存在!');
       WHEN OTHERS THEN
       DBMS_OUTPUT.PUT_LINE('发生其它错误!');
 END QueryEmp;

调用方法:

 DECLARE
    v1 emp.ename%TYPE;
    v2 emp.sal%TYPE;
 BEGIN
   QueryEmp(, v1, v2);
   DBMS_OUTPUT.PUT_LINE('姓名:'||v1);
   DBMS_OUTPUT.PUT_LINE('工资:'||v2);
   QueryEmp(, v1, v2);
   DBMS_OUTPUT.PUT_LINE('姓名:'||v1);
   DBMS_OUTPUT.PUT_LINE('工资:'||v2);
   QueryEmp(, v1, v2);
   DBMS_OUTPUT.PUT_LINE('姓名:'||v1);
   DBMS_OUTPUT.PUT_LINE('工资:'||v2);
END; 

例.计算指定部门的工资总和,并统计其中的职工数量。

 CREATE OR REPLACE PROCEDURE proc_demo
 (Dept_no ,
        Sal_sum OUT NUMBER,
        Emp_count OUT NUMBER)
 IS
 BEGIN
        SELECT SUM(sal), COUNT(*) INTO sal_sum, emp_count
 FROM emp WHERE deptno=dept_no;
 EXCEPTION
    WHEN NO_DATA_FOUND THEN
       DBMS_OUTPUT.PUT_LINE('你需要的数据不存在!');
    WHEN OTHERS THEN
       DBMS_OUTPUT.PUT_LINE('发生其它错误!');
 END proc_demo; 

调用方法:

 DECLARE
 V_num NUMBER;
 V_sum , );
 BEGIN
        Proc_demo(, v_sum, v_num);
 DBMS_OUTPUT.PUT_LINE('30号部门工资总和:'||v_sum||’,人数:’||v_num);
        Proc_demo(sal_sum => v_sum, emp_count => v_num);
 DBMS_OUTPUT.PUT_LINE('10号部门工资总和:'||v_sum||’,人数:’||v_num);
 END; 

在PL/SQL 程序中还可以在块内建立本地函数和过程,这些函数和过程不存储在数据库中,但可以在创建它们的PL/SQL 程序中被重复调用。本地函数和过程在PL/SQL 块的声明部分定义,它们的语法格式与存储函数和过程相同,但不能使用CREATE OR REPLACE 关键字。

例:建立本地过程,用于计算指定部门的工资总和,并统计其中的职工数量

 DECLARE
 V_num NUMBER;
 V_sum , );
 PROCEDURE proc_demo
               (Dept_no ,
               Sal_sum OUT NUMBER,
               Emp_count OUT NUMBER)
 IS
 BEGIN
               SELECT SUM(sal), COUNT(*) INTO sal_sum, emp_count
 FROM emp WHERE deptno=dept_no;
 EXCEPTION
    WHEN NO_DATA_FOUND THEN
       DBMS_OUTPUT.PUT_LINE('你需要的数据不存在!');
    WHEN OTHERS THEN
       DBMS_OUTPUT.PUT_LINE('发生其它错误!');
 END proc_demo;
 BEGIN
        Proc_demo(, v_sum, v_num);
 DBMS_OUTPUT.PUT_LINE('30号部门工资总和:'||v_sum||’,人数:’||v_num);
        Proc_demo(sal_sum => v_sum, emp_count => v_num);
 DBMS_OUTPUT.PUT_LINE('10号部门工资总和:'||v_sum||’,人数:’||v_num);
 END; 

无参数存储过程的使用

CREATE OR REPLACE PROCEDURE 过程名 [(parameter,...)]
IS
定义变量
Begin
Plsql程序
End;

例:创建一个存储过程,用于向数据库中插入一条记录。
第一步:创建

 CREATE  OR  REPLACE  PROCEDURE  pro_1
 IS
 Begin
   ,'aa','aav');
 End;  

第二步:在sql*plus中执行该过程

exec pro_1;

第三步:通过JDBC使用存储过程 
private Connection conn = null;
private ResultSet rs = null;
private CallableStatement state = null;
//调用一个无参数的存储过程
public void testPro()
{
conn = Tools.getConnection();
try {
state = conn.prepareCall("{call pro_1}");
state.execute();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

4 带有IN类型参数的存储过程的使用。
例:创建一个存储过程,用于向数据库中插入一条记录。
第一步:创建

 CREATE  OR  REPLACE  PROCEDURE  pro_2(id number,name varchar2,email varchar2)
 IS
 Begin
   insert into person values (id,name,email);
 End;

第二步:在sql*plus中执行该过程

 ,'aaa','aaa'); 

第三步:通过JDBC使用存储过程。
//使用一个带有 IN 类型参数的存储过程

  public void testPro_in(int id,String name,String email)
  {
   conn = Tools.getConnection();
   try {
    state = conn.prepareCall("{call pro_2(?,?,?)}");
    state.setLong(1, id);
    state.setString(2, name);
    state.setString(3, email);
    state.execute();
   } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  } 

5 带有out类型参数的存储过程的使用。
例:创建一个存储过程,用于返回数据库中的Person表的总行数。
第一步:创建

 CREATE  OR  REPLACE  PROCEDURE  pro_3(num out number)
 IS
 mynum number;
 Begin
   select count(*) into mynum from person;
   num := mynum;
 End;

或者

 CREATE  OR  REPLACE  PROCEDURE  pro_3(num out number)
 IS
 Begin
   select count(*) into num from person;
 End; 

第二步:在sql*plus中执行该过程
declare
a number;
begin
pro_3(a);
dbms_output.put_line(a);
end;
第三步:通过JDBC使用存储过程。
public void testPro_out()
{
conn = Tools.getConnection();
try {
state = conn.prepareCall("{call pro_3(?)}");
state.registerOutParameter(1, Types.NUMERIC);
state.execute();
int num = state.getInt(1);
System.out.println(num);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
6 带有in-out类型参数的存储过程的使用。
创建:
CREATE OR REPLACE PROCEDURE pro_4(num in out number)
IS
a number := 100;
Begin
num := a*num;
End;
在sql*plus中执行该过程
declare
a number := 12;
begin
pro_4(a);
dbms_output.put_line(a);
end;

在PL/SQL中调用Oracle存储过程的更多相关文章

  1. 在PL/SQL中调用存储过程--oracle

    在oracle10中写好了存储过程,代码如下: CREATE OR REPLACE Procedure Proc_Insert ( sName in varchar2, sAge in int, sE ...

  2. PL/SQL如何调试Oracle存储过程

    from:http://jingyan.baidu.com/article/3a2f7c2e144d2826aed61167.html 调试过程对找到一个存过的bug或错误是非常重要的,Oracle作 ...

  3. 【PL/SQL系列】Oracle存储过程使用动态SQL

    Oracle存储过程相信大家都比较了解,下面就为您介绍Oracle存储过程使用动态SQL的方法,希望对您能够有所帮助. CREATE OR REPLACE PROCEDURE P_STAT_SCORE ...

  4. PL/SQL中查询Oracle大数(17位以上)时显示科学计数法的解决方法

    PL/SQL查询时,如果Number(17)以上的大数,会显示为科学计数法 解决方法: TOOLS->PREFERENCES->WINDOW TYPE->SQL WINDOW下选中N ...

  5. PL/Sql 中创建、调试、调用存储过程

    存储过程的详细建立方法 1.先建存储过程 左边的浏览窗口选择 procedures ,会列出所有的存储过程,右击文件夹procedures单击菜单"new",弹出 template ...

  6. ORACLE PL/SQL 中序列(sequence)的简易使用方法介绍

    如果我是C罗 原文 ORACLE PL/SQL 中序列(sequence)的简易使用方法介绍 sequence在ORACLE中应用十分广泛,就是序列号的意思,会自动增加指定变数,如逐次增加1或者2或者 ...

  7. ORACLE PL/SQL 实例精解之第三章 PL/SQL中的SQL

    3.1 在PL/SQL中使用DML 在PL/SQL语块中,两种变量赋值a. := 初始化.b. select into语法,PL/SQL语块的声明部分被声明的变量,后期可以使用选择语句进行赋值. 3. ...

  8. oracle PL/SQL(procedure language/SQL)程序设计(在PL/SQL中使用SQL)

    在PL/SQL程序中,允许使用的SQL语句只有DML和事务控制语句,使用DDL语句是非法的.使用SELECT语句从数据库中选取数据时,只能返回一行数据.使用COMMIT,  ROLLBACK, 和SA ...

  9. C#调用Oracle存储过程的方法

    C#调用Oracle存储过程的方法 准备: 环境:pl/sql+oracle9i+vs2008 创建表test: create table TEST(  ID      NUMBER,//编号  NA ...

随机推荐

  1. 转载:Java面试笔试题大汇总

    本文来源于:http://blog.csdn.net/wulianghuan 1.面向对象的特征有哪些方面 1).抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关 ...

  2. 遍历对象所有属性(json对象)

    var response = { "status": 1, "message": "\u6210\u529f", "data&qu ...

  3. hdu 5381 The sum of gcd

    知道对于一个数列,如果以x为左(右)端点,往右走,则最多会有log(a[x])个不同的gcd,并且有递减性 所以会分成log段,每一段的gcd相同 那我们可以预处理出对于每一个位置,以这个位置为左端点 ...

  4. [转Go-简洁的并发 ]

    http://www.yankay.com/go-clear-concurreny/ Posted on 2012-11-28by yankay 多核处理器越来越普及.有没有一种简单的办法,能够让我们 ...

  5. php 多进程workman服务器框架

    今天搜php socket,发现了一个给力的php写socket的框架workman,有机会要用用. 好给力,原来那个小蝌蚪聊天室就是用这个开发的. 仿佛发现了新大陆.

  6. TOJ3651确定比赛名次

    确定比赛名次   Time Limit(Common/Java):1000MS/3000MS     Memory Limit:65536KByte Total Submit: 23          ...

  7. Excel如何进行SVN

    KSFramework常见问题:Excel如何进行SVN协作.差异比较?   Excel如何进行SVN协作.差异比较? 嗯,这是一个令人困惑的问题.游戏开发.程序开发时,使用Excel可以添加文档.注 ...

  8. C++ concepts: Compare

    The concept Compare is a set of requirements expected by some of the standard library facilities fro ...

  9. StudyJams学习历程总结

    Study Jams 是一个学习 Google 在线课程的活动.该活动由学员自发组建课程学习小组,旨在带领小组成员入门 Android 开发,最终将 Android App 上载至 Google Pl ...

  10. Android性能优化之Listview(ViewHolder重用机制)

    相信大家在很多时候都会用到ListView这个控件,因为确实是用的很多很多,但是有木有遇到过当数据很多很多的时候,往下滑ListView时有时候会卡顿,这就需要我们来优化它了. ListView优化主 ...