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 EMPARRAYAS l_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[i] +"'" );//...
}
在上面的代码段中,可以看到 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 readable
import 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 procedure
static 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();
}
}
分享到:
相关推荐
本示例演示Hibernate 3.2呼叫Oracle的存贮过程和函数,以及通过Hibernate的Query接口简化JDBC的开发步骤--两个步骤得到List集合。使用这种方式开发可以要求开发人员不需要太了解Hibernate框架,但是需要开发人员非常...
学习 游标 视图 自定义函数不二选择,我觉得看完之后学到东西了
1.1.3 调用存储过程 5 1.2存储函数(FUNCTIONE) 6 1.2.1 创建存储函数 6 1.2.2 删除存储函数 7 1.3 包(package) 7 1.3.1 包的基本结构 7 1.3.2 包的创建 7 1.3.3 调用包中元素 9 1.3.4 包的修改和删除 9 第二章 ...
本例是我工作中的一些实操例子,亦是我工作日志,记录在此,既可作为我自己的总结,也可以此分享给同行借鉴。 入参是字符串格式的xml,目的...3.JDBC调用存储过程语句 4.创建Groovy脚本 5.xml入参示例 6.json出参示例
oracle数据库游标实验报告!oracle数据库游标实验报告!oracle数据库游标实验报告!
设有学生表student(学号sno, 姓名sname, 年龄 sage,系别dept)、课程表Course(课程号cno,课程名称cname)和选课表sc(学号sno,课程号cno,成绩grade),用Oracle ...(4)调用pkg_student程序包中相应的函数或存储过程
NULL 博文链接:https://fengtiejun.iteye.com/blog/1603851
Oracle存储过程语法 Oracle的存储过程语法如下: create procedure 存储过程名称(随便取) is 在这里可以定义常量、变量、游标、复杂数据类型这里可以定义变量、常量 begin 执行部分 end; (2)带参数的存储...
电子商务网站案例下载:(数据库脚本,java调用示例,.net(c#)调用示例 说明:一个电子商务网站的oracle数据库完整设计,包括: ...Oracle常用命令14(.net / java代码调用(sql代码、程序包过程))
№3调用包中的过程和函数 20 №4获取有关包中的函数和过程的信息 21 №5删除包 21 10触发器 21 №1触发器运行的时机 21 №2设置示例触发器的准备工作 22 №3创建触发器 22 №4激活触发器 23 №5获取有关触发器的信息...
(主要分事务处理,游标处理,存储过程方法调用,数组处理,异常处理等。) (2)oracle与mysql区别比较。 (主要包含:语法及结构区别,函数区别,数据类型区别等。) (3)ORACLE与MYSQL常用函数对比。
8.3.3 调用程序包中的函数/存储过程 157 8.3.4 程序包中的变量 158 8.4 本章实例 159 8.5 本章小结 161 8.6 习题 161 …… 第9章 游标(教学视频:36分钟) 162 第10章 触发器(教学视频:58分钟) 178 第11...
标题 存储过程及函数 procedure 的建立和调用 function的建立和调用 标题 参数的调用(in 模式为按址调用,out / in out模式为按值调用。NOCOPY 强行转换成按址调用)。 标题 软件包及封装 软件包(PACKAGE...
《Oracle11g从入门到精通》面向数据库管理人员和数据库开发人员,从实际角度出发,系统地介绍了数据库和Oracle的相关概念和原理、Oracle的数据库管理(如安装与启动,用户权限、备份与恢复等)...
15.3.3 使用EXECUTE语句调用存储过程 15.3.4 使用CREATE FUNCTION创建函数 15.3.5 使用Enterprise Manager创建存储过程和函数 15.3.6 修改和删除存储过程和函数 15.4 Oracle中的流控制语句 15.4.1 ...
选定某一主题,运用oracle数据库,以及相关技术...2、块、游标、储存过程、函数、触发器等的设计及调用正确; 3、报告文档说明条理清晰,格式正确,写作规范 4、系统运行良好,有一定的独立性与创新性,态度积极认真;
《Oracle11g从入门到精通》面向数据库管理人员和数据库开发人员,从实际角度出发,系统地介绍了数据库和Oracle的相关概念和原理、Oracle的数据库管理(如安装与启动,用户权限、备份与恢复等)...