怎样在java代码中调用Oracle的存储过程

首先必须新建一张表:TEST(此过程用到Oracle sql developer 向导建表的)
  CREATE TABLE "SCOTT"."TEST"   ( 

    "TID" NUMBER(*,0) NOT NULL ENABLE,       

     "TNAME" VARCHAR2(20 BYTE) NOT NULL ENABLE,

     /*前两行看不懂,我建议你不要往下看了*/
      CONSTRAINT "TANYANGTEST_PK" PRIMARY KEY ("TID")    --设TID为主键
      USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 
      STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
      PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
      TABLESPACE "USERS"  ENABLE
       ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
      STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
      PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
      TABLESPACE "USERS" ;

     CREATE OR REPLACE TRIGGER "SCOTT"."TANYANG_TRG"  --添加触发器,设主键为自增长
    before insert on tanyangtest
    for each row
    BEGIN
      SELECT TANYANGTEST_SEQ.NEXTVAL INTO :NEW.TID FROM DUAL;
    END;

    /
    ALTER TRIGGER "SCOTT"."TANYANG_TRG" ENABLE;

1.下面建立名为PRO_INSERTEST存储过程:

create or replace procedure PRO_INSERTEST

( t_tname in varchar2
) as
begin
 insert into TEST(tname) values(t_tname);
 COMMIT;
end PRO_INSERTEST;

下面先测试,测试的值为:  T_TNAME := '我的名字叫java';

DECLARE
  TNAME VARCHAR2(200);
BEGIN
  T_TNAME := '我的名字叫java';

  TEST(
    TNAME => T_TNAME
  );
END;

由于主键是自增长的,在这不必声明变量,但在写insert 语句时必须写清楚要插入的字段名,否则就会按照偶序列增长。

这时会在test表中产生一条新的记录。

首先将驱动加到lib中

然后我们在来看java的代码:

package com.ty.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 class BaseConn {

 


public static void main(String[] args) {

 

// 连接驱动

 private static final String DRIVER_CLASS = "oracle.jdbc.driver.OracleDriver";
 // 连接字符串
 private static final String DATABADE_URL = "jdbc:oracle:thin:@localhost:1521:orcl";//此处为连接的数据库名称
 // 用户名
 private static final String DATABASE_USER = "scott";
 // 用户密码
 private static final String DATABASE_PASSWORD = "123";
 private static Connection conn = null;

 private static CallableStatement cstmt=null;

 


  try {
   Class.forName(DRIVER_CLASS).newInstance();
  } catch (Exception e) {
   System.out.println("注册驱动异常!");
   e.printStackTrace();
  }

  
  
  try {
   conn = DriverManager.getConnection(DATABADE_URL, DATABASE_USER,DATABASE_PASSWORD);
     
  } catch (SQLException e) {
   System.out.println("连接数据库驱动异常!");
   e.printStackTrace();
  }
  
  if(conn!=null){
   System.out.println("连接成功");
  }else{
   System.out.println("连接失败");
  }


   String sql="{call PRO_INSERTEST(?)}";


 try {
   cstmt = conn.prepareCall(sql)

 cstmt.setString(1,'我是一条新的数据!');//此处必须对应存储过程中的变量的类型
    cstmt.executeUpdate();
  } catch (SQLException e) {
   
   e.printStackTrace();
  }
  }

}


2..再建立名为PRO_UPDATETEST存储过程:

create or replace PROCEDURE PRO_UPDATETEST
( T_TID IN NUMBER
, T_TNAME IN VARCHAR2
) AS
BEGIN
  UPDATE TEST SET tname= t_tname WHERE tid= t_tid;
  COMMIT;
END PRO_UPDATE;

然后测试:刚才已经向test添加了两条记录,现在修改第一条记录

DECLARE
  T_TID NUMBER;
  T_TNAME VARCHAR2(200);
BEGIN
  T_TID := 1;
  T_TNAME := '我是被修改的记录';

  PRO_UPDATE(
    T_TID => T_TID,
    T_TNAME => T_TNAME
  );
END;

上面的java代码已经给出了连接数据库的方法,在这只需修改sql语句,然后设置参数:

 String sql="{call PRO_UPDATETEST(?,?)}";

 cstmt.setInt(1,2);//修改第二条记录

 cstmt.setString(2,'我是被修改的第二条记录!');
    cstmt.executeUpdate();

然后编译代码,查看数据库中是否修改记录了?

你可能感兴趣的:(java,java,oracle,存储,string,database,数据库)