oracle 参数类型 存储过程 获取_使用JDBC从存储过程中获取Oracle表类型

我试图了解使用JDBC从Oracle存储过程/函数获取表数据的不同方法 . 六种方式如下:

过程将模式级表类型作为OUT参数返回

过程将包级别表类型作为OUT参数返回

过程将包级游标类型作为OUT参数返回

函数返回模式级表类型

函数返回包级表类型

函数返回包级游标类型

以下是PL / SQL中的一些示例:

-- schema-level table type

CREATE TYPE t_type AS OBJECT (val VARCHAR(4));

CREATE TYPE t_table AS TABLE OF t_type;

CREATE OR REPLACE PACKAGE t_package AS

-- package level table type

TYPE t_table IS TABLE OF some_table%rowtype;

-- package level cursor type

TYPE t_cursor IS REF CURSOR;

END library_types;

-- and example procedures:

CREATE PROCEDURE p_1 (result OUT t_table);

CREATE PROCEDURE p_2 (result OUT t_package.t_table);

CREATE PROCEDURE p_3 (result OUT t_package.t_cursor);

CREATE FUNCTION f_4 RETURN t_table;

CREATE FUNCTION f_5 RETURN t_package.t_table;

CREATE FUNCTION f_6 RETURN t_package.t_cursor;

我已成功用JDBC调用3,4和6:

// Not OK: p_1 and p_2

CallableStatement call = connection.prepareCall("{ call p_1(?) }");

call.registerOutParameter(1, OracleTypes.CURSOR);

call.execute(); // Raises PLS-00306. Obviously CURSOR is the wrong type

// OK: p_3

CallableStatement call = connection.prepareCall("{ call p_3(?) }");

call.registerOutParameter(1, OracleTypes.CURSOR);

call.execute();

ResultSet rs = (ResultSet) call.getObject(1); // Cursor results

// OK: f_4

PreparedStatement stmt = connection.prepareStatement("select * from table(f_4)");

ResultSet rs = stmt.executeQuery();

// Not OK: f_5

PreparedStatement stmt = connection.prepareStatement("select * from table(f_5)");

stmt.executeQuery(); // Raises ORA-00902: Invalid data type

// OK: f_6

CallableStatement call = connection.prepareCall("{ ? = call f_6 }");

call.registerOutParameter(1, OracleTypes.CURSOR);

call.execute();

ResultSet rs = (ResultSet) call.getObject(1); // Cursor results

显然,我很难理解

如何从存储过程中的OUT参数检索模式级和包级表类型

如何从存储的函数中检索包级别的表类型

我似乎无法找到任何关于此的文档,因为每个人总是使用游标而不是表类型 . 也许是因为它不可能?我更喜欢表类型,因为它们是正式定义的,可以使用字典视图(至少是模式级表类型)来发现 .

注意:显然,我可以编写一个包装函数来返回OUT参数和包级表类型 . 但我更喜欢干净的解决方案 .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值