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();}
}
}