java.sql.SQLException:ORA-03115:不支持的网络数据类型或表示形式
这是由以下语句引起的:
cstmt.registerOutParameter(1, OracleTypes.ARRAY);
该语句说array将是输出,但没有将实际的Oracle Type名称指定为第三个参数。您可以检查此Oracle
Doc,以获取有关此信息的更多信息。
我们可以
java.sql.SQLException: ORA-03115: unsupported network datatype orrepresentation通过添加带有实际Oracle类型名称的第三个参数来修复异常“ ”。在你的情况是
NAMESARRAY。
cstmt.registerOutParameter(1, OracleTypes.ARRAY,"NAMESARRAY");
但是上面的语句在运行时将引发以下异常:
java.sql.SQLException:无效的名称模式:SCOTT.NAMESARRAY
这是因为我们尚未
NAMESARRAY在DB内部声明类型。上面的例外将用户表示为SCOTT,但是您可以连接到您选择的用户并创建类型。
在数据库中创建类型:
connect scott/tigerCREATE 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;";
如果在编译后执行程序,则将其删除后,我们应该能够看到以下输出:
KavitaPritamAyanRishavAziz
以下是更新的程序:
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();} }}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)