oracle入门(7)——存储过程

【本文介绍】

熟悉了PL/SQL语法后,实现java调用oracle存储过程才是主要目的。本文将介绍如何写存储过程,java如何调用存储过程。

【存储过程介绍】

抛开专业的描述,存储过程就是在数据库里面写了一些函数,我们在代码(如java)里面调用这些函数实现对数据库的操作,避免了数据库对SQL语句的解析,对于需要发送多条SQL语句才能完成的数据库操作功能来说,速度上升了一个档次。不过程序在操纵数据库这一块 的维护性会降低,因为存储过程是写在数据库,不是写在程序里。

【如何写有能传值 并且 有返回值(非返回列表)存储过程】

  非返回列表的存储过程比较容易,直接在函数名后面带参数就好,同时赋予参数的类型。

  下面举一个例子:

存储过程代码:

CREATE OR REPLACE
procedure serachUserMethod(para1 IN VARCHAR2, para2 OUT VARCHAR2)
as
BEGIN
select "user"."name" into para2 from "user" where "user"."name"=para1;
end;

java代码

package com.zjm.www.test;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.Date;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class test {

    private static String driverclass="oracle.jdbc.driver.OracleDriver";
    // 本地
    private static String url="jdbc:oracle:thin:@localhost:1521:orcl";
    private static String username="test";
    private static String password="Aaa38324836";  

    private static String sql="";
    private static Connection conn = null;
    private static Statement stmt = null;
    private static ResultSet rs = null;
    private static CallableStatement proc = null;;

    @Before
    public void before(){
        try {
            Class.forName(driverclass).newInstance(); //加载驱动
            conn=DriverManager.getConnection(url,username,password); //获得连接
            stmt=conn.createStatement();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    @After
    public void after(){
        try {
            if(conn != null){
                conn.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            if(stmt != null){
                stmt.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            if(rs != null){
                rs.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     * 测试调用存储过程用时
     * @throws SQLException
     */
    @Test
    public void getDateByMethod(){

        int pre = (int) System.currentTimeMillis();

        try {       // 调用存储过程,问号个数代表参数存储过程的个数,且顺序要一一对应
            proc = conn.prepareCall("{ call serachUserMethod(?,?) }");       // 传值
            proc.setString(1, "AAAFB7E4B4D14475AD994310EF62EBA7");       // 注册返回值
            proc.registerOutParameter(2, Types.VARCHAR);       // 提交
            proc.execute();        // 取出返回值
            System.out.println(proc.getString(2));

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
        proc.close();
     } 

        int post=(int) System.currentTimeMillis();

        System.out.println("测试调用存储过程用时"+(post-pre));
    }

}

  注意,这里的proc.getString(2)中的数值2并非任意的,而是和存储过程中的 参数 列对应的,如果out是在第一个位置,那就是proc.getString(1),如果是第三个位置,就是proc.getString(3),当然也可以同时有多个返回值,那就是再多加几个out参数了。

【返回列表的存储过程】

  通过上面的例子,返回普通的int ,Stirng 类型的参数还是没问题的,可是这永远不能满足需求,我们一般要的是返回数据库里一个表的所有属性?当然可以。

第一步:建包(游标)。

  存储过程是不能直接返回一个对象(这个对象有N个属性)的,但它有另外一种方式,通过建立一个”指针“一样的”游标“ 指向某些数据,最后返回这个 ”游标“ ,我们就能顺着这个游标拿到我们想要的数据了。

create or replace package testpackage as
type Test_CURSOR is ref cursor;
end testpackage; 

第二步:创建存储过程。

  注意:返回参数的类型为我们刚刚建立的 ”游标“ 类型

create or replace procedure testc(p_cursor out testpackage.Test_CURSOR)
is
begin
open p_cursor for select * from T_AP_ZA_LYT_GNLK;
end  testc;  

第三步:java代码:

package com.zjm.www.test;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.Date;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class test {

    private static String driverclass="oracle.jdbc.driver.OracleDriver";
    // 本地
    private static String url="jdbc:oracle:thin:@localhost:1521:orcl";
    private static String username="test";
    private static String password="Aaa38324836";  

    private static String sql="";     // 记得表名要用""括起来
    private static Connection conn = null;
    private static Statement stmt = null;
    private static ResultSet rs = null;
    private static CallableStatement proc = null;;

    @Before
    public void before(){
        try {
            Class.forName(driverclass).newInstance(); //加载驱动
            conn=DriverManager.getConnection(url,username,password); //获得连接
            stmt=conn.createStatement();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    @After
    public void after(){
        try {
            if(conn != null){
                conn.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            if(stmt != null){
                stmt.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            if(rs != null){
                rs.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
    @Test
    public void getDateByMethod2(){
        int pre = (int) System.currentTimeMillis();

        try {
            proc = conn.prepareCall("{ call testc(?) }");       // 注册返回值参数,注意是游标类型
            proc.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR);
            proc.execute();       // 返回的数据存储在一个ResultSet里面
             ResultSet rs = (ResultSet)proc.getObject(1);
                while(rs.next())
                  {                 // getString(...)里面填的对应数据库 表 的字段名
                      System.out.println("<tr><td>" + rs.getString("id") + "</td><td>"+rs.getString("name")+"</td></tr>");
                  }
            proc.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }

        int post=(int) System.currentTimeMillis();

        System.out.println("测试调用存储过程用时"+(post-pre));
    }

}

oracle入门(7)——存储过程

时间: 2024-10-12 16:24:04

oracle入门(7)——存储过程的相关文章

oracle入门(8)——实战:支持可变参数、多种条件、多个参数排序、分页的存储过程查询组件

[本文介绍] 学了好几天,由于项目需要,忙活了两天,写出了个小组件,不过现在还只能支持单表操作.也没考虑算法上的优化,查询速度要比hibernate只快了一点点,可能是不涉及多表查询的缘故吧,多表的情况下才更快. 经非专业的测试,在有分页的情况下,在300万条数据里面查询的时间保持在0.1秒内.相同查询条件+分页的情况下,hibernate 用时0.3秒内. 不分页的条件下,查出来的数据越多,时间越长,时间长的话,跟hibernate相相比就没什么优势了. [思路] 我的思路是从java传来”字

oracle入门(4)——少而常用的命令

[本文介绍] 本文将介绍使用oracle的常用命令,不是”大全“,但少而实用. [命令介绍] 描述: 命令: [数据库]   (1)查看编码格式: select userenv('language') from dual; (2)设置编码格式为utf-8 (1) --先查看oracle数据库字符集:  select userenv('language') from dual; 查询结果: SIMPLIFIED CHINESE_CHINA.AL32UTF8 (2) --修改oracle数据库字符集

oracle入门(个人参考笔记)

Oracle入门 数据库服务器.数据库和表的关系 所谓安装数据库服务器,只是在机器上装了一个数据库管理程序,这个管理程序可以管理多个数据库,一般开发人员会针对每一个应用创建一个数据库. 为保存应用中实体的数据,一般会在数据库创建多个表,以保存程序中实体的数据. 数据库服务器.数据库和表的关系如图所示: oracle管理工具的介绍(1) sql*plus是oracle自带的工具软件,主要用于执行sql语句,pl\sql块. 如何使用: 1)在开始->程序->oracle oradb_home10

用sql语句导出oracle中的存储过程和函数

用sql语句导出oracle中的存储过程和函数: SET echo off ; SET heading off ; SET feedback off ; SPOOL 'C:/PRC.SQL' replace SELECT CASE WHEN LINE = 1 THEN 'CREATE OR REPLACE ' || TEXT WHEN LINE = MAX_LINE THEN TEXT || CHR(10 ) || '/' ELSE TEXT END FROM USER_SOURCE A LEF

Oracle中的存储过程

 pl/sql编程语言是Oracle中操作数据库最快的语言,而存储过程本质就是pl/sql,所以通过存储过程来对数据库进行CRUD是最有效的. 不再使用JDBC来进行CRUD操作,因为使用JDBC来进行CRUD操作效率低. 所以,Java通过调用存储过程,来间接调用pl/sql,达到对数据库的CRUD操作. 我们可以把CRUD操作封装到存储过程中,在程序中,调用存储过程即可. 以下是例子:来自于Oracle讲师赵强 --打印Hello World /* 调用存储过程 1. exec sayH

Oracle中的存储过程简单例子

---创建表 create table TESTTABLE ( id1  VARCHAR2(12), name VARCHAR2(32) ) select t.id1,t.name from TESTTABLE t insert into TESTTABLE (ID1, NAME) values ('1', 'zhangsan'); insert into TESTTABLE (ID1, NAME) values ('2', 'lisi'); insert into TESTTABLE (ID1

Oracle job procedure 存储过程定时任务(转自hoojo)

Oracle job procedure 存储过程定时任务 oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务. 一.查询系统中的job,可以查询视图 --相关视图 select * from dba_jobs; select * from all_jobs; select * from user_jobs; -- 查询字段描述 /* 字段(列) 类型 描述 JOB NUMBER 任务的唯一标示号 LOG_USER VARCHAR2(30) 提交任务的用户 P

oracle函数和存储过程有什么区别

1. 返回值的区别,函数有1个返回值,而存储过程是通过参数返回的,可以有多个或者没有 2.调用的区别,函数可以在查询语句中直接调用,而存储过程必须单独调用. 函数一般情况下是用来计算并返回一个计算结果而存储过程一般是用来完成特定的数据操作(比如修改.插入数据库表或执行某些DDL语句等等) 参数的返回情况来看: 如果返回多个参数值最好使用存储过程,如果只有一个返回值的话可以使用函数: 从调用情况来看: 如果在SQL语句(DML或SELECT)中调用的话一定是存储函数或存储的封装函数不可以是存储过程

Oracle定时器调用存储过程

1. 创建表 create table job_table(run_time date); 2. 创建存储过程 create or replace procedure job_proc is begin insert into job_table (run_time) values (sysdate); end; 3. 创建定时器job,并且指定为一分钟执行一次 declare job number; begin dbms_job.submit(job, 'job_proc;', sysdate