Java调用存储过程(返回:简单类型VARCHAR、自定义对象STRUCT、列表数组VARRAY)

ORACLE 存储过程 练习七 数组专题

 写在前面的废话

由于工作需要经常用到 ORACLE存储过程 其中数组是不可避免的一组成元素.那么让我们来体会一下 ORACLE存储过程的数组到低是如何使用的....

首先数组是一个数据类型(TYPE). 需要如下语句进行创建和声明.

create or replace type myvarray_list as varray(10) of varchar2(50)


1 数组作为过程的输入参数

 

复制代码

create or replace procedure show_list_P(
/*用于显示数组*/
   p_varlist in myvarray_list
 )
 is
begin
 for x in 1..p_varlist.count loop
 dbms_output.put_line('p_varlist('||x||')='||p_varlist(x));
 end loop;
 end;

复制代码

 -- 调用

 call show_list_P(myvarray_list('Oracle','DB2','Sql Server','mySql','DBA'));

 

2 数组作为函数的返回值

复制代码

create or replace function OUTPUT_list_P return myvarray_list
--  PL/SQL存储过程里调用可变数组作为输出参数:
as
       o_data   myvarray_list:=myvarray_list(); 
begin
  for v_count in 1..5 loop
      o_data.extend; 
      o_data(v_count):= v_count;
   --    dbms_output.put_line('list('||v_count||')='||o_data(v_count));
    end loop;
   return o_data;
end OUTPUT_list_P;

复制代码

复制代码

--调用
declare
v_list myvarray_list;
v_count number;
begin
select OUTPUT_list_P()into v_list from dual;
  for v_count in 1 ..v_list.count loop
        dbms_output.put_line('v_list('||v_count||')='||v_list(v_count));
    end loop;
end;

复制代码

 

分类: PLSQL

好文要顶 关注我 收藏该文  

cici_new_1987
关注 - 1
粉丝 - 13

+加关注

0

0

« 上一篇:ORA-000928:缺失SELECT 关键字
» 下一篇:ORACLE 字符串函数

posted @ 2013-02-01 21:40 cici_new_1987 阅读(326) 评论(0) 编辑 收藏

http://www.cnblogs.com/cici-new/archive/2013/02/01/2889598.html

 

 

 

 

 

 

原 Java调用存储过程(返回:简单类型、自定义对象、列表数组)

2012年03月20日 17:50:02 yindmbest 阅读数:988

由于公司使用的Jdevelope进行开发,有一套已经封装好的框架,因此调用存储过程非常简单,小弟今天突然想着能不能使用jdbc自主调用下下存储过程,包括各种返回类型,在参考网上的现有代码研究了两个下午之后,写了三个东西,也算是总结吧。

一、返回参数为简单类型,见代码:

 

 
  1. package com.konkon.pk.call;

  2.  
  3. import java.sql.CallableStatement;

  4. import java.sql.Connection;

  5. import java.sql.DriverManager;

  6. import java.sql.SQLException;

  7. import java.sql.Types;

  8.  
  9. public class CallPkSimpleType {

  10.  
  11. public CallPkSimpleType() {

  12. super();

  13. }

  14.  
  15. public static void main(String[] args) {

  16.  
  17. Connection conn = null;

  18. CallableStatement proc = null;

  19.  
  20. try {

  21. Class.forName("oracle.jdbc.driver.OracleDriver");

  22. try {

  23. // 创建连接

  24. conn = DriverManager.getConnection(

  25. "jdbc:oracle:thin:@10.xx.xx.xx:1521:xxx", "xxx",

  26. "xxxx");

  27. // 调用pk

  28. proc = conn

  29. .prepareCall("{call PK_NB_DATACHECK.get_po_status_code(?,?,?,?)}");

  30. // 设置参数

  31. proc.setString(1, "100000000000388");

  32. proc.registerOutParameter(2, Types.VARCHAR);

  33. proc.registerOutParameter(3, Types.VARCHAR);

  34. proc.registerOutParameter(4, Types.VARCHAR);

  35. // 执行调用

  36. proc.execute();

  37. // 打印结果

  38. System.out.println("保险合同号:" + proc.getString(2) + "\n" + "保单状态"

  39. + proc.getString(3) + "\n" + proc.getString(4));

  40.  
  41. // 关闭连接

  42. if (null != proc) {

  43. proc.close();

  44. }

  45. if (null != conn) {

  46. conn.close();

  47. }

  48. } catch (SQLException e) {

  49. e.printStackTrace();

  50. }

  51. } catch (ClassNotFoundException e) {

  52. e.printStackTrace();

  53. }

  54. }

  55.  
  56. }

、返回参数为自定义类型,见代码:

 

 

 
  1. package com.konkon.pk.call;

  2.  
  3. import java.sql.CallableStatement;

  4. import java.sql.Connection;

  5. import java.sql.DriverManager;

  6. import java.sql.SQLException;

  7. import java.sql.Types;

  8.  
  9. import oracle.jdbc.OracleTypes;

  10. import oracle.sql.STRUCT;

  11.  
  12. /**

  13. * CallPkObjType.java

  14. * 作用:调用pk返回自定义对象,练习时使用

  15. * 注意事项

  16. *

  17. * 注意: 本内容仅限于某某软件公司内部使用,禁止转发

  18. * VERSION DATE BY CHANGE/COMMENT

  19. * 1.0 2012-3-20 YinMeng create

  20. */

  21.  
  22. public class CallPkObjType {

  23.  
  24. public CallPkObjType() {

  25. }

  26.  
  27. public static void main(String[] args) {

  28.  
  29. Connection conn = null;

  30. CallableStatement proc = null;

  31.  
  32. try {

  33. Class.forName("oracle.jdbc.driver.OracleDriver");

  34. try {

  35. // 创建连接

  36. conn = DriverManager.getConnection(

  37. "jdbc:oracle:thin:@10.xx.1.xx:1521:xxxx", "xx",

  38. "xxx");

  39.  
  40. // 调用自定义

  41. proc = conn

  42. .prepareCall("{? = call PK_LIB_USRDTPROC.f99_get_usrdat(?,?)}");

  43. // 设置参数

  44. proc.registerOutParameter(1, Types.SMALLINT);

  45. proc.setString(2, "10000103020");

  46. proc.registerOutParameter(3, OracleTypes.STRUCT, "OB_ACCC");

  47. proc.execute();

  48.  
  49. STRUCT str = (STRUCT) proc.getObject(3);

  50. Object[] obj = str.getOracleAttributes();

  51.  
  52. if (null != obj) {

  53. for (int i = 0; i < obj.length; i++) {

  54. System.out.println(obj[i]);

  55. }

  56. }

  57.  
  58. System.out.println(proc.getString(1));

  59.  
  60. // 关闭连接

  61. if (null != proc) {

  62. proc.close();

  63. }

  64. if (null != conn) {

  65. conn.close();

  66. }

  67. } catch (SQLException e) {

  68. e.printStackTrace();

  69. }

  70. } catch (ClassNotFoundException e) {

  71. e.printStackTrace();

  72. }

  73. }

  74.  
  75. }

三、返回参数为自定义类型数组,见代码:

 

 

 
  1. package com.konkon.pk.call;

  2.  
  3. import java.sql.CallableStatement;

  4. import java.sql.Connection;

  5. import java.sql.DriverManager;

  6. import java.sql.SQLException;

  7. import java.text.ParseException;

  8. import java.text.SimpleDateFormat;

  9. import java.util.ArrayList;

  10. import java.util.List;

  11.  
  12. import oracle.jdbc.OracleTypes;

  13. import oracle.sql.STRUCT;

  14. import vlife.plsql.Rec_bag_627m1a;

  15. import vlife.plsql.Rec_bag_627m1b;

  16.  
  17. /**

  18. * CallPkTableType.java

  19. * 作用:调用pk返回自定义列表对象,练习

  20. * 注意事项

  21.  
  22. * 注意: 本内容仅限于某某软件公司内部使用,禁止转发

  23. * VERSION DATE BY CHANGE/COMMENT

  24. * 1.0 2012-3-20 YinMeng create

  25. */

  26.  
  27. public class CallPkTableType {

  28.  
  29. public CallPkTableType() {

  30. }

  31.  
  32. public static void main(String[] args) throws ParseException {

  33.  
  34. Connection conn = null;

  35. CallableStatement proc = null;

  36.  
  37. try {

  38. Class.forName("oracle.jdbc.driver.OracleDriver");

  39. try {

  40. // 创建连接

  41. conn = DriverManager.getConnection(

  42. "jdbc:oracle:thin:@xxx.xx.xxx.xxx:1521:xxx", "xx",

  43. "xxx");

  44.  
  45. // 调用自定义

  46. proc = conn

  47. .prepareCall("{call pk_bag_bag627m.bag764m_get_agin_his_info(?,?)}");

  48.  
  49. Object[] objs = null;

  50. List nt_rec_bag_re = null;

  51.  
  52. Rec_bag_627m1a rec_bag_627m1a = new Rec_bag_627m1a();

  53.  
  54. rec_bag_627m1a.setAgin_code(null);

  55. rec_bag_627m1a.setAgin_name(null);

  56. rec_bag_627m1a.setOperator_time_e(null);

  57. rec_bag_627m1a.setManager_code(null);

  58. rec_bag_627m1a.setOperator_time_s(null);

  59.  
  60. proc.setObject(1, rec_bag_627m1a);

  61. proc.registerOutParameter(2, OracleTypes.ARRAY,

  62. "NT_REC_BAG_627M1B");

  63. proc.execute();

  64.  
  65. Object[] obj = (Object[]) proc.getArray(2).getArray();

  66.  
  67. nt_rec_bag_re = new ArrayList();

  68.  
  69. if (null != obj) {

  70.  
  71. Rec_bag_627m1b rec_b = null;

  72. Rec_bag_627m1b p_rec = null;

  73.  
  74. // 格式化时间

  75. SimpleDateFormat smf = new SimpleDateFormat("yyyy-mm-dd");

  76. // 获取职级开始时间

  77. java.util.Date leav_s_util = null;

  78. java.sql.Date leav_s = null;

  79. // 修改时间

  80. java.util.Date modi_util = null;

  81. java.sql.Date modi = null;

  82. // 实例循环

  83. for (Object rec : obj) {

  84. objs = ((STRUCT) rec).getAttributes();

  85. if (null != objs) {

  86. // 职级开始时间数据

  87. if (("".equals(objs[4])) || null == objs[4]) {

  88. leav_s = null;

  89. } else {

  90. leav_s_util = smf.parse(objs[4].toString());

  91. leav_s = new java.sql.Date(leav_s_util

  92. .getTime());

  93. }

  94.  
  95. // 操作时间数据获取

  96. if (("".equals(objs[9])) || null == objs[9]) {

  97. modi = null;

  98. } else {

  99. modi_util = smf.parse(objs[9].toString());

  100. modi = new java.sql.Date(modi_util.getTime());

  101. }

  102.  
  103. rec_b = new Rec_bag_627m1b();

  104. rec_b.setManagerment((String) objs[0]);

  105. rec_b.setAgincode((String) objs[1]);

  106. rec_b.setAginname((String) objs[2]);

  107. rec_b.setAginlevel((String) objs[3]);

  108. rec_b.setLevel_time_s(leav_s);

  109. rec_b.setDepart_code((String) objs[5]);

  110. rec_b.setDepart_name((String) objs[6]);

  111. rec_b.setAgin_level_name((String) objs[7]);

  112. rec_b.setModi_type((String) objs[8]);

  113. rec_b.setModi_time(modi);

  114. rec_b.setOperator_id((String) objs[10]);

  115.  
  116. nt_rec_bag_re.add(rec_b);

  117.  
  118. }

  119.  
  120. }

  121. for (int i = 0; i < nt_rec_bag_re.size(); i++) {

  122. p_rec = nt_rec_bag_re.get(i);

  123. System.out.println(p_rec.getModi_time());

  124. }

  125.  
  126. }

  127.  
  128. // 关闭连接

  129. if (null != proc) {

  130. proc.close();

  131. }

  132. if (null != conn) {

  133. conn.close();

  134. }

  135. } catch (SQLException e) {

  136. e.printStackTrace();

  137. }

  138. } catch (ClassNotFoundException e) {

  139. e.printStackTrace();

  140. }

  141. }

  142.  
  143. }

 

 

注意:如果输出的参数结果中有中文,有时候会有乱码的现象,可以下载语言包(http://download.csdn.net/detail/kxcc_sx/393164#comment)并添加到环境中就可以了,我的是这样的,对于jdk版本比较低的可能还需要对应的oracle驱动包。

https://blog.csdn.net/yindmbest/article/details/7374777

 

 

 

 

 

 

CSDN论坛 > Oracle > 高级技术

存储过程返回VARRAY类型,急,在线等待 [问题点数:0分]

  • 收藏帖子
  • 回复

Java调用存储过程(返回:简单类型VARCHAR、自定义对象STRUCT、列表数组VARRAY)_第1张图片

yexingzhe

Bbs1

结帖率 100%

我的程序如下
create or replace package TTTT is
  type CarBoatInfo is ref cursor;
  TYPE testtype is record
  (aa number(1),
   bb varchar2(10));
   TYPE vtest is VARRAY(10) of TESTTYPE;
  PROCEDURE test_ret(abc out vtest);
end TTTT;
create or replace package body TTTT is

PROCEDURE test_ret(abc out vtest) IS
ret testtype;
BEGIN
if abc is NULL then
dbms_output.put_line('aa is NUll');
end if;
ret.aa := 1;
ret.bb := '1';
abc := vtest(ret);
END test_ret;

我在JAVA中调用这个存储过程
    java.sql.ResultSet rs= null;
    java.sql.CallableStatement cs= null;
    java.sql.Connection conn= null; 
    try {
        conn= this.getConnection();
    } catch (BaseException ex) {
        throw new BaseException("E020023", ex);
    }
    try {
        try {
            conn.setAutoCommit(true);
            oracle.jdbc.OracleCallableStatement stmt = (oracle.jdbc.OracleCallableStatement)conn.prepareCall("{call tttt.test_ret(?)}");
oracle.jdbc.OracleTypes.ARRAY, "tttt.VTEST"); 
stmt.execute();  //执行到这里抛出异常
不知道事什么原因 ,各位大虾救命!

 

问题点数:0分

 0 2003-06-12 16:26:01

回复数 2 只看楼主 引用 举报 楼主

Java调用存储过程(返回:简单类型VARCHAR、自定义对象STRUCT、列表数组VARRAY)_第2张图片

皮皮

Bbs3

VARRAY是不可以作为返回参数到前端的,它只可以作为输出参数在procedure,function等oracle 内部使用。

0 2003-06-13 12:48:52

只看TA 引用 举报 #1    得分 0

STM32之中断与事件---一个使用GPIO作为外部中断的示例1.GPIO 的正确设置GPIO_InitTypeDef GPIO_InitStructure; /* Enable GPIOD clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); /* Configure PD.03, PC.04, as input floating */ GPIO_InitStructure.GPIO

Java调用存储过程(返回:简单类型VARCHAR、自定义对象STRUCT、列表数组VARRAY)_第3张图片

tarky_z

Bbs2

varray是在oracle内自定义的类型,不能作为输出参数的。可以考虑用引用游标传参数出去。

https://bbs.csdn.net/topics/30302419

 

 

 

 

 

 

 

 

 

 

 

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