java.sql.SQLException:ORA-03115:kiểu dữ liệu mạng không được hỗ trợ hoặc trình bày
Điều này được gây ra bởi câu lệnh sau:
cstmt.registerOutParameter(1, OracleTypes.ARRAY);
Câu lệnh này cho biết mảng sẽ là đầu ra, nhưng không chỉ định tên Kiểu Oracle thực làm tham số thứ ba. Bạn có thể kiểm tra Tài liệu Oracle này để biết thêm thông tin về điều này.
Chúng tôi có thể sửa ngoại lệ "java.sql.SQLException: ORA-03115: unsupported network datatype or representation
"bằng cách thêm tham số thứ ba với tên Loại Oracle thực tế. Trong trường hợp của bạn, đó là NAMESARRAY
.
cstmt.registerOutParameter(1, OracleTypes.ARRAY,"NAMESARRAY");
Nhưng câu lệnh trên sẽ đưa ra ngoại lệ sau khi chạy:
java.sql.SQLException:mẫu tên không hợp lệ:SCOTT.NAMESARRAY
Điều này là do chúng tôi chưa khai báo loại NAMESARRAY
bên trong DB. Ngoại lệ ở trên cho biết người dùng là SCOTT, nhưng bạn có thể kết nối với người dùng mà bạn chọn và tạo loại.
Tạo kiểu trong DB:
connect scott/tiger
CREATE OR REPLACE TYPE namesarray AS VARRAY(5) OF VARCHAR2(10) ;
/
Sau khi chúng tôi tạo loại NAMESARRAY
, nếu chúng tôi thực thi mã của bạn mà không thay đổi, chúng tôi sẽ gặp lỗi sau:
java.sql.SQLException:ORA-06550:dòng 1, cột 180:
PLS-00382:biểu thức không đúng loại ORA-06550:dòng 1, cột 173:
PL / SQL:Câu lệnh bị bỏ qua
Lỗi này là do chúng tôi đã xác định loại ở cấp người dùng, nhưng chúng tôi đang cố gắng tạo lại loại bên trong khối mã sau:
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;";
Vì vậy, chúng ta cần xóa khai báo kiểu khỏi đó.
String dequeueQuery = "DECLARE " +
" names namesarray;" +
" total integer;" +
" BEGIN " +
" names := namesarray('Kavita', 'Pritam', 'Ayan', 'Rishav', 'Aziz'); " +
" ? := names;"+
" END;";
Sau khi loại bỏ nó nếu chúng ta thực thi chương trình sau khi biên dịch, chúng ta sẽ có thể thấy kết quả sau:
Kavita
Pritam
Ayan
Rishav
Aziz
Sau đây là chương trình được cập nhật:
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();}
}
}