JDBC调用存储过程和函数

来源:互联网 发布:淘宝首页备份在哪里的 编辑:程序博客网 时间:2024/05/21 08:54

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中提取元数据信息:

      元数据:表述数据的数据

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

 

原创粉丝点击