从匿名PL / SQL块中获取类型的varray时,出现“ ORA-03115:不支持的网络数据类型或表示形式”异常。
我的代码是:
Connection con = null; CallableStatement cstmt = null; ResultSet rs = null; 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;"; try{ con = getConnection(); con.setAutoCommit(false); cstmt =(OracleCallableStatement )con.prepareCall(dequeueQuery); cstmt.registerOutParameter(1, OracleTypes.ARRAY); 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(); }catch (Exception e) { try { con.rollback(); } catch (SQLException e1) { e1.printStackTrace(); }`
请帮我。先感谢您。
java.sql.SQLException:ORA-03115:不支持的网络数据类型或表示形式
这是由以下语句引起的:
cstmt.registerOutParameter(1, OracleTypes.ARRAY);
该语句说array将作为输出,但没有将实际的Oracle Type名称指定为第三个参数。您可以检查此Oracle Doc,以获取有关此信息的更多信息。
我们可以java.sql.SQLException: ORA-03115: unsupported network datatype or representation通过添加带有实际Oracle类型名称的第三个参数来修复异常“ ”。在你的情况是NAMESARRAY。
java.sql.SQLException: ORA-03115: unsupported network datatype or representation
NAMESARRAY
cstmt.registerOutParameter(1, OracleTypes.ARRAY,"NAMESARRAY");
但是上面的语句在运行时将引发以下异常:
java.sql.SQLException:无效的名称模式:SCOTT.NAMESARRAY
这是因为我们尚未NAMESARRAY在DB内部声明类型。上面的例外将用户表示为SCOTT,但是您可以连接到您选择的用户并创建类型。
在数据库中创建类型:
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:语句被忽略
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/tiger@//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();} } }