JDBC调用存储过程和函数

本文介绍如何使用Java JDBC调用Oracle数据库中的存储过程和函数,包括基本步骤、参数设置、执行方法及获取多行结果集的技术细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.JAVA中如何来调用存储过程

       CallableStatement:用于执行SQL存储过程和函数的接口

       简单步骤:

              A.编写你自己的存储过程(当然,你最好先通过测试)

              B.编写的JAVA调用类

              C.得到期望的输出

       A:声明存储过程:

              CREATE OR REPLACE PROCEDURE PRO_QUERY_DEPT(

                     P_DEPTNO IN DEPT.DEPTNO%TYPE,

                     P_DNAME OUT DEPT.DNAME%TYPE

                     )

              AS

                     BEGIN

                            SELECT DNAME INTO P_DNAME FROM DEPT WHERE DEPTNO = P_DEPTNO;

                            DBMS_OUTPUT.PUT_LINE(P_DNAME);

              EXCEPTION

                     WHEN OTHERS THEN

                            DBMS_OUTPUT.PUT_LINE(SQLCODE||SQLERRM);

              END;

          Oracle下执行存储过程的实例:

          declare  
                    name   varchar2(50);
                    birthday date;  
          begin  
                    PRO_UNITTEST_STUDENTS(1,name,birthday);   
                   dbms_output.put_line(name); 
                   dbms_output.put_line(birthday); 
          end;

       B:使用JDBC来调用:

              Class.forName("oracle.jdbc.driver.OracleDriver");

              String url = "java:oracle:thin:@127.0.0.1:1521:GUZHE";

              String user = "scott";

              String password = "tiger";

              Connection con = DriverManager.getConnection(url, user, password); //连接数据库

  

              String sql = "{call PRO_QUARY_DEPT(?,?)}"; //执行的SQL语句,用CALL子句+存储过程名+参数来调用

  

              CallableStatement cst = con.prepareCall(sql);  //可执行SQL存储过程和函数的SQL语句分析容器

  

              cst.setInt(1, 30); //设置第一个参数的值

              cst.registerOutParameter(2, Types.VARCHAR); //声明第二个参数是OUT输出的,并说明其返回类型

              cst.execute(); //执行

  

              String str = null;

              str = cst.getString(2);//得到第二个参数的值,即希望得到的输出数据

              System.out.println(str);

 

2.使用JDBC来调用函数

       其过程与JDBC调用存储过程非常类似

       声明函数:

              CREATE OR REPLACE FUNCTION FUNC_QUERY_DEPT(

                     P_DEPTNO IN DEPT.DEPTNO%TYPE,

                     P_DNAME OUT DEPT.DNAME%TYPE

                     )

              RETURN VARCHAR2

              AS

              BEGIN

                     SELECT DNAME INTO P_DNAME FROM DEPT WHERE DEPTNO = P_DEPTNO;

                     DBMS_OUTPUT.PUT_LINE(P_DNAME);

                     RETURN 'OK';

              EXCEPTION

                     WHEN OTHERS THEN

                            DBMS_OUTPUT.PUT_LINE(SQLCODE||SQLERRM);

              END;

       oracle下调用函数:

       sql>var income number
       sql>call annual.income('SCOTT') into :imcome;
       sql>print income

       使用JDBC来调用这个函数:

              Class.forName("oracle.jdbc.driver.OracleDriver");

              String url = "java:oracle:thin:@127.0.0.1:1521:GUZHE";

              String user = "scott";

              String password = "tiger";

              Connection con = DriverManager.getConnection(url, user, password); //连接数据库

 

              String sql = "{? = call FUNC_QUARY_DEPT(?,?)}"; //执行的SQL语句,用CALL字句+函数名+参数来调用

     

              CallableStatement cst = con.prepareCall(sql);  //可执行SQL存储过程和函数的SQL语句分析容器

     

              cst.setInt(2, 30); //设置第二个参数的值

              cst.registerOutParameter(1, Types.VARCHAR); //声明第一个参数是OUT输出的,并说明其返回类型(第一个问号,函数的返回值)

              cst.registerOutParameter(3, Types.VARCHAR); //声明第三个参数是OUT输出的,并说明其返回类型(第三个问号)

              cst.execute(); //执行

     

              String str = null;

              str = cst.getString(2);//得到第二个参数的值,即希望得到的输出数据

              System.out.println(str);

 

3.使用JDBC调用函数或者过程获取多行查询结果,需要使用游标

       两种方式:

       A.在包中声明一个游标,然后定义一个存储过程或者函数,并使用已定义的游标作为输出参数

       首先需要定义一个游标类型,以便可以在函数的参数中引用这个类型

              CRATE OR REPLACE PACKAGE PACK_DEPT

              IS

                     TYPE CUR IS REF CURSOR;

              END;

       再次定义一个过程,其参数为刚刚在包中定义的游标类型

              CREATE OR REPLACE PROCEDURE PRO_FIND_DEPTS(

                     MY_CUR OUT CUR PACK_DEPT.CUR

                     )

              IS

              BEGIN

                    OPEN MY_CUR FOR SELECT * FROM DEPT;

              END;

       JDBC中调用:

              Class.forName("oracle.jdbc.driver.OracleDriver");

              String url = "java:oracle:thin:@127.0.0.1:1521:GUZHE";

              String user = "scott";

              String password = "tiger";

              Connection con = DriverManager.getConnection(url, user, password); //连接数据库

     

              String sql = "{call PRO_FIND_DEPTS(?)}"; //执行的SQL语句,用CALL字句+函数名+参数来调用

   

              CallableStatement cst = con.prepareCall(sql);  //可执行SQL存储过程和函数的SQL语句分析容器

     

              cst.registerOutParameter(1, OracleTypes.CURSOR); //声明第一个参数是OUT输出的,并说明其返回类型

  

              cst.execute(); //执行

     

              ResultSet rs = (ResultSet)cst.getObject();//得到第一个参数的值,即希望得到的游标

              while(rs.next()){

                    System.out.println(rs.getString("DNAME"));

              }

       B.使用系统默认的游标:SYS_REFCURSOR

              先定义要调用的过程

              CREATE OR REPLACE PROCEDURE PRO_ALL_DEPTS(

                     MY_CUR OUT SYS_REFCURSOR

                     )

              IS

              BEGIN

                     OPEN MY_CUR FOR SELECT * FROM DEPT;

              EXCEPTION

                     WHEN OTHERS THEN

                            DBMS_OUTPUT.PUT_LINE(SQLCODE||SQLERRM);

              END;

       JDBC中的定义过程与上面一样

4.JDBC中提取元数据信息:

       元数据:表述数据的数据

       数据库的元数据:指的是字段名,字段类型,字段长度等

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值