从匿名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
。
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:语句被忽略
该错误是因为我们已经在用户级别定义了类型,但是我们试图在以下代码块内再次创建类型:
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();}
}
}
问题内容: 我正在使用Oracle 11g数据库。当我尝试从db访问数据时,它显示错误java.sql.SQLException:ORA-03115:不支持的网络数据类型或表示形式。我不明白这个错误的意思.. 我的代码是: 任何人都可以帮助我解决这个问题。 问题答案: 代替: 您应该执行: 否则,您将不 准备 您的语句并丢失所有参数,因为您为其分配了新的SQL语句(即使它是相同的)。
我得到了 ORA-06502:PL/SQL:以下代码中出现数值或值错误:
我有一小段代码,抓取一些数据并生成SQL语句,将它们插入Oracle数据库。然后通过Oracle服务器上的JDBC驱动程序执行这些操作。 我遇到的问题是,如果这些语句包含一个TO_BINARY_DOUBLE调用,它们总是对我失败,而不是对我团队中的任何人失败,他们应该和我有完全相同的驱动程序和环境,这是非常奇怪的。 错误是: 希望有人能给我提供一些线索,或者给我指出正确的方向,试着找到它。
正如您所知,由于Oracle11g不支持json,我使用CLOB创建json数据,因为varchar2(32767)大小,但此时我得到了ORA-06502:PL/SQL:numeric或value错误。同时,数据大小为68075。为什么我得到错误,尽管Clob是支持4 gb的数据?
我在执行触发器时遇到以下错误: 请说明问题的原因。 编辑 数据类型: