将整数列表从Java传递到Oracle函数

时间:2019-02-01 15:01:00

标签: java oracle function arraylist types

  

我知道这可能是重复的问题,我检查了一些相关的解决方案   并且无法继续前进。

从Java传递整数列表并将其用于Oracle函数时,我几乎没有疑问。

  1. 运算符列表以以下格式从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();
  1. 在Oracle中,正如我期望的那样,

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语句中有多行

任何指针和建议都将受到高度赞赏。 谢谢:)

1 个答案:

答案 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;