Ihavegotyou 发表于 2013-2-3 10:28:21

Oracle存储过程(或函数)返回游标、动态数组与java调用

1:如何从 PL/SQL 存储函数返回数组


在数据库中创建一个 SQLVARRAY 类型,在本例中,它是 VARCHAR2 类型。 作为 scott/tiger 用户连接到数据库,并在 SQL 提示符处执行以下命令。


CREATE OR REPLACE TYPE EMPARRAY is VARRAY(20) OF VARCHAR2(30)


然后创建下面的函数,它返回一个 VARRAY。


CREATE OR REPLACE FUNCTION getEmpArray RETURN EMPARRAYASl_data EmpArray := EmpArray();CURSOR c_emp IS SELECT ename FROM EMP;BEGIN    FOR emp_rec IN c_emp LOOP      l_data.extend;      l_data(l_data.count) := emp_rec.ename;    END LOOP;    RETURN l_data;END;


在数据库中创建函数后,可以从 java 应用程序调用它并在应用程序中获得数组数据。


public static void main( ) {//...OracleCallableStatement stmt =(OracleCallableStatement)conn.prepareCall( "begin ?:= getEMpArray; end;" );    // The name we use below, EMPARRAY, has to match the name of the type defined in the PL/SQL Stored Function   stmt.registerOutParameter( 1, OracleTypes.ARRAY,"EMPARRAY" );   stmt.executeUpdate();    // Get the ARRAY object and print the meta data assosiated with it   ARRAY simpleArray = stmt.getARRAY(1);    System.out.println("the type of the array is " +simpleArray.getSQLTypeName());    System.out.println("the type code of the element in the array is "+simpleArray.getBaseType());    System.out.println("the length of the array is " + simpleArray.length());    // Print the contents of the array    String[] values = (String[])simpleArray.getArray();    for( int i = 0; i < values.length; i++ )      System.out.println( "row " + i + " = '" + values +"'" );//...}


在上面的代码段中,可以看到 OracleCallableSatatement 用于调用 PL/SQL 存储函数。在执行 PL/SQL 存储函数前,将返回的数据类型注册为 OracleTypes.ARRAY,并且指定在数据库中定义的类型名称 (EMPARRAY)。然后执行 PL/SQL 存储函数并获得 oracle.sql.ARRAY 形式的返回值。 oracle.sql.ARRAY 类拥有的方法可以获得关于数组的详细信息,如数组类型、数组长度等。使用 oracle.sql.ARRAY 的 getArray() 方法获得数组的内容并将内容打印出来。

2.函数怎样返回游标,以及如何调用




package Demo;import java.io.*;//Importing the Oracle Jdbc driver package makes the code more readableimport oracle.jdbc.*;import java.sql.*;class OracleRef{public static void main (String args [])    throws SQLException{ // Load the driver DriverManager.registerDriver(new oracle.jdbc.OracleDriver()); String url = "jdbc:oracle:thin:@localhost:1521:yangyang"; try {   String url1 = System.getProperty("JDBC_URL");   if (url1 != null)   url = url1; } catch (Exception e) {   // If there is any security exception, ignore it   // and use the default } // Connect to the database Connection conn =   DriverManager.getConnection (url, "scott", "tiger"); // Create the stored procedure init (conn); // Prepare a PL/SQL call CallableStatement call =   conn.prepareCall ("{ ? = call java_refcursor.job_listing (?)}"); // Find out all the SALES person call.registerOutParameter (1, OracleTypes.CURSOR); call.setString (2, "SALESMAN"); call.execute (); ResultSet rset = (ResultSet)call.getObject (1); // Dump the cursor while (rset.next ())   System.out.println (rset.getString ("ENAME")); // Close all the resources rset.close(); call.close(); conn.close();}// Utility function to create the stored procedurestatic void init (Connection conn)    throws SQLException{ Statement stmt = conn.createStatement (); stmt.execute ("create or replace package java_refcursor as " +"type myrctype is ref cursor return EMP%ROWTYPE; " +"function job_listing (j varchar2) return myrctype; " +"end java_refcursor;"); stmt.execute ("create or replace package body java_refcursor as " +"function job_listing (j varchar2) return myrctype is " +"    rc myrctype; " +"begin " +"    open rc for select * from emp where job = j; " +"    return rc; " +"end; " +"end java_refcursor;"); stmt.close();}}
页: [1]
查看完整版本: Oracle存储过程(或函数)返回游标、动态数组与java调用