Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将整数列表从Java传递到Oracle函数_Java_Oracle_Function_Arraylist_Types - Fatal编程技术网

将整数列表从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

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

在从Java传递整数列表并在Oracle函数中使用它方面,我没有什么问题

  • 操作员列表以以下格式从Java传递给oracle函数:“1111122222”。11111和22222是数字,但以单引号传递,因此它作为一个变量传递。有没有更好的方法传递这个变量

    Java代码片段:

    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函数中复杂化了数据获取。