1、什么是存储过程。存储过程是数据库服务器端的一段程序,它有两种类型。一种类似于SELECT查询,用于检索数据,检索到的数据能够以数据集的形式返回给客户。另一种类似于INSERT或DELETE查询,它不返回数据,只是执行一个动作。有的服务器允许同一个存储过程既可以返回数据又可以执行动作。
2、什么时候需要用存储过程
  如果服务器定义了存储过程,应当根据需要决定是否要用存储过程。存储过程通常是一些经常要执行的任务,这些任务往往是针对大量的记录而进行的。在服务器上执行存储过程,可以改善应用程序的性能。这是因为:
.服务器往往具有强大的计算能力和速度。
.避免把大量的数据下载到客户端,减少网络上的传输量。
  例如,假设一个应用程序需要计算一个数据,这个数据需要涉及到许多记录。如果不使用存储过程的话,把这些数据下载到客户端,导致网络上的流量剧增。
  不仅如此,客户端可能是一台老掉牙的计算机,它的运算速度很慢。而改用存储过程后,服务器会很快地把数据计算出来,并且只需传递一个数据给客户端,其效率之高是非常明显的。
3、存储过程的参数
  要执行服务器上的存储过程,往往要传递一些参数。这些参数分为四种类型:
  第一种称为输入参数,由客户程序向存储过程传递值。
  第二种称为输出参数,由存储过程向客户程序返回结果。
  第三种称为输入/输出参数,既可以由客户程序向存储过程传递值,也可以由存储过程向客户程序返回结果。
  第四种称为状态参数,由存储过程向客户程序返回错误信息。
  要说明的是,并不是所有的服务器都支持上述四种类型的参数,例如,InterBase就不支持状态参数。
4、Oracle 存储过程的基本语法
  1.基本结构

  1. CREATE OR REPLACEPROCEDURE 存储过程名字
  2. (
  3. 参数1 IN NUMBER,
  4. 参数2 IN NUMBER
  5. ) IS
  6. 变量1 INTEGER :=0;
  7. 变量2 DATE;
  8. BEGIN
  9. END 存储过程名字

2.SELECT INTO STATEMENT
  将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条
  记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND)
  例子:

  1. BEGIN
  2. SELECT col1,col2 into 变量1,变量2 FROM typestruct where xxx;
  3. EXCEPTION
  4. WHEN NO_DATA_FOUND THEN
  5. xxxx;
  6. END;

一:无返回值的存储过程
存储过程为:

  1. CREATE OR REPLACE PROCEDURE TESTA(PARA1 IN VARCHAR2,PARA2 IN VARCHAR2) AS
  2. BEGIN
  3. INSERT INTO HYQ.B_ID (I_ID,I_NAME) S (PARA1, PARA2);
  4. END TESTA;

然后呢,在Java里调用时就用下面的代码:

  1. package com.hyq.src;
  2. import java.sql.*;
  3. import java.sql.ResultSet;
  4. public class TestProcedureOne {
  5. public TestProcedureOne() {
  6. }
  7. public static void main(String[] args ){
  8. String driver = "oracle.jdbc.driver.OracleDriver";
  9. String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521: hyq ";
  10. Statement stmt = null;
  11. ResultSet rs = null;
  12. Connection conn = null;
  13. CallableStatement cstmt = null;
  14. try {
  15. Class.forName(driver);
  16. conn = DriverManager.getConnection(strUrl, " hyq ", " hyq ");
  17. CallableStatement proc = null;
  18. proc = conn.prepareCall("{ call HYQ.TESTA(?,?) }");
  19. proc.setString(1, "100");
  20. proc.setString(2, "TestOne");
  21. proc.execute();
  22. }
  23. catch (SQLException ex2) {
  24. ex2.printStackTrace();
  25. }
  26. catch (Exception ex2) {
  27. ex2.printStackTrace();
  28. }
  29. finally{
  30. try {
  31. if(rs != null){
  32. rs.close();
  33. if(stmt!=null){
  34. stmt.close();
  35. }
  36. if(conn!=null){
  37. conn.close();
  38. }
  39. }
  40. }
  41. catch (SQLException ex1) {
  42. }
  43. }
  44. }
  45. }

当然了,这就先要求要建张表TESTTB,里面两个字段(I_ID,I_NAME)。
二:有返回值的存储过程(非列表)
存储过程为:

  1. CREATE OR REPLACE PROCEDURE TESTB(PARA1 IN VARCHAR2,PARA2 OUT VARCHAR2) AS
  2. BEGIN
  3. SELECT INTO PARA2 FROM TESTTB WHERE I_ID= PARA1;
  4. END TESTB;

在java里调用时就用下面的代码:

  1. package com.hyq.src;
  2. public class TestProcedureTWO {
  3. public TestProcedureTWO() {
  4. }
  5. public static void main(String[] args ){
  6. String driver = "oracle.jdbc.driver.OracleDriver";
  7. String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521:hyq";
  8. Statement stmt = null;
  9. ResultSet rs = null;
  10. Connection conn = null;
  11. try {
  12. Class.forName(driver);
  13. conn = DriverManager.getConnection(strUrl, " hyq ", " hyq ");
  14. CallableStatement proc = null;
  15. proc = conn.prepareCall("{ call HYQ.TESTB(?,?) }");
  16. proc.setString(1, "100");
  17. proc.registerOutParameter(2, Types.VARCHAR);
  18. proc.execute();
  19. String testPrint = proc.getString(2);
  20. System.out.println("=testPrint=is="+testPrint);
  21. }
  22. catch (SQLException ex2) {
  23. ex2.printStackTrace();
  24. }
  25. catch (Exception ex2) {
  26. ex2.printStackTrace();
  27. }
  28. finally{
  29. try {
  30. if(rs != null){
  31. rs.close();
  32. if(stmt!=null){
  33. stmt.close();
  34. }
  35. if(conn!=null){
  36. conn.close();
  37. }
  38. }
  39. }
  40. catch (SQLException ex1) {
  41. }
  42. }
  43. }
  44. }
  45. }

注意,这里的proc.getString(2)中的数值2并非任意的,而是和存储过程中的out列对应的,如果out是在第一个位置,那就是proc.getString(1),如果是第三个位置,就是proc.getString(3),当然也可以同时有多个返回值,那就是再多加几个out参数了。
三:返回列表
由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了.所以要分两部分,
1, 建一个程序包。如下:

  1. CREATE OR REPLACE PACKAGE TESTPACKAGE  AS
  2. TYPE Test_CURSOR IS REF CURSOR;
  3. end TESTPACKAGE;

2,建立存储过程,存储过程为:

  1. CREATE OR REPLACE PROCEDURE TESTC(p_CURSOR out TESTPACKAGE.Test_CURSOR) IS
  2. BEGIN
  3. OPEN p_CURSOR FOR SELECT * FROM HYQ.TESTTB;
  4. END TESTC;

可以看到,它是把游标(可以理解为一个指针),作为一个out 参数来返回值的。
在java里调用时就用下面的代码:

  1. package com.hyq.src;
  2. import java.sql.*;
  3. import java.io.OutputStream;
  4. import java.io.Writer;
  5. import java.sql.PreparedStatement;
  6. import java.sql.ResultSet;
  7. import oracle.jdbc.driver.*;
  8. public class TestProcedureTHREE {
  9. public TestProcedureTHREE() {
  10. }
  11. public static void main(String[] args ){
  12. String driver = "oracle.jdbc.driver.OracleDriver";
  13. String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521:hyq";
  14. Statement stmt = null;
  15. ResultSet rs = null;
  16. Connection conn = null;
  17. try {
  18. Class.forName(driver);
  19. conn = DriverManager.getConnection(strUrl, "hyq", "hyq");
  20. CallableStatement proc = null;
  21. proc = conn.prepareCall("{ call hyq.testc(?) }");
  22. proc.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR);
  23. proc.execute();
  24. rs = (ResultSet)proc.getObject(1);
  25. while(rs.next())
  26. {
  27. System.out.println("<tr><td>" + rs.getString(1) + "</td><td>"+rs.getString(2)+"</td></tr>");
  28. }
  29. }
  30. catch (SQLException ex2) {
  31. ex2.printStackTrace();
  32. }
  33. catch (Exception ex2) {
  34. ex2.printStackTrace();
  35. }
  36. finally{
  37. try {
  38. if(rs != null){
  39. rs.close();
  40. if(stmt!=null){
  41. stmt.close();
  42. }
  43. if(conn!=null){
  44. conn.close();
  45. }
  46. }
  47. }
  48. catch (SQLException ex1) {
  49. }
  50. }
  51. }
  52. }

在这里要注意,在执行前一定要先把oracle的驱动包放到class路径里,否则会报错。

面试概率极大的Oracle存储过程的更多相关文章

  1. 123 c#调用oracle存储过程返回数据集 --通过oracle存储过程返回数据集

    c#调用oracle存储过程返回数据集 2008-12-20 10:59:57|  分类: net|字号 订阅   CREATE OR REPLACE PACKAGE pkg_tableTypeIS  ...

  2. oracle 存储过程

    来自:http://www.jb51.net/article/31805.htm Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 I ...

  3. Oracle存储过程语法

    原文链接:http://www.jb51.net/article/31805.htm Oracle存储过程基本语法 存储过程  1 CREATE OR REPLACE PROCEDURE 存储过程名  ...

  4. ORACLE存储过程调用Web Service

    1. 概述 最近在ESB项目中,客户在各个系统之间的服务调用大多都是在oracle存储过程中进行的,本文就oracle存储过程调用web service来进行说明.其他主流数据库,比如mysql和sq ...

  5. Oracle存储过程基本语法介绍

    Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR RE ...

  6. MyBatis调用Oracle存储过程

    MyBatis调用Oracle存储过程 1.无输入和输出参数的存储过程 2.带有输入和输出参数的存储过程 3.返回游标的存储过程 mybatis中的配置文件代码 <resultMap type= ...

  7. Oracle存储过程(转)

    Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR RE ...

  8. Oracle存储过程中异常Exception的捕捉和处理

    Oracle存储过程中异常的捕捉和处理 CREATE OR REPLACE Procedure Proc_error_process ( v_IN in Varchar2, v_OUT Out Var ...

  9. Oracle存储过程动态创建临时表/存储过程执行权限问题--AUTHID CURRENT_USER

    关于Oracle存储过程执行权限问题的解决 http://blog.sina.com.cn/s/blog_6ceed3280101hvlo.html (2014-04-02 04:06:28) 转载▼ ...

随机推荐

  1. 使用file_get_contents提交http post

    以前使用curl获取需要登陆内容的文章,但其实,自5.0开始,使用file_get_contents就可以完成.(前提是开启了allow_url_fopen),下面以一个简单的例子说明一下:1.先看一 ...

  2. iPhone设备及屏幕适配

    // // Common.h // 微信 // // #ifndef Common_h #define Common_h // iPhone设备及屏幕适配 //4的设备 #define KDevice ...

  3. 在WPF中使用CefSharp嵌入浏览器(转)

    在WPF中使用CefSharp嵌入浏览器   日常开发中,我们需要将一些Web页面嵌入到桌面客户端软件中.下面我们使用CefSharp嵌入浏览器来实现. 首先先介绍一下CefSharp嵌入式浏览器,它 ...

  4. hasura graphql 模式拼接demo

    实际上通过上边的介绍,模式拼接和hasura 基本没啥关系了,就是使用graphql-bindings 进行schema 合并了 基本demo 这个是官方提供的demo git clone https ...

  5. nsq 安装试用

    因为是mac 系统安装试用brew install nsq 安装 brew install nsq 组件说明 nsqd 守护进程进行消息的接受,缓存以及传递消息给客户端,需要配置nsqlookupd地 ...

  6. linux下配置python环境 django创建helloworld项目

    linux下配置python环境 1.linux下安装python3 a. 准备编译环境(环境如果不对的话,可能遇到各种问题,比如wget无法下载https链接的文件) yum groupinstal ...

  7. AngularJS 最佳实践

    AngularJS 是一个 Web 应用框架,它实现了前端的 MVC 架构,能让开发人员很方便地实现业务逻辑. 举个栗子,要做到下面的效果,以前可能需要写一连串的 JavaScript 代码绑定 N ...

  8. python 命令行参数获取

    import argparse parser = argparse.ArgumentParser(description='Real-Time Filtering evaluation script ...

  9. MariaDB Galera Cluster的配置测试

    参考的https://fykuan.hsnuer.net/blog/2015/01/23/debian-%E4%B8%8A%E5%AE%89%E8%A3%9D-mariadb-galera-clust ...

  10. 2019第十届蓝桥杯C/C++

    这是我第一次参加蓝桥杯比赛,比完后,有点低于预期,自己的发挥低于预期,赛事水准也低于预期. 教室里面很多同学的电脑出现问题,举办学校也没有完善的应急方案,有一部分同学11点钟才可以做题. 附题目pdf ...