JAVA向ORACLE过程传递集合类型

duqiangcise 2010-03-10 03:34:42
直接进入主题:
java代码:
 public static void main(String[] args) throws Exception {
Connection conn = TestOracleProc.getConn();
boolean isAuto = conn.getAutoCommit();
conn.setAutoCommit(true);
// --------------------------------------
String sql = "{CALL TEST_ARRAY_PROC(?)}";
OracleCallableStatement proc = (OracleCallableStatement) conn.prepareCall(sql);

oracle.sql.ArrayDescriptor arrayDesc = oracle.sql.ArrayDescriptor.createDescriptor(
"USERTEST.TEST_COLUMN_ARRAY", conn);
List<String> phones = new ArrayList<String>();
phones.add("13666666666");
phones.add("13666666667");
phones.add("13666666668");
phones.add("13666666669");
// int[] phonts = new int[] { 111111, 2111111, 311111 };
ARRAY in_phones = new oracle.sql.ARRAY(arrayDesc, conn, phones.toArray(new String[phones
.size()]));
proc.setArray(1, in_phones);
proc.execute();
conn.setAutoCommit(isAuto);
System.out.println("================END==============");

}

oracle数据库上定义一个集合类型:
create or replace
type TEST_COLUMN_ARRAY as table of VARCHAR2(20);


oracle数据库上的存储过程:
create or replace
PROCEDURE TEST_ARRAY_PROC(ARRAY_PHONE IN TEST_COLUMN_ARRAY)
AS
BEGIN
IF(array_phone IS NOT NULL AND array_phone.COUNT > 1)THEN

FOR i in ARRAY_PHONE.first..ARRAY_PHONE.last LOOP
IF(ARRAY_PHONE(i) IS NOT NULL)THEN
INSERT INTO TEST_DATA(MOBILE)VALUES(ARRAY_PHONE(i));
ELSE
INSERT INTO TEST_DATA(MOBILE)VALUES('11111111');
END IF;
END LOOP;

ELSE
INSERT INTO TEST_DATA(MOBILE)VALUES('22222222');
END IF;
COMMIT;
END TEST_ARRAY_PROC;

请问大家,为什么我在存储过程中判断每个集合中的数据时,总是为空呢?即:ARRAY_PHONE(i) IS NULL!!请大家多多提供意见。
...全文
454 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zs6339790 2010-08-24
  • 打赏
  • 举报
回复
同顶,

CREATE OR REPLACE PACKAGE TESTDOUBLEARRAY IS

-- Author : ZHANGS
-- Created : 2010-8-24 11:55:25
-- Purpose : 测试二维数组

-- 类型声明
TYPE REF_CUR IS REF CURSOR; --REF游标

--1型数组的元素
TYPE RECORD_E IS RECORD(
STR_KEY TAB_FOR_TEST.STR_KEY%TYPE,
STR_VALUE TAB_FOR_TEST.STR_VALUE%TYPE);
--1元素为record的数组
TYPE RECORD_E_ARRA IS TABLE OF RECORD_E;

--2元素为TAB_FOR_TEST表的行记录的数组
TYPE TAB_E_ARRA IS TABLE OF TAB_FOR_TEST%ROWTYPE;

--存储过程声明
/*
** 测试用第一种数组插入数据
** parameters:I_ARRA_1 IN RECORD_E_ARRA
** return: 无
*/
PROCEDURE INSERT_DATA_1(I_ARRA_1 IN RECORD_E_ARRA);
/*
** 测试用第二种数组插入数据
** parameters:I_ARRA_2 IN RECORD_E_ARRA
** return: 无
*/
PROCEDURE INSERT_DATA_2(I_ARRA_2 IN TAB_E_ARRA);
END TESTDOUBLEARRAY;



CREATE OR REPLACE PACKAGE BODY TESTDOUBLEARRAY IS

/*
** 测试用第一种数组插入数据
** parameters:I_ARRA_1 IN RECORD_E_ARRA
** return: 无
*/
PROCEDURE INSERT_DATA_1(I_ARRA_1 IN RECORD_E_ARRA) IS
--tempRecord RECORD_E;
BEGIN
FOR COUNTS IN 1 .. I_ARRA_1.COUNT LOOP
INSERT INTO TAB_FOR_TEST
VALUES
(I_ARRA_1(COUNTS).STR_KEY, I_ARRA_1(COUNTS).STR_VALUE);
END LOOP;

-- tempRecord:=I_ARRA_1(1);
END INSERT_DATA_1;
/*
** 测试用第二种数组插入数据
** parameters:I_ARRA_2 IN RECORD_E_ARRA
** return: 无
*/
PROCEDURE INSERT_DATA_2(I_ARRA_2 IN TAB_E_ARRA) IS
BEGIN
DBMS_OUTPUT.PUT_LINE('asdasd');
END INSERT_DATA_2;
END TESTDOUBLEARRAY;


declare
-- Non-scalar parameters require additional processing
i_arra_1 testdoublearray.record_e_arra:=testdoublearray.record_e_arra();
a testdoublearray.RECORD_E;
b testdoublearray.RECORD_E;
c testdoublearray.RECORD_E;
begin
-- Call the procedure
a.STR_KEY:=11;a.STR_VALUE:='11111111';
b.STR_KEY:=12;b.STR_VALUE:='22222222';
c.STR_KEY:=13;c.STR_VALUE:='33333333';
i_arra_1.extend;
i_arra_1(1):=a;
i_arra_1.extend;
i_arra_1(2):=b;
i_arra_1.extend;
i_arra_1(3):=c;
testdoublearray.insert_data_1(i_arra_1 => i_arra_1);
end;

测试可以通过,但是调用的时候出现异常

StructDescriptor structDes = StructDescriptor.createDescriptor("TESTDOUBLEARRAY.RECORD_E", conn);
duqiangcise 2010-03-11
  • 打赏
  • 举报
回复
顶上去。。。。。。。。。。。。
duqiangcise 2010-03-10
  • 打赏
  • 举报
回复
找到原因了。现在不忙公布出来。呵呵!
欢迎大家来讨论一下,为什么把嵌套表类型创建在一个包中就不行了呢.见异常信息。
1.Exception in thread "main" java.sql.SQLException:
无效的名称模式: TESTUSER.COLUMN_ARRAY
异常1我在调用的时候没有嵌套表类型前标识包名:调用方式如下:
ArrayDescriptor arrayDesc = ArrayDescriptor.createDescriptor("COLUMN_ARRAY", conn);
2.当我在调用嵌套表类型时,在其前边写上包名后:
ArrayDescriptor arrayDesc = ArrayDescriptor.createDescriptor("MY_PACKAGE.COLUMN_ARRAY", conn);
发生异常,见下:
Exception in thread "main" java.sql.SQLException: 无效的名称模式:
MY_PACKAGE.COLUMN_ARRAY

总之为什么把嵌套表类型创建在一个包中,通过java就不能够调用了呢??

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧