繁体   English   中英

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

[英]Passing Integer List from Java to Oracle Function

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

在从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'));

这样,我可以删除引号并将值直接作为参数传递给表。

创建类型来处理此参数。

甲骨文:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM