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. 征信接口调用,解析(xml)

    数据传输格式报文格式:xml public CisReportRoot queryCisReport(PyQueryBean pyQueryBean) throws Exception { CisRe ...

  2. 一起来点React Native——你必须要会点FlexBox布局

    一.FlexBox布局 1.1 FlexBox是什么意思呢? flexible(形容词):能够伸缩或者很容易变化,以适应外界条件的变化 box(名词):通用的矩形容器 1.2  什么是FlexBox布 ...

  3. POJ3177 Redundant Paths【tarjan边双联通分量】

    LINK 题目大意 给你一个有重边的无向图图,问你最少连接多少条边可以使得整个图双联通 思路 就是个边双的模板 注意判重边的时候只对父亲节点需要考虑 你就dfs的时候记录一下出现了多少条连向父亲的边就 ...

  4. streamsets 错误记录处理

    我们可以在stage 级别,或者piepline 级别进行error 处理配置 pipeline的错误记录处理 discard(丢踢) send response to Origin pipeline ...

  5. socket编程---UDP

    头文件 #include <sys/types.h> #include <sys/socket.h> 函数原型 int sendto (int s, const void *b ...

  6. Java多线程编程核心技术,第六章

    1,饿汉模式/单例模式,一开始就新建一个静态变量,后面用getInstance()都是同一个变量 2,懒汉模式/单例模式,在getInstance()才会new一个对象,在第一个有了后不会继续创建 3 ...

  7. bzoj 3144 [Hnoi2013]切糕——最小割

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3144 一根纵轴上切一个点,可以把一根纵轴上的点连成一串来体现.自己的写法是每个点连向前一个点 ...

  8. linux中bin与sbin目录的作用及区别介绍

    linux中bin与sbin目录的作用及区别介绍 本文介绍下,linux中的二个主要目录:bin与sbin,它们的作用与区别,学习linux的朋友可以参考下 在linux系统中,有两个重要的目录:bi ...

  9. SQL相关简单游标

    BEGIN TRY Create Table #Temp_Table_Record_Stat ( .... ) DECLARE table_Cursor CURSOR FOR SELECT objec ...

  10. APN与VPDN的主要区别

    VPDN APN 安全性 二次认证,加密 一次认证,没有加密 企业成本 高 低 对GGSN要求 可接受动态配置LNS参数信息,对GGSN性能影响小. 静态配置GRE隧道参数,性能影响较大,部分厂家对G ...