Oracle之存储过程

2/13/2017来源:SQL技巧人气:1356


Oracle(持续更新中)

《Oracle11g之安装与卸载》 《Oracle之常用命令》 《Oracle之用户管理》 《Oracle之pl/sql》 《Oracle之块》 《Oracle之存储过程》 《Oracle之函数》 《Oracle之包》


  存储过程用于执行特定的操作。当建立存储过程时,既可以指定输入参数(in),也可以指定输出参数(out)。 通过在存储过程中使用输入参数,可以将数据传递到执行部分。通过使用输出参数,可以将执行部分的数据传递到应用环境。在sql/plus中可以使用create PRocedure 命令来建立过程。

优点:sql语句每次都需要被编译,过程只需要编译一次。实现模块化、减少网络传输量、提高安全性(在java中调用只需要传参数,而不需要传完整的sql语句)。

缺点:移植性不好,如:更换数据库,所有存储过程需手动导入

目录

一、插入例子

创建存储过程 在命令窗口中调用存储过程 java中调用存储过程

二、查询例子

查询结果单一 查询结果多个

一、插入例子

  插入的存储过程与删除、更改类似。

1、创建存储过程

  代码如下:

create or replace procedure p_insert(param1 in varchar2) is begin insert into data(info) values(param1); end; /--以/作为结束,不能直接复制,后续单独加上

  解析:     create or replace :代表创建或替换,也可单独使用create     p_insert :代表存储过程名     varchar2:oracle专有的字符数据类型     param1:输入参数名

2、在命令窗口中调用存储过程

  可以使用 call或exe[cute]执行存储过程

  如图所示:

这里写图片描述

3、java中调用存储过程

  代码如下:

Class.forName("oracle.jdbc.driver.OracleDriver");//加载驱动 Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl", "scott", "tiger");//获得连接 CallableStatement cstm = conn.prepareCall("{call p_insert(?)}");//连接对应的存储过程 cstm.setString(1, "332211");//插入数据,该参数在第一位,则第一个参数为1 cstm.execute();//执行

二、查询例子

  补充:data表是博主自己创建的,内容在上面图中有给出。

1、查询结果单一

  (1)创建存储过程

    代码如下:

create or replace procedure p_query1(param1 in varchar2,param2 out varchar2) is begin --查询结果使用into 放入param2变量(查询结果单一) select info into param2 from data where info=param1; end; /

  (2)java中调用存储过程

    代码如下:

Class.forName("oracle.jdbc.driver.OracleDriver");//加载驱动 Connectionconn conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl", "scott", "tiger");//获得连接 CallableStatement cstm = conn.prepareCall("{call p_query1(?,?)}");//连接对应的存储过程p_query1 cstm.setString(1, "ccc");//设置查询数据为ccc,该参数在第1位 cstm.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR); //设置返回类型 cstm.execute();//执行 String result = cstm.getString(2);//得到返回数据 System.out.println("执行结果:"+result);

java代码中,设置返回类型要与创建存储过程中时一致。

    结果如图所示:

这里写图片描述

2、查询结果多个

  (1)创建package

    包名为pack_info,内部定义个游标类型。

create or replace package pack_info is --定义一个游标类型,名为c_info type c_info is ref cursor; end pack_info; /

  (2)创建存储过程

create or replace procedure p_query2(param1 in varchar2,param2 out pack_info.c_info) is begin --打开游标执行查询语句 open param2 for select * from data where info=param1; end; /

pack_info.c_info:代表使用pack_info中的c_info类型,该类型为游标类型。

  (3)java中调用存储过程

    代码如下:

Class.forName("oracle.jdbc.driver.OracleDriver");//加载驱动 Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl", "scott", "tiger");//获得连接 CallableStatement cstm = conn.prepareCall("{call p_query2(?,?)}");//连接对应的存储过程 cstm.setString(1, "ccc");//设置查询数据,该参数在第1位 cstm.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR); //设置返回类型为游标 cstm.execute();//执行 ResultSet result = (ResultSet) cstm.getObject(2);//得到返回数据 while (result.next()) { System.out.println(result.getString("info")); System.out.println(result.getString("num")); }

    结果如图所示:

这里写图片描述

 Oracle jar包csdn下载地址:http://download.csdn.net/download/abrazen_zz/9749345