sql >> データベース >  >> RDS >> Oracle

ORA-03115を取得:anonymous pl/sqlからvarcharの配列をフェッチ中にサポートされていないネットワークデータ型または表現エラー

    java.sql.SQLException:ORA-03115:サポートされていないネットワークデータ型または表現

    これは、次のステートメントが原因で発生します:

    cstmt.registerOutParameter(1, OracleTypes.ARRAY);
    

    このステートメントは、配列が出力になることを示していますが、実際のOracleタイプ名を3番目のパラメーターとして指定していません。詳細については、このOracleDocを確認してください。

    例外「java.sql.SQLException: ORA-03115: unsupported network datatype or representation」を修正できます。 "実際のOracleタイプ名で3番目のパラメータを追加します。あなたの場合はNAMESARRAYです。 。

    cstmt.registerOutParameter(1, OracleTypes.ARRAY,"NAMESARRAY");
    

    ただし、上記のステートメントは実行中に次の例外をスローします:

    java.sql.SQLException:無効な名前パターン:SCOTT.NAMESARRAY

    これは、タイプNAMESARRAYを宣言していないためです。 DB内。上記の例外では、ユーザーはSCOTTと表示されますが、選択したユーザーに接続してタイプを作成できます。

    DBでのタイプの作成:

    connect scott/tiger
    CREATE OR REPLACE TYPE namesarray AS VARRAY(5) OF VARCHAR2(10) ;
    /
    

    タイプNAMESARRAYを作成したら 、変更せずにコードを実行すると、次のエラーが発生します:

    java.sql.SQLException:ORA-06550:行1、列180:

    PLS-00382:式のタイプが間違っていますORA-06550:行1、列173:

    PL / SQL:ステートメントは無視されます

    このエラーは、ユーザーレベルでタイプをすでに定義しているが、次のコードブロック内でタイプを再度作成しようとしているためです。

    String dequeueQuery = "DECLARE " +
                " type namesarray IS VARRAY(5) OF VARCHAR2(10); " +
                " names namesarray;" +
                "   total integer;" +
                "   BEGIN " +
                "   names := namesarray('Kavita', 'Pritam', 'Ayan', 'Rishav', 'Aziz'); " +
                "   ? := names;"+
                " END;";
    

    したがって、そこから型宣言を削除する必要があります。

    String dequeueQuery = "DECLARE " +
                " names namesarray;" +
                "   total integer;" +
                "   BEGIN " +
                "   names := namesarray('Kavita', 'Pritam', 'Ayan', 'Rishav', 'Aziz'); " +
                "   ? := names;"+
                " END;";
    

    コンパイル後にプログラムを実行すると、それを削除した後、次の出力が表示されるはずです。

    Kavita
    Pritam
    Ayan
    Rishav
    Aziz
    

    更新されたプログラムは次のとおりです。

    import java.io.*;
    import java.sql.*;
    import oracle.jdbc.*;
    
    public class DBQC {
       public static void main(String[] args) {
       try {
          Connection con=null;
          Class.forName("oracle.jdbc.OracleDriver");
          String connStr = "jdbc:oracle:thin:scott/[email protected]//dbhost:1521/dbsrvc";
          con=DriverManager.getConnection(connStr);
          if(con != null)
          {
             System.out.println("Connection succeeded");
    
             String dequeueQuery = "DECLARE " +
                " names namesarray;" +
                "   total integer;" +
                "   BEGIN " +
                "   names := namesarray('Kavita', 'Pritam', 'Ayan', 'Rishav', 'Aziz'); " +
                "   ? := names;"+
                " END;";
    
             CallableStatement cstmt = null;
             con.setAutoCommit(false);
             cstmt =(OracleCallableStatement)con.prepareCall(dequeueQuery);
    
             cstmt.registerOutParameter(1, OracleTypes.ARRAY,"NAMESARRAY");
             boolean b = cstmt.execute();
             Array arr = cstmt.getArray(1);
    
             String[] recievedArray = (String[]) arr.getArray();
             for (int i = 0; i < recievedArray.length; i++)
                 System.out.println(recievedArray[i]);
    
             con.commit();
          }
          con.close();
        } catch(Exception e){e.printStackTrace();}
        }
    }
    


    1. クエリ内の式がいつ評価されるかを評価する

    2. テーブルを削除して再作成せずに、Oracleの特定の位置に列を挿入するにはどうすればよいですか?

    3. Pgpool for PostgreSQLのガイド:パート1

    4. SQLクエリで正規表現(置換)を実行する