我知道这可能是重复的问题,我检查了一些相关的解决方案 并且无法继续前进。
从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'));
这样,我可以删除引号并将值直接作为参数传递给表。
创建类型来处理此参数。
Oracle:
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语句中有多行
任何指针和建议都将受到高度赞赏。 谢谢:)
答案 0 :(得分:1)
可能有一种更简单的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;