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

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


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


Sql代码 收藏代码
  1. CREATEORREPLACETYPEEMPARRAYisVARRAY(20)OFVARCHAR2(30)



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


Sql代码 收藏代码
  1. CREATEORREPLACEFUNCTIONgetEmpArrayRETURNEMPARRAYASl_dataEmpArray:=EmpArray();CURSORc_empISSELECTenameFROMEMP;BEGINFORemp_recINc_empLOOPl_data.extend;l_data(l_data.count):=emp_rec.ename;ENDLOOP;RETURNl_data;END;



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


Java代码 收藏代码
  1. publicstaticvoidmain(){//...
  2. OracleCallableStatementstmt=(OracleCallableStatement)conn.prepareCall("begin?:=getEMpArray;end;");
  3. //Thenameweusebelow,EMPARRAY,hastomatchthenameofthetypedefinedinthePL/SQLStoredFunction
  4. stmt.registerOutParameter(1,OracleTypes.ARRAY,"EMPARRAY");
  5. stmt.executeUpdate();//GettheARRAYobjectandprintthemetadataassosiatedwithit
  6. ARRAYsimpleArray=stmt.getARRAY(1);
  7. System.out.println("thetypeofthearrayis"+simpleArray.getSQLTypeName());
  8. System.out.println("thetypecodeoftheelementinthearrayis"+simpleArray.getBaseType());
  9. System.out.println("thelengthofthearrayis"+simpleArray.length());//Printthecontentsofthearray
  10. String[]values=(String[])simpleArray.getArray();
  11. for(inti=0;i<values.length;i++)
  12. System.out.println("row"+i+"='"+values[i]+"'");//...
  13. }



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

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




Java代码 收藏代码
  1. packageDemo;
  2. importjava.io.*;
  3. //ImportingtheOracleJdbcdriverpackagemakesthecodemorereadable
  4. importoracle.jdbc.*;
  5. importjava.sql.*;
  6. classOracleRef
  7. {
  8. publicstaticvoidmain(Stringargs[])
  9. throwsSQLException
  10. {
  11. //Loadthedriver
  12. DriverManager.registerDriver(neworacle.jdbc.OracleDriver());
  13. Stringurl="jdbc:oracle:thin:@localhost:1521:yangyang";
  14. try{
  15. Stringurl1=System.getProperty("JDBC_URL");
  16. if(url1!=null)
  17. url=url1;
  18. }catch(Exceptione){
  19. //Ifthereisanysecurityexception,ignoreit
  20. //andusethedefault
  21. }
  22. //Connecttothedatabase
  23. Connectionconn=
  24. DriverManager.getConnection(url,"scott","tiger");
  25. //Createthestoredprocedure
  26. init(conn);
  27. //PrepareaPL/SQLcall
  28. CallableStatementcall=
  29. conn.prepareCall("{?=calljava_refcursor.job_listing(?)}");
  30. //FindoutalltheSALESperson
  31. call.registerOutParameter(1,OracleTypes.CURSOR);
  32. call.setString(2,"SALESMAN");
  33. call.execute();
  34. ResultSetrset=(ResultSet)call.getObject(1);
  35. //Dumpthecursor
  36. while(rset.next())
  37. System.out.println(rset.getString("ENAME"));
  38. //Closealltheresources
  39. rset.close();
  40. call.close();
  41. conn.close();
  42. }
  43. //Utilityfunctiontocreatethestoredprocedure
  44. staticvoidinit(Connectionconn)
  45. throwsSQLException
  46. {
  47. Statementstmt=conn.createStatement();
  48. stmt.execute("createorreplacepackagejava_refcursoras"+
  49. "typemyrctypeisrefcursorreturnEMP%ROWTYPE;"+
  50. "functionjob_listing(jvarchar2)returnmyrctype;"+
  51. "endjava_refcursor;");
  52. stmt.execute("createorreplacepackagebodyjava_refcursoras"+
  53. "functionjob_listing(jvarchar2)returnmyrctypeis"+
  54. "rcmyrctype;"+
  55. "begin"+
  56. "openrcforselect*fromempwherejob=j;"+
  57. "returnrc;"+
  58. "end;"+
  59. "endjava_refcursor;");
  60. stmt.close();
  61. }
  62. }


你可能感兴趣的:(oracle存储过程)