90类型输出参数的PLSQL存储过程及其Java调用

合集下载

存储过程输出参数的调用(简单例子)

存储过程输出参数的调用(简单例子)

存储过程输出参数的调⽤(简单例⼦)如:存储过程如下:create PROC [dbo].[exchange_UserFinance]@uId int,@uType int,@uAmount decimal(9,2),@uAfterRemainAmount decimal(9,2),@uOPid int,@uText varchar(200),@uNote1 varchar(200),@uNote2 varchar(200),@uNote3 varchar(200),@uRemainAmount decimal(9,2) outputASDECLARE @uTime datetimeSET @uTime=getdate()SET @uRemainAmount=0.00BEGINBEGIN TRANINSERT INTO [IP_UserFinance]([uId],[uTime],[uType],[uAmount],[uAfterRemainAmount],[uOPid],[uText],[uNote1],[uNote2],[uNote3])VALUES(@uId,@uTime,@uType,@uAmount,@uAfterRemainAmount,@uOPid,@uText,@uNote1,@uNote2,@uNote3) IF @@RowCount<>1BEGINROLLBACK TRANSET @uRemainAmount=0RETURNENDUPDATE [IP_UserRemainAmount] SET [uRemainAmount] = @uAfterRemainAmount,[uTime] = @uTime WHEREIF @@RowCount<>1BEGINROLLBACK TRANSET @uRemainAmount=0RETURNENDCOMMIT TRANSET @uRemainAmount=(SELECT uRemainAmount FROM IP_UserRemainAmount WHERE )END.net调⽤public static decimal modifyOfficeOrAgentFinance(IP_UserFinance agentmodel){SqlParameter[] parms = new SqlParameter[]{new SqlParameter ("@uId",SqlDbType.Int ,4),};parms[0].Value = agentmodel.uId;object remainagent = null;try{remainagent = SqlHelper.ExecuteScalar(SqlHelper.connectionString, CommandType.StoredProcedure, "WSSelectIP_UserInFoFinanceOne", parms);if (remainagent == null){return -1;}}catch(Exception){return 0;}SqlParameter[] parameters = {new SqlParameter("@uId", SqlDbType.Int,4),new SqlParameter("@uType", SqlDbType.Int),new SqlParameter("@uAmount", SqlDbType.Decimal,9),new SqlParameter("@uAfterRemainAmount", SqlDbType.Decimal,9),new SqlParameter("@uOPid", SqlDbType.Int,4),new SqlParameter("@uText", SqlDbType.VarChar,200),new SqlParameter("@uNote1", SqlDbType.VarChar,200),new SqlParameter("@uNote2", SqlDbType.VarChar,200),new SqlParameter("@uNote3", SqlDbType.VarChar,200),new SqlParameter("@uRemainAmount", SqlDbType.Decimal)};if (Convert.ToDecimal(remainagent) < agentmodel.uAmount){return -2;}parameters[0].Value = agentmodel.uId;parameters[1].Value = agentmodel.uType;parameters[2].Value = agentmodel.uAmount;parameters[3].Value = Decimal.Add(Convert.ToDecimal(remainagent), agentmodel.uAmount);parameters[4].Value = agentmodel.uOPid;parameters[5].Value = agentmodel.uText;parameters[6].Value = agentmodel.uNote1;parameters[7].Value = agentmodel.uNote2;parameters[8].Value = agentmodel.uNote3;parameters[9].Direction = ParameterDirection.Output;try{Convert.ToDecimal(SqlHelper.ExecuteScalar(SqlHelper.connectionString, CommandType.StoredProcedure, "exchange_UserFinance", parameters));return Convert.ToDecimal(parameters[9].Value);}catch{return 0.00m;}}。

存储过程调用java代码的方法

存储过程调用java代码的方法

存储过程调用java代码的方法存储过程是一组SQL语句的集合,可以被视为一种预编译的SQL 语句,可以通过存储过程调用来实现对数据库的操作。

在Java中,我们可以通过以下方法来调用存储过程:1. 使用JDBC调用存储过程使用JDBC调用存储过程需要以下步骤:1)获取数据库连接。

2)创建CallableStatement对象,使用存储过程名称作为参数创建对象。

3)设置输入参数和输出参数。

输入参数可以通过setXXX()方法设置,输出参数可以使用registerOutParameter()方法注册。

4)执行存储过程。

可以使用execute()或executeUpdate()方法执行。

5)获取输出参数。

以下是一个简单的示例:```try(Connection conn = DriverManager.getConnection(url, user, password)) {CallableStatement cs = conn.prepareCall('{call procedure_name(?, ?)}');cs.setInt(1, 1); // 设置输入参数cs.registerOutParameter(2, Types.VARCHAR); // 注册输出参数cs.execute(); // 执行存储过程String result = cs.getString(2); // 获取输出参数System.out.println(result);} catch (SQLException e) {e.printStackTrace();}```2. 使用ORM框架调用存储过程使用ORM框架调用存储过程需要根据不同的框架进行配置。

以下是使用MyBatis调用存储过程的示例:1)在Mapper XML文件中定义存储过程调用语句。

```<select id='callProcedure' statementType='CALLABLE'>{call procedure_name(#{param1, mode=IN,jdbcType=INTEGER}, #{param2, mode=OUT, jdbcType=VARCHAR})}</select>```2)在Java代码中调用Mapper方法。

七、PLSQL存储函数和存储过程及打断点如何调试

七、PLSQL存储函数和存储过程及打断点如何调试

七、PLSQL存储函数和存储过程及打断点如何调试1、存储过程和函数的概念:ORACLE 提供可以把PL/SQL 程序存储在数据库中,并可以在任何地⽅来运⾏它。

这样就叫存储过程或函数。

过程和函数统称为PL/SQL⼦程序,他们是被命名的PL/SQL块,均存储在数据库中,并通过输⼊、输出参数或输⼊/输出参数与其调⽤者交换信息。

过程和函数的唯⼀区别是函数总向调⽤者返回数据,⽽过程则不返回数据常见的单词:pragma 编译指⽰instantiable 实例化overriding 覆盖重写static member 静态成员delimited 划定…的界限identifier 标识符reverse 反向2、存储函数的格式|存储函数格式|create or replace function func_name(dept_id number,salary number)return varchar2is-- 函数使⽤过程中,需要声明的变量,记录类型,cursorbegin--函数的执⾏体,如果有返回值需要returnreturn 'helloworld'|| v_logo;--commit;如果此处是进⾏insert、delete、update操作,可以通过提交进⾏更改,⽆需再调⽤存储函数后再进⾏提交exception--处理函数执⾏过程中的异常end;详解:1)因为函数需要返回⼀个值, 所以RETURN 包含返回结果的数据类型.2)函数名后⾯是⼀个可选的参数列表, 其中包含IN, OUT 或IN OUT 标记. 参数之间⽤逗号隔开IN 参数标记表⽰传递给函数的值在该函数执⾏中不改变;OUT 标记表⽰⼀个值在函数中进⾏计算并通过该参数传递给调⽤语句;IN OUT 标记表⽰传递给函数的值可以变化并传递给调⽤语句. 若省略标记, 则参数隐含为IN3)A、存储函数:有返回值,创建完成后,如何调⽤:⽅法⼀select function() from dual;⽅法⼆:set serveroutput on;var aaa varchar2(10);call hello_world() into :aaa;⽅法三:begindbms_output.put_line(hello_world());end;B、存储过程:由于没有返回值,创建完成后,不能使⽤select语句,只能使⽤pl/sql块执⾏|实例⼀:创建⼀个⽆参函数|create or replace function hello_worldreturn varchar2isbeginreturn 'hello world';end;如何调⽤:⽅法⼀select hello_world() from dual;⽅法⼆set serveroutput on;var aaa varchar2(10);call hello_world() into :aaa;⽅法三:begindbms_output.put_line(hello_world());end;⽅法四:declarev_bianling varchar2(40);beginv_bianling := hello_world;dbms_output.put_line(v_bianling);end;|实例⼆:创建⼀个有参函数(传进去的参数v_classid的值是不变的)|求⼀个班学⽣的总薪⽔create or replace function get_sal(v_classid number)return numberisv_sumsal number(10):=0;cursor sal_cursor is select sal from student where classid =v_classid; beginfor c in sal_cursor loopv_sumsal:=v_sumsal+c.sal;end loop;return v_sumsal;end;|实例三:创建⼀个有参函数(传进去的参数v_classid的值是不变的)|OUT型参数 对于实例⼆中的传进去的参数⼀般是不变的In是输⼊类型,⽽out是输⼊输出类型的如果⼀个形参⽤out修饰 那么它就会在函数中被赋值,并且可以当成⼀个数传出去(结合例⼦理解)create or replace function get_sal1(v_classid number,total_sal out number)return numberisv_sumsal number(10):=0;cursor sal_cursor is select sal from student where classid =v_classid;begintotal_sal:=0;for c in sal_cursor loopv_sumsal:=v_sumsal+c.sal;total_sal:=total_sal +1;end loop;return v_sumsal;end;如何调⽤:declarev_total_sal number(5);begindbms_output.put_line(get_sal1(1, v_total_sal));dbms_output.put_line(v_total_sal);end;⽆返回值 但是可以定义⼀个 out型参数把 值传出来的例⼦如下:create or replace function get_sal2(v_classid number,total_sal out number)return numberiscursor sal_cursor is select sal from student where classid =v_classid;begintotal_sal:=0;for c in sal_cursor looptotal_sal:= total_sal+c.sal;end loop;return total_sal;end;如何调⽤:declarev_classid number(5):=1;v_total_sal number(10):=0;begindbms_output.put_line(get_sal2(v_classid,v_total_sal));dbms_output.put_line(v_total_sal);end;3.plsqldep存储过程如何打断点进⾏调试1)edit pkg_regulatory_tax.;在相应的代码处添加断点、点击执⾏按钮进⾏编译2)test pkg_regulatory_tax.p_load_auto;输⼊传参信息,点击上⾯的执⾏按钮进⾏调试。

Java,PLSQL调用 ORACLE存储函数以及存储过程

Java,PLSQL调用 ORACLE存储函数以及存储过程

黑马程序员:Java,PL/SQL 调用 ORACLE 存储函数以及存储过程准备工作创建表 --- 创建测试用表 schoolCREATE TABLE school( ID number, --学校 id ---学校名NAME VARCHAR2(30) ); --- 添加数据INSERT into school values(1,'北京大学'); INSERT into school values(2,'南京大学'); INSERT into school values(1,'东京大学'); COMMIT;编写 java 代码连接数据库,获取 Connection 连接对象 public class OracleUtil { // 加载 Oracle 驱动 static { try { Class.forName("oracle.jdbc.driver.OracleDriver"); } catch (ClassNotFoundException e) {黑马程序员郑州中心 编著e.printStackTrace(); } } // 获取数据库连接public static Connection getConnection() throws SQLException { Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@iP:1521:orcl", "system", "密码"); return connection; } } ——-存储函数——1.什么是存储函数存储函数又称为自定义函数。

可以接收一个或多个参数,返回一个结果。

在函数 中我们可以使用 PL/SQL 进行逻辑的处理。

Oracle集合类型输出参数的PLSQL存储过程及其Java调用

Oracle集合类型输出参数的PLSQL存储过程及其Java调用

Oracle集合类型输出参数的PL/SQL存储过程及其Java调用- -有段时间为了用存储过程做统计报表,写了这文章。

现在的java的数据库-关系映射技术似乎不提倡用存储过程,其实存储过程更能发挥数据库的效率。

1 引言存储过程因其执行效率高、与事务处理的结合、运行更安全等优点,在数据库应用程序中被广泛采用。

PL/SQL是用于从各种环境中访问Oracle数据库的一种编程语言,它与数据库服务器集成在一起,PL/SQL编写的存储过程编译效率高,网络系统开销小,同时PL/SQL直观性好,是大多数人的选择。

以Number、Varchar等基本标量类型为输出参数的PL/SQL存储过程,每个输出参数只能返回一个对应值。

而在实际数据库应用程序中,尤其是在进行系统综合查询统计时,往往需要返回二维数组或结果集,这时应考虑在存储过程中使用集合这种数据结构。

对于集合,我们可以一次把许多元素作为一个整体进行操作,也可以对集合中的单个元素进行操作,使用方便、灵活。

2 PL/SQL存储过程及Java程序的编写2.1 索引表作为输出参数索引表是无约束的,其大小的唯一限制(除可用内存外)就是它的关键字BINARY_INTEGER类型所能表示数值的约束(-2147483647...+2147483647),其元素不需要按任何特定顺序排列。

在声明时,我们不需要指定其大小,而且对索引表的元素可以直接赋值,不用初始化,可见使用索引表极其方便。

2.1.1存储过程的编写我们可以在PL/SQL语句块中定义索引表,但作为输出参数的索引表,必须要在包(package)里定义,方法如下:create or replace package out_param is---- 定义了元素是varchar2类型的一个索引表类型type out_index_table_typ is table of varchar2(50) index by binary_integer;end out_param;接下来就可以在pl/sql存储过程里引用在包里定义的索引表类型:create or replace procedure testPro1(in_param in varchar2,o_table out out_param. out_index_table_typ ) isbegin-------这里略去程序体end testPro1;其中,返回的索引表类型前必须用包名加上句点来引用out_param. out_index_table_typ 2.1.2 J ava程序的编写索引表与数据库表很形似,有key和value两列,但它不是真正的数据库表,不可以存储到数据库中。

java调用存储过程、存储函数

java调用存储过程、存储函数

java调⽤存储过程、存储函数需要⽤到的接⼝接⼝ CallableStatementJDK⽂档对改接⼝的说明:public interface CallableStatementextends⽤于执⾏ SQL 存储过程的接⼝。

JDBC API 提供了⼀个存储过程 SQL 转义语法,该语法允许对所有 RDBMS 使⽤标准⽅式调⽤存储过程。

此转义语法有⼀个包含结果参数的形式和⼀个不包含结果参数的形式。

如果使⽤结果参数,则必须将其注册为 OUT 参数。

其他参数可⽤于输⼊、输出或同时⽤于⼆者。

参数是根据编号按顺序引⽤的,第⼀个参数的编号是 1。

{?= call <procedure-name>[(<arg1>,<arg2>, ...)]} -------存储函数的sql,第⼀个?代表返回类型{call <procedure-name>[(<arg1>,<arg2>, ...)]} -------存储过程的sqlIN 参数值是使⽤继承⾃的 set ⽅法设置的。

在执⾏存储过程之前,必须注册所有 OUT 参数的类型;它们的值是在执⾏后通过此类提供的 get ⽅法获取的。

CallableStatement 可以返回⼀个对象或多个 ResultSet 对象。

多个 ResultSet 对象是使⽤继承⾃的操作处理的。

为了获得最⼤的可移植性,某⼀调⽤的 ResultSet 对象和更新计数应该在获得输出参数的值之前处理。

例⼦程序对oracle的scott/tiger⽤户的emp表操作存储过程,查询员⼯信息create or replace procedure queryEmpInfo(eno in number,pename out varchar2,psal out number,pjob out varchar2)asbeginselect ename,sal,job into pename,psal,pjob from emp where empno=eno;end;存储函数:create or replace function queryEmpImcome(eno in number)return numberas--变量psal emp.sal%type;pcomm m%type;beginselect sal,comm into psal,pcomm from emp where empno=eno;return (psal+nvl(pcomm,0))*12;end;jdbc⼯具类package com.lhy.util;import java.sql.*;/*** JDBC⼯具类,⼀般⼯具类final。

跟我学Oracle从入门到精通培训教程——PLSQL中的存储过程及应用

跟我学Oracle从入门到精通培训教程——PLSQL中的存储过程及应用

(2)在命令窗口中通 过查询目标数据库表中 的数据验证该存储过程 的执行结果 select * from someOneTable;
4、在PL/SQL代码块中调用带默认输入参数的存储过程示例 (1)在SQL窗口中输入下面的PL/SQL代码块以调用该存储 过程
注意此时不需要再使用“execute”命令字执行该存储 过程,而是直接采用存储过程的名称(Oracle中的存储过 程是作为一个独立执行语句而被调用的)。 (2)验证该存储过程的执行结果是否正确
(3)在PLSQL Developer中创建存储过程procedureDemo (4)本示例的存储过程的代码示例 (5)编译该存储过程 (6)在PLSQL Developer工具中执行存储过程块 (7)在SQL窗口中验证存储过程的执行结果
二、创建带输入参数的存储过程
1、创建带输入参数的存储过程
2、编程该存储过程体代码
三、创建带输入输出参数的存储过程
1、创建带输入输出参数的存储过程
注意对于带in out类型的参数不能定义默认值,否则 会出现下面的错误。
2、编程该存储过程
3、编译该存储过程
4、执行带输入输出参数的存储过程 (1)在PL/SQL代码块中调用该存储过程
(2)在控 制台中的输 出的结果
(3)通过查询目标数据库表以验证该存储过程的执行结果
3、编译该存储过程
4、采用默认参数值方式执行带默认输入参数的存储过程例 (1)新建一个命令窗口并采用默认参数值方式执行该存储 过程
(2)在命令窗口中通过查询目标数据库表中的数据验证 该存储过程的执行结果
3、以指定的参数值方式执行带默认输入参数的存储过程 示例 (1)在调用存储过程时间给定具体的参数值
3、创建存储过程的 语法 (1)定义存储过程 的语法 (2)应用要点 其中的“Create or replace procedure”是一个 SQL语句,它通知Oracle数据库去创建一个名称为 procedure_name的存储过程,如果已经存在该存 储过程就覆盖它; 而Is或者As关键词表明后面将跟随一个PL/SQL体, 在该PL/SQL体中同样需要应用BEGIN关键词定义 PL/SQL 体的开始,而应用END关键词定义 PL/SQL 体的结束。 如果在存储过程中需要变量,则这些变量的定义 应该要放在BEGIN关键词之前。

java调用存储过程的三种方式

java调用存储过程的三种方式

java调用存储过程的三种方式这里为大家谈谈Java存储过程调用,我们可以利用Java存储过程简化数据库操作, 利用Java存储过程沟通SQL、XML、Java、J2EE和Web服务。

创建需要的测试表:create table Test(tid varchar2(10),tname varchar2(10));一:无返回值的存储过程存储过程为:CREATE OR REPLACE PROCEDURE TESTA(PARA1 IN VARCHAR2,PARA2 IN VARCHAR2) ASBEGININSERT INTO HYQ.B_ID (I_ID,I_NAME) VALUES (PARA1, PARA2);END TESTA;然后呢,在 java 里调用时就用下面的代码:package com.hyq.src;import java.sql.*;import java.sql.ResultSet;public class TestProcedureOne {public TestProcedureOne() {}public static void main(String[] args ){String driver = "oracle.jdbc.driver.OracleDriver";String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521: hyq ";Statement stmt = null;ResultSet rs = null;Connection conn = null;CallableStatement cstmt = null;try {Class.forName(driver);conn = DriverManager.getConnection(strUrl, " hyq ", " hyq "); CallableStatement proc = null;proc = conn.prepareCall("{ call HYQ.TESTA(?,?) }");proc.setString(1, "100");proc.setString(2, "T estOne");proc.execute();}catch (SQLException ex2) {ex2.printStackTrace();}catch (Exception ex2) {ex2.printStackTrace();}finally{try {if(rs != null){rs.close();if(stmt!=null){stmt.close();}if(conn!=null){conn.close();}}}catch (SQLException ex1) {}}}}当然了,这就先要求要建张表TESTTB, 里面两个字段(I_ID ,I_NAME )。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Oracle集合类型输出参数的PL/SQL存储过程及其Java调用现在的java的数据库-关系映射技术似乎不提倡用存储过程,其实存储过程更能发挥数据库的效率。

1 引言存储过程因其执行效率高、与事务处理的结合、运行更安全等优点,在数据库应用程序中被广泛采用。

PL/SQL是用于从各种环境中访问Oracle数据库的一种编程语言,它与数据库服务器集成在一起,PL/SQL编写的存储过程编译效率高,网络系统开销小,同时PL/SQL 直观性好,是大多数人的选择。

以Number、Varchar等基本标量类型为输出参数的PL/SQL存储过程,每个输出参数只能返回一个对应值。

而在实际数据库应用程序中,尤其是在进行系统综合查询统计时,往往需要返回二维数组或结果集,这时应考虑在存储过程中使用集合这种数据结构。

对于集合,我们可以一次把许多元素作为一个整体进行操作,也可以对集合中的单个元素进行操作,使用方便、灵活。

2 PL/SQL存储过程及Java程序的编写2.1 索引表作为输出参数索引表是无约束的,其大小的唯一限制(除可用内存外)就是它的关键字BINARY_INTEGER类型所能表示数值的约束(-2147483647...+2147483647),其元素不需要按任何特定顺序排列。

在声明时,我们不需要指定其大小,而且对索引表的元素可以直接赋值,不用初始化,可见使用索引表极其方便。

2.1.1存储过程的编写我们可以在PL/SQL语句块中定义索引表,但作为输出参数的索引表,必须要在包(package)里定义,方法如下:create or replace package out_param is---- 定义了元素是varchar2类型的一个索引表类型type out_index_table_typ is table of varchar2(50) index by binary_integer;end out_param;接下来就可以在pl/sql存储过程里引用在包里定义的索引表类型:create or replaceprocedure testPro1(in_param in varchar2, o_table out out_param. out_index_table_typ ) is begin-------这里略去程序体end testPro1;其中,返回的索引表类型前必须用包名加上句点来引用out_param. out_index_table_typ 2.1.2 Java程序的编写索引表与数据库表很形似,有key和value两列,但它不是真正的数据库表,不可以存储到数据库中。

因此索引表不能使用SQL进行操作,这样它的内容不能通过一个标准的SELECT语句返回游标得到。

这一点与嵌套表有很大不同。

由存储过程返回的索引表可以映射成java数组类型、JDBC Datatypes的BigDecimal[]数组类型和oracle的Datum[]数组。

有一点要注意,尽管索引表中的元素不一定要按任何特定顺序排列,其元素可以借助于任意有效关键字而插入,但对映射数组元素的引用应该从1开始,而且要连续,否则映射成数组时会出现null元素。

下面示例为将索引表映射成java数组类型。

import oracle.jdbc.*;import oracle.sql.*;import java.sql.*;public class ReturnIndexTable{ Connection ociconn=null;OracleCallableStatement stmt =null;public String[] getTable(String in_param){ String[] reAry=null;try{ OracleDriver S_Driver=null;if(S_Driver==null)S_Driver=new oracle.jdbc.OracleDriver();DriverManager.registerDriver(S_Driver);String url="jdbc:oracle:oci8:@test";String user="user";String password=" password";ociconn= DriverManager.getConnection(url,user,password);stmt =(OracleCallableStatement)ociconn.prepareCall("begin testPro1(?,?); end;");// 返回的索引表最大长度(可以大于索引表实际长度)int maxLen =31;// 索引表元素类型int elemSqlType = OracleTypes.VARCHAR;//索引表元素长度(CHAR, VARCHAR or RAW),其它元素类型可忽略该项值,但该参数仍须定义int elemMaxLen=50;stmt.setString(1,in_param);// 注册返回参数stmt.registerIndexTableOutParameter(2,maxLen,elemSqlType,elemMaxLen);stmt.execute();// 返回数组类型reAry=(String[])stmt.getPlsqlIndexTable(2);}catch (Exception e){e.printStackTrace();}finally{return reAry;}}//关闭连接.............}2.2 可变数组作为输出参数可变数组和另外两种集合类型不同,其元素在内存中是连续存储的,且在大小方面有一个固定的上界。

声明时需要指定该数组中元素的最大数目(可变数组的大小可以用EXTEND 方法来增加,但不能被扩展超过所声明的极限大小)。

可变数组的元素被赋值之前,必须使用构造器进行初始化。

元素插入数组时应从索引1开始,连续插入。

2.2.1 存储过程的编写可变数组的定义方法如下:create or replace type testArray is varray(5) of number(3)PL/SQL存储过程里调用可变数组作为输出参数:create or replace function getTestArray return testArrayaso_data testArray:= testArray ();beginfor v_count in 1..5 loopo_data.extend;o_data(v_count):= v_count;end loop;return o_data;end;2.2.2 Java程序的编写由存储过程返回的可变数组同样可以映射成java数组类型。

但Java程序调用存储过程返回的可变数组方式和索引表方式却不相同,这一点应注意,具体方法如下:public static void main( ){......//调用存储过程OracleCallableStatement stmt =(OracleCallableStatement)conn.prepareCall ( "begin ? := getTestArray; end;" );stmt.registerOutParameter( 1, OracleTypes.ARRAY," testArray" );stmt.executeUpdate();// 得到ARRAY 对象ARRAY simpleArray = stmt.getARRAY(1);//转换为java数组String[ ] values = (String[])simpleArray.getArray();//输出数组内容for( int i = 0; i < values.length; i++ )System.out.println( "row " + i + " = '" + values[i] +"'" );}2.3 基于嵌套表游标作为输出参数存储过程中使用嵌套表,并不是直接将嵌套表作为输出参数,而是对嵌套表"造型"后以游标形式输出。

嵌套表的基本功能与索引表相同,但嵌套表可以使用SQL进行操作,其内容可通过SELECT 语句查询并"造型"后以游标形式返回。

在大多数的查询统计中,常常需要返回结果集,这时使用嵌套表就尤其方便。

笔者在开发过程中深刻体会到使用对象嵌套表可以解决绝大多数的查询统计问题。

下面着重介绍如何在存储过程里利用对象类型的嵌套表。

对于任意的统计分析表格,我们可以将其简化成下面的输出形式:这样我们把每一行看作是一个对象实例,该行的每一列则可以看作是该对象的一个属性,下面通过构造对象,然后对包含对象的嵌套表进行造型,返回游标得到结果集。

2.3.1 存储过程的编写首先构造统计对象如下:create or replace type TestObj as object(vname varchar2(20), --名称item1 number, --统计项目1item2 number, --统计项目2item3 number, --统计项目3item4 number --统计项目4);构造包含对象类型的嵌套表:create or replace type TestNestTable as table of TestObj;定义对索引表"造型"后的输出的游标类型:create or replace package out_param istype out_cur is ref cursor;下面是嵌套表作为输出参数的存储过程:create or replace procedure testPro2(o_cur out out_param.out_cur ) is---- 包含对象的嵌套表变量的声明v_objTable TestNestTable:= TestNestTable ();begin--嵌套表变量的使用v_objTabl.extend;v_objTable(1):= TestObj(‘张三',12,123,123,34);v_objTabl.extend;v_objTable(2):= TestObj(‘李四,22,223,223,234);--对嵌套表进行"造型"返回游标open o_cur for select * from Table(cast (v_objTable as TestNestTable) ); end testPro2;2.3.2 Java程序的编写//从游标返回结果集public ResultSet getCursor(){try{......stmt =(CallableStatement )conn.prepareCall("call testPro2(?)");//注册游标对象类型stmt.registerOutParameter(1,OracleTypes.CURSOR);stmt.execute();//返回结果集ResultSet Rs=(ResultSet)stmt.getObject(1);}catch(Exception e){}return Rs;}2.4 嵌套表作为输入参数2.4.1 存储过程的编写造统计对象和嵌套表通2.3.1。

相关文档
最新文档