[英]Passing Integer List from Java to Oracle Function
我知道这可能是重复的问题,我检查了一些相关的解决方案,因此无法继续进行。
在从Java传递整数列表并在Oracle函数中使用它时,我有几个问题。
操作员列表以以下格式从Java传递到oracle函数:'11111,22222'。 11111和22222是数字,但是用单引号引起来,因此它作为一个变量传递。 有没有更好的方法来传递此变量?
Java代码段:
List<Integer> operatorList = new ArrayList<>();
修改operatorList以在开始和结束处包含单引号并传递给函数。 -> 不确定这是否正确
userOrgList = sessionFactory.getCurrentSession().createSQLQuery
("SELECT message FROM TABLE (FUNC_GetMessages(**:operatorList**))")
.setParameter("operatorList", inputOperatorList)
.setFetchSize(5000).list();
SELECT Message FROM TABLE (FUNC_GetMessages('11111, 22222'));
这样,我可以删除引号并将值直接作为参数传递给表。
创建类型来处理此参数。
甲骨文:
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;
功能执行:
SELECT Message FROM TABLE (FUNC_GetMessages('11111, 22222'));
--> Error here : Invalid number
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.
我不确定如何解释operatorList并传递给表以获取结果。
预期结果是来自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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.