rule 发表于 2018-9-13 13:13:04

用Java调用Oracle存储过程总结(一)

  一、无返回值的存储过程
  测试表:
  -- Create table
  create table TESTTB
  (

  >  NAME VARCHAR2(30)
  )
  tablespace BOM
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
  initial 64K
  minextents 1
  maxextents unlimited
  );
  例: 存储过程为(当然了,这就先要求要建张表TESTTB,里面两个字段(I_ID,I_NAME)。
  ):
  CREATE OR REPLACE PROCEDURE TESTA(PARA1 IN VARCHAR2, PARA2 IN VARCHAR2) AS
  BEGIN
  INSERT INTO BOM.TESTTB(ID, NAME) VALUES (PARA1, PARA2);
  END TESTA;
  在Java里调用时就用下面的代码:
  package com.yiming.procedure.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;

  public>  public TestProcedureDemo1() {
  }
  public static void main(String[] args) {
  String driver = "Oracle.jdbc.driver.OracleDriver";
  String strUrl = "jdbc:Oracle:thin:@10.20.30.30:1521:vasms";
  Statement stmt = null;
  ResultSet rs = null;
  Connection conn = null;
  CallableStatement proc = null;
  try {
  Class.forName(driver);
  conn = DriverManager.getConnection(strUrl, "bom", "bom");
  proc = conn.prepareCall("{ call BOM.TESTA(?,?) }");
  proc.setString(1, "100");
  proc.setString(2, "TestOne");
  proc.execute();
  } catch (SQLException ex2) {
  ex2.printStackTrace();
  } catch (Exception ex2) {
  ex2.printStackTrace();
  } finally {
  try {
  if (rs != null) {
  rs.close();
  if (stmt != null) {
  stmt.close();
  }
  if (conn != null) {
  conn.close();
  }
  }
  } catch (SQLException ex1) {
  }
  }
  }
  }
  二、有返回值的存储过程(非列表)
  例:存储过程为:
  CREATE OR REPLACE PROCEDURE TESTB(PARA1 IN VARCHAR2, PARA2 OUT VARCHAR2) AS
  BEGIN

  SELECT NAME INTO PARA2 FROM TESTTB WHERE>  END TESTB;
  在Java里调用时就用下面的代码:
  package com.yiming.procedure.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;

  public>  public static void main(String[] args) {
  String driver = "Oracle.jdbc.driver.OracleDriver";
  String strUrl = "jdbc:Oracle:thin:@10.20.30.30:1521:vasms";
  Statement stmt = null;
  ResultSet rs = null;
  Connection conn = null;
  CallableStatement proc = null;
  try {
  Class.forName(driver);
  conn = DriverManager.getConnection(strUrl, "bom", "bom");
  proc = conn.prepareCall("{ call BOM.TESTB(?,?) }");
  proc.setString(1, "100");
  proc.registerOutParameter(2, Types.VARCHAR);
  proc.execute();
  String testPrint = proc.getString(2);
  System.out.println("=testPrint=is=" + testPrint);
  } catch (SQLException ex2) {
  ex2.printStackTrace();
  } catch (Exception ex2) {
  ex2.printStackTrace();
  } finally {
  try {
  if (rs != null) {
  rs.close();
  if (stmt != null) {
  stmt.close();
  }
  if (conn != null) {
  conn.close();
  }
  }
  } catch (SQLException ex1) {
  }
  }
  }
  }
  注意,这里的proc.getString(2)中的数值2并非任意的,而是和存储过程中的out列对应的,如果out是在第一个位置,那就是proc.getString(1),如果是第三个位置,就是proc.getString(3),当然也可以同时有多个返回值,那就是再多加几个out参数了。
  oracle视频教程请关注:http://down.51cto.com/4202939/up

页: [1]
查看完整版本: 用Java调用Oracle存储过程总结(一)