从匿名 pl/sql 获取 varchar 数组时出现 "ORA-03115: unsupported network datatype or representation" 错误
Getting "ORA-03115: unsupported network datatype or representation" error while fetching array of varchar from anonymous pl/sql
我在从匿名 PL/SQL 块中获取类型的 varray 时遇到 "ORA-03115: unsupported network datatype or representation " 异常。
我的代码是:
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: unsupported network datatype or
representation
这是由以下语句引起的:
cstmt.registerOutParameter(1, OracleTypes.ARRAY);
此语句表示数组将作为输出,但没有将实际的 Oracle 类型名称指定为第三个参数。您可以查看此 Oracle Doc 了解更多信息。
我们可以通过添加具有实际 Oracle 类型名称的第三个参数来修复异常“java.sql.SQLException: ORA-03115: unsupported network datatype or representation
”。在你的情况下是 NAMESARRAY
.
cstmt.registerOutParameter(1, OracleTypes.ARRAY,"NAMESARRAY");
但是上面的语句会抛出下面的异常 while 运行:
java.sql.SQLException: invalid name pattern: SCOTT.NAMESARRAY
这是因为我们没有在DB里面声明类型NAMESARRAY
。上面的异常表明用户是 SCOTT,但您可以连接到您选择的用户并创建类型。
正在数据库中创建类型:
connect scott/tiger
CREATE OR REPLACE TYPE namesarray AS VARRAY(5) OF VARCHAR2(10) ;
/
一旦我们创建了类型 NAMESARRAY
,如果我们在不更改的情况下执行您的代码,我们将遇到以下错误:
java.sql.SQLException: ORA-06550: line 1, column 180:
PLS-00382: expression is of wrong type ORA-06550: line 1, column 173:
PL/SQL: Statement ignored
此错误是因为我们已经在用户级别定义了类型,但我们正尝试在以下代码块中再次创建该类型:
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();}
}
}
我认为你正在使用 ojdbc14.jar
使用 ojbc6.jar 尝试一次,应该可以。
我在从匿名 PL/SQL 块中获取类型的 varray 时遇到 "ORA-03115: unsupported network datatype or representation " 异常。
我的代码是:
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: unsupported network datatype or representation
这是由以下语句引起的:
cstmt.registerOutParameter(1, OracleTypes.ARRAY);
此语句表示数组将作为输出,但没有将实际的 Oracle 类型名称指定为第三个参数。您可以查看此 Oracle Doc 了解更多信息。
我们可以通过添加具有实际 Oracle 类型名称的第三个参数来修复异常“java.sql.SQLException: ORA-03115: unsupported network datatype or representation
”。在你的情况下是 NAMESARRAY
.
cstmt.registerOutParameter(1, OracleTypes.ARRAY,"NAMESARRAY");
但是上面的语句会抛出下面的异常 while 运行:
java.sql.SQLException: invalid name pattern: SCOTT.NAMESARRAY
这是因为我们没有在DB里面声明类型NAMESARRAY
。上面的异常表明用户是 SCOTT,但您可以连接到您选择的用户并创建类型。
正在数据库中创建类型:
connect scott/tiger
CREATE OR REPLACE TYPE namesarray AS VARRAY(5) OF VARCHAR2(10) ;
/
一旦我们创建了类型 NAMESARRAY
,如果我们在不更改的情况下执行您的代码,我们将遇到以下错误:
java.sql.SQLException: ORA-06550: line 1, column 180:
PLS-00382: expression is of wrong type ORA-06550: line 1, column 173:
PL/SQL: Statement ignored
此错误是因为我们已经在用户级别定义了类型,但我们正尝试在以下代码块中再次创建该类型:
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();}
}
}
我认为你正在使用 ojdbc14.jar
使用 ojbc6.jar 尝试一次,应该可以。