当前位置: 首页 > 知识库问答 >
问题:

用java调用表对象作为输入的oracle存储过程

朱俊雅
2023-03-14
java.sql.SQLException: ORA-03115: unsupported network datatype or representation

    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:445)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396)
    at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:879)
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:450)
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192)
    at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531)
    at oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:204)
    at oracle.jdbc.driver.T4CCallableStatement.executeForRows(T4CCallableStatement.java:1034)
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1329)
    at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3584)
    at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3685)
    at oracle.jdbc.driver.OracleCallableStatement.execute(OracleCallableStatement.java:4694)
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.execute(OraclePreparedStatementWrapper.java:1088)
    at  com.wincash.test.service.PriceInBundle.getPriceInBundle(PriceInBundle.java:33)
    at com.wincash.test.Wincash.main(Wincash.java:10)

      create or replace PROCEDURE        GET_PRICE_IN_BUNDLE(
    P_IN_PriceInBundle_Input IN PriceInBundle_Input_Table,
    P_OUT_PriceInBundle_Output OUT PriceInBundle_Output_Table,
    P_OUT_RETURN_CODE OUT NUMBER,
    P_OUT_RETURN_MESSAGE OUT VARCHAR2 )
AS
  V_PRICE         NUMBER:=-1;
  V_Count_Article NUMBER:=-1;
  V_Count_Bundle  NUMBER:=-1;
  V_Count_Matset  NUMBER :=-1;
BEGIN
  P_OUT_RETURN_CODE          := -200;
  P_OUT_RETURN_MESSAGE       :='Initial';
  P_OUT_PriceInBundle_Output := PriceInBundle_Output_Table();
  FOR item_record_index IN P_IN_PriceInBundle_Input.FIRST .. P_IN_PriceInBundle_Input.LAST
  LOOP
    P_OUT_PriceInBundle_Output.EXTEND ;
    P_OUT_PriceInBundle_Output(item_record_index)                := PriceInBundle_Output_Record('','',-1,-1,'');
    P_OUT_PriceInBundle_Output(item_record_index).MaterialNumber := P_IN_PriceInBundle_Input(item_record_index).MaterialNumber ;
    P_OUT_PriceInBundle_Output(item_record_index).BundleNumber   := P_IN_PriceInBundle_Input(item_record_index).BundleNumber ;
    V_PRICE                                                      :=-1;
    BEGIN
      SELECT MAX(PRICE)
      INTO V_PRICE
      FROM matset
      WHERE compid IN
        (SELECT gid
        FROM material
        WHERE matno= P_IN_PriceInBundle_Input(item_record_index).MaterialNumber
        AND status<>'D'
        )
      AND matid IN
        (SELECT gid
        FROM material
        WHERE matno= P_IN_PriceInBundle_Input(item_record_index).BundleNumber
        AND status<>'D'
        )
      AND status                                                   <>'D';
      IF V_PRICE                                                   IS NOT NULL THEN
        P_OUT_PriceInBundle_Output(item_record_index).Price        := V_PRICE;
        P_OUT_PriceInBundle_Output(item_record_index).ResultCode   :=0;
        P_OUT_PriceInBundle_Output(item_record_index).ResultMessage:='SUCCESS';
      ELSE
        SELECT COUNT(*)
        INTO V_Count_Matset
        FROM matset
        WHERE compid IN
          (SELECT gid
          FROM material
          WHERE matno= P_IN_PriceInBundle_Input(item_record_index).MaterialNumber
          AND status<>'D'
          )
        AND matid IN
          (SELECT gid
          FROM material
          WHERE matno= P_IN_PriceInBundle_Input(item_record_index).BundleNumber
          AND status<>'D'
          )
        AND status      <>'D';
        IF V_Count_Matset>0 THEN
          SELECT MAX(price)
          INTO V_PRICE
          FROM material
          WHERE matno                                                 =P_IN_PriceInBundle_Input(item_record_index).MaterialNumber
          AND status                                                  ='A';
          P_OUT_PriceInBundle_Output(item_record_index).Price        := V_PRICE;
          P_OUT_PriceInBundle_Output(item_record_index).ResultCode   :=0;
          P_OUT_PriceInBundle_Output(item_record_index).ResultMessage:='Success';
        ELSE
          SELECT COUNT(*)
          INTO V_Count_Article
          FROM material
          WHERE matno                                                   = P_IN_PriceInBundle_Input(item_record_index).MaterialNumber
          AND status                                                    ='A';
          IF V_Count_Article                                            =0 THEN
            P_OUT_PriceInBundle_Output(item_record_index).Price        := -1;
            P_OUT_PriceInBundle_Output(item_record_index).ResultCode   := -2;
            P_OUT_PriceInBundle_Output(item_record_index).ResultMessage:='Wrong Article Number';
          ELSE
            SELECT COUNT(*)
            INTO V_Count_Bundle
            FROM material
            WHERE matno                                                   = P_IN_PriceInBundle_Input(item_record_index).BundleNumber
            AND status                                                    ='A';
            IF V_Count_Bundle                                             =0 THEN
              P_OUT_PriceInBundle_Output(item_record_index).Price        := -1;
              P_OUT_PriceInBundle_Output(item_record_index).ResultCode   := -3;
              P_OUT_PriceInBundle_Output(item_record_index).ResultMessage:='Wrong Bundle Number';
              ELSE
               P_OUT_PriceInBundle_Output(item_record_index).Price        := -1;
              P_OUT_PriceInBundle_Output(item_record_index).ResultCode   := -4;
              P_OUT_PriceInBundle_Output(item_record_index).ResultMessage:='Article does not belong to bundle';
            END IF;
          END IF;
        END IF;
      END IF;
    EXCEPTION
    WHEN NO_DATA_FOUND THEN
      P_OUT_PriceInBundle_Output(item_record_index).Price         := -1;
      P_OUT_PriceInBundle_Output(item_record_index).ResultCode    := -4 ;
      P_OUT_PriceInBundle_Output(item_record_index).ResultMessage := 'Invalid Input,No price found' ;
    WHEN OTHERS THEN
      P_OUT_PriceInBundle_Output(item_record_index).Price         := -1;
      P_OUT_PriceInBundle_Output(item_record_index).ResultCode    := -100 ;
      P_OUT_PriceInBundle_Output(item_record_index).ResultMessage :='UNKNOWN ERROR ' ||SQLERRM ;
    END ;
  END LOOP;
  P_OUT_RETURN_CODE    := 0 ;
  P_OUT_RETURN_MESSAGE := 'Success' ;
EXCEPTION
WHEN OTHERS THEN
  P_OUT_RETURN_CODE    := -100 ;
  P_OUT_RETURN_MESSAGE :='UNKNOWN ERROR ' ||SQLERRM ;
END;
import com.wincash.test.config.DBConnection;

import oracle.jdbc.OracleCallableStatement;
import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor;

public class PriceInBundle {
    private static Logger logger= Logger.getLogger(PriceInBundle.class);
    private static Connection conn=null;
    private static OracleCallableStatement callStatement=null;

    public Boolean getPriceInBundle() {
        Boolean rs=Boolean.FALSE;
        conn=DBConnection.getConnection();
        try {
            Object [] table= new Object[2];

            ArrayDescriptor priceInBundleTable= ArrayDescriptor.createDescriptor("PRICEINBUNDLE_INPUT_TABLE", conn);
            ARRAY priceInTable= new ARRAY(priceInBundleTable, conn, table);
            callStatement=(OracleCallableStatement)conn.prepareCall("{call GET_PRICE_IN_BUNDLE(?,?,?,?)}");
            callStatement.setARRAY(1, priceInTable);
            callStatement.registerOutParameter(2, java.sql.Types.ARRAY);
            callStatement.registerOutParameter(3, java.sql.Types.NUMERIC);
            callStatement.registerOutParameter(4, java.sql.Types.VARCHAR);

            rs=callStatement.execute();
        } catch (SQLException e) {
//          logger.info(e.getMessage());
            e.printStackTrace();
        }finally {
            try {
                conn.close();
                callStatement.close();
            } catch (SQLException e) {
                logger.info(e.getMessage());
            }

        }
        return rs;
    }
}

请支持伙计们

共有1个答案

华俊贤
2023-03-14

我在这里找到了解决方案,只需添加oracle自定义类型以输出参数,如下面的代码将此代码更改为

callStatement.registerOutParameter(2, java.sql.Types.ARRAY);

callStatement.registerOutParameter(2, java.sql.Types.ARRAY,"PRICEINBUNDLE_OUTPUT_TABLE");

多亏了马米特·轰炸机的评论,问题就迎刃而解了

 类似资料:
  • 如何使用表(X)作为输入参数编写Oracle存储过程,并且在过程中使用表X与另一个表Y联接? 表X将有数千条记录。 不希望将表名传递为varchar,然后使用动态SQL(因此,此选项不在画面中)

  • 我在Oracle中有一个存储过程,如下所示。 我正在从Java调用该过程。我的密码是, 即使我正在获取记录,值也是空的。这意味着如果输出为2行,则while条件执行并打印为空。在SQL Developer中,它工作得很好。提前道谢。

  • 问题内容: 我已经搜索了一段时间,似乎找不到任何真正的答案。 我有一个Oracle存储过程,该存储过程具有许多in参数,这些参数的类型是表rowtype的表。因此,例如: 在pacakge中声明: Oracle过程: 在Java方面,我有3个对应的对象列表,它们表示用Java填充的每个参数。在这种情况下可以使用MyBatis调用Oracle过程吗? 对象本身是具有String和Integer属性以

  • 问题内容: 我在SQL Server 2008 R2中有一个Oracle链接服务器。我需要执行Oracle存储过程(在第一个过程中使用输出参数,在第二个过程中使用输入参数): 我没有找到有关此问题的完整文档,只有带有无参数选择/非选择过程的简单示例,并且想知道如何调用这些过程,具有内部select的过程以及具有基本参数类型的多参数过程。 问题答案: 它应该像这样工作: 如果您有几个参数,则可能如下

  • 我有一个非常复杂的oracle存储过程,它搜索和检索一些数据。该过程返回一个输出参数-oracle游标。我通过JDBC执行过程: 问题是,查询有时会花费相当长的时间(几分钟),我希望用户能够通过单击按钮随时取消查询。我引用了stmt对象,但不幸的是(从其他线程)调用stmt.cancel()没有效果。 另一方面,当我将CallableStatement sql更改为以下查询时: 在调用stmt.c

  • 问题内容: 编辑:虽然此问题中的某些答案可能会帮助其他人解决不同的问题,但该解决方案实际上与数据库连接上的自动提交功能中的某些错误有关! 执行查询后强制执行提交会使数据库反映更改,因此下面显示的代码是调用此类型存储过程的正确方法 我正在尝试在oracle数据库中调用一个简单的存储过程。 该过程如下所示: 我遇到麻烦的Java代码如下所示 我根本没有收到任何错误,但是没有反映出数据库更改。当我在SQ