java.sql.SQLException:ORA-03115:tipe data atau representasi jaringan tidak didukung
Hal ini disebabkan oleh pernyataan berikut:
cstmt.registerOutParameter(1, OracleTypes.ARRAY);
Pernyataan ini mengatakan array akan menjadi output, tetapi tidak menentukan nama Oracle Type yang sebenarnya sebagai parameter ketiga. Anda dapat memeriksa Dokumen Oracle ini untuk informasi lebih lanjut tentang ini.
Kami dapat memperbaiki pengecualian "java.sql.SQLException: ORA-03115: unsupported network datatype or representation
" dengan menambahkan parameter ketiga dengan nama Oracle Type yang sebenarnya. Dalam kasus Anda ini adalah NAMESARRAY
.
cstmt.registerOutParameter(1, OracleTypes.ARRAY,"NAMESARRAY");
Tetapi pernyataan di atas akan mengeluarkan pengecualian berikut saat menjalankan:
java.sql.SQLException:pola nama tidak valid:SCOTT.NAMESARRAY
Ini karena kami belum mendeklarasikan jenis NAMESARRAY
di dalam DB. Pengecualian di atas menyebutkan pengguna sebagai SCOTT, tetapi Anda dapat terhubung ke pengguna pilihan Anda dan membuat jenis.
Membuat jenis di DB:
connect scott/tiger
CREATE OR REPLACE TYPE namesarray AS VARRAY(5) OF VARCHAR2(10) ;
/
Setelah kita membuat jenis NAMESARRAY
, jika kami mengeksekusi kode Anda tanpa mengubahnya, kami akan mendapatkan kesalahan berikut:
java.sql.SQLException:ORA-06550:baris 1, kolom 180:
PLS-00382:ekspresi salah ketik ORA-06550:baris 1, kolom 173:
PL/SQL:Pernyataan diabaikan
Kesalahan ini karena kami telah mendefinisikan tipe di tingkat pengguna, tetapi kami mencoba membuat tipe lagi di dalam blok kode berikut:
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;";
Jadi, kita perlu menghapus deklarasi tipe dari itu.
String dequeueQuery = "DECLARE " +
" names namesarray;" +
" total integer;" +
" BEGIN " +
" names := namesarray('Kavita', 'Pritam', 'Ayan', 'Rishav', 'Aziz'); " +
" ? := names;"+
" END;";
Setelah menghapusnya jika kita menjalankan program setelah kompilasi, kita seharusnya dapat melihat output berikut:
Kavita
Pritam
Ayan
Rishav
Aziz
Berikut adalah program yang diperbarui:
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();}
}
}