将整数列表从Java传递到Oracle函数
我知道这可能是重复的问题,我检查了一些相关的解决方案 无法继续前进 在从Java传递整数列表并在Oracle函数中使用它方面,我没有什么问题将整数列表从Java传递到Oracle函数,java,oracle,function,arraylist,types,Java,Oracle,Function,Arraylist,Types,我知道这可能是重复的问题,我检查了一些相关的解决方案 无法继续前进 在从Java传递整数列表并在Oracle函数中使用它方面,我没有什么问题 操作员列表以以下格式从Java传递给oracle函数:“1111122222”。11111和22222是数字,但以单引号传递,因此它作为一个变量传递。有没有更好的方法传递这个变量 Java代码片段: List<Integer> operatorList = new ArrayList<>(); create or replace
List<Integer> operatorList = new ArrayList<>();
create or replace TYPE OPERATOR_ARRAY_DEL AS TABLE OF INTEGER;
/
create or replace FUNCTION FUNC_GetMessages (
OperatorList IN VARCHAR2
)
RETURN T_MSGTABLE AS
vMsg_List T_MSGTABLE;
v_Operator_List VARCHAR(50);
v_operatorList VARCHAR(100) :='';
v_operatorFinalList VARCHAR(100) ;
v_operatorId VARCHAR(20);
v_operatorFinal OPERATOR_ARRAY_DEL := OPERATOR_ARRAY_DEL();
BEGIN
FOR iOperator IN
(SELECT to_number(column_value) as v_operatorId FROM xmltable(OperatorList))
LOOP
v_operatorList := v_operatorList || iOperator.v_operatorId || ',';
SELECT SUBSTR(v_operatorList, 1, LENGTH(v_operatorList) - 1) INTO v_operatorFinalList FROM DUAL;
END LOOP;
... some code here
...
....
SELECT SUBSTR(v_operatorList, 1, LENGTH(v_operatorList) - 1) INTO v_operatorList FROM DUAL;
SELECT T_MSGTABLE( message)
BULK COLLECT INTO vSMs_List
FROM
(
SELECT MESSAGE FROM MESSAGETABLE WHERE OPERATOR IN (v_operatorFinalList);
);
END;
从表中选择消息(FUNC_GetMessages('1111122222')代码>
因此,我可以删除引号并将值作为参数直接传递给表
创建类型以处理此参数
甲骨文:
List<Integer> operatorList = new ArrayList<>();
create or replace TYPE OPERATOR_ARRAY_DEL AS TABLE OF INTEGER;
/
create or replace FUNCTION FUNC_GetMessages (
OperatorList IN VARCHAR2
)
RETURN T_MSGTABLE AS
vMsg_List T_MSGTABLE;
v_Operator_List VARCHAR(50);
v_operatorList VARCHAR(100) :='';
v_operatorFinalList VARCHAR(100) ;
v_operatorId VARCHAR(20);
v_operatorFinal OPERATOR_ARRAY_DEL := OPERATOR_ARRAY_DEL();
BEGIN
FOR iOperator IN
(SELECT to_number(column_value) as v_operatorId FROM xmltable(OperatorList))
LOOP
v_operatorList := v_operatorList || iOperator.v_operatorId || ',';
SELECT SUBSTR(v_operatorList, 1, LENGTH(v_operatorList) - 1) INTO v_operatorFinalList FROM DUAL;
END LOOP;
... some code here
...
....
SELECT SUBSTR(v_operatorList, 1, LENGTH(v_operatorList) - 1) INTO v_operatorList FROM DUAL;
SELECT T_MSGTABLE( message)
BULK COLLECT INTO vSMs_List
FROM
(
SELECT MESSAGE FROM MESSAGETABLE WHERE OPERATOR IN (v_operatorFinalList);
);
END;
函数执行:
List<Integer> operatorList = new ArrayList<>();
create or replace TYPE OPERATOR_ARRAY_DEL AS TABLE OF INTEGER;
/
create or replace FUNCTION FUNC_GetMessages (
OperatorList IN VARCHAR2
)
RETURN T_MSGTABLE AS
vMsg_List T_MSGTABLE;
v_Operator_List VARCHAR(50);
v_operatorList VARCHAR(100) :='';
v_operatorFinalList VARCHAR(100) ;
v_operatorId VARCHAR(20);
v_operatorFinal OPERATOR_ARRAY_DEL := OPERATOR_ARRAY_DEL();
BEGIN
FOR iOperator IN
(SELECT to_number(column_value) as v_operatorId FROM xmltable(OperatorList))
LOOP
v_operatorList := v_operatorList || iOperator.v_operatorId || ',';
SELECT SUBSTR(v_operatorList, 1, LENGTH(v_operatorList) - 1) INTO v_operatorFinalList FROM DUAL;
END LOOP;
... some code here
...
....
SELECT SUBSTR(v_operatorList, 1, LENGTH(v_operatorList) - 1) INTO v_operatorList FROM DUAL;
SELECT T_MSGTABLE( message)
BULK COLLECT INTO vSMs_List
FROM
(
SELECT MESSAGE FROM MESSAGETABLE WHERE OPERATOR IN (v_operatorFinalList);
);
END;
从表中选择消息(FUNC_GetMessages('1111122222')代码>-->此处错误:无效数字
ORA-01722: invalid number
ORA-06512: at "FUNC_GetMessages", line 29
01722. 00000 - "invalid number"
*Cause: The specified number was invalid.
*Action: Specify a valid number.
我不知道如何解释运算符列表并传递给表以获取结果
预期结果是select语句中的多行
非常感谢您的指点和建议。
谢谢:)可能有一种更简单的Java方法可以做到这一点,但您也在函数中过度复杂化了。该xmltable
查询正在将列表转换为一个可以迭代的表,无需再次将其放回varchar2
create or replace FUNCTION FUNC_GetMessages (
OperatorList IN VARCHAR2
)
RETURN T_MSGTABLE AS
vMsg_List T_MSGTABLE;
BEGIN
... some code here
...
....
SELECT T_MSGTABLE( message)
BULK COLLECT INTO vMsg_List
FROM
(
SELECT MESSAGE FROM MESSAGETABLE WHERE OPERATOR IN
(SELECT to_number(column_value) as opId FROM xmltable(OperatorList));
);
END;
如果这是针对Hibernate的,您可能会想给它加上这样的标签,就像我差点问您为什么不使用CallableStatement
,直到我意识到这不是JDBC。老实说,我在Hibernate中找不到任何简单的方法来实现这一点。如果这是JDBC,我会告诉您使用连接对象的createArrayOf
命令创建java.sql.Array
。。。类似于java.sql.Array operatorArray=conn.createArrayOf(“INTEGER”,operatorList.toArray())代码>然后可以传递到PrepareStatement
的setArray
。也就是说,假设您实际将存储函数编码为接受SQL数组。@Powerlord,感谢您提醒我们在Hibernate下标记它。添加了其他标记,但忘记了此项。:)我尝试将输入作为字符串传递,然后解析它。我也尝试过作为类型传递。这正如预期的那样工作,您是对的,我在DB函数中复杂化了数据获取。