Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
&引用;SQLException:ORA-06550“;从Java调用PL/SQL函数时_Java_Sql_Oracle_Jdbc_Plsql - Fatal编程技术网

&引用;SQLException:ORA-06550“;从Java调用PL/SQL函数时

&引用;SQLException:ORA-06550“;从Java调用PL/SQL函数时,java,sql,oracle,jdbc,plsql,Java,Sql,Oracle,Jdbc,Plsql,我想使用Java从数据库检索数据并显示它,所以我创建了这个PL/SQL函数,它返回一个游标: create or replace function std_getInfoFunc return types.cursortype as my_cursor types.cursorType; begin open my_cursor FOR SELECT s.FirstName, s.LastName, s.Address, s.City, s.Province

我想使用Java从数据库检索数据并显示它,所以我创建了这个PL/SQL函数,它返回一个游标:

create or replace function std_getInfoFunc return types.cursortype 
as 
    my_cursor    types.cursorType; 
begin 
    open my_cursor FOR
    SELECT s.FirstName, s.LastName, s.Address, s.City, s.Province
        , s.PostalCode, c.CourseName
    FROM Students s, Courses c, StudentAndCourses cs
    Where s.StudentID = cs.StudentID
        AND c.CourseID = cs.CourseID;
    Return my_cursor;
end; 
在我的Java代码中,我调用函数如下:

try{
    CallableStatement cst=connection.prepareCall("{? = call std_getInfoFunc}");
    cst.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);
    cst.execute();

    res=(ResultSet) cst.getObject(1);

    while(res.next()){
        System.out.println(res.getString(1));
    }
}
catch(SQLException e){
    e.printStackTrace();
}
finally{
    res.close();
    cst.close();
    conn.close();
}
该代码生成以下异常:

 run:
  java.sql.SQLException: ORA-06550: line 1, column 13:
   PLS-00905: object SAS.STD_GETINFOFUNC is invalid
  ORA-06550: line 1, column 7:
  PL/SQL: Statement ignored

at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:439)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:395)
at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:802)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:436)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:186)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:521)
at oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:202)
at        
  oracle.jdbc.driver.T4CCallableStatement.executeForRows(T4CCallableStatement.java:1005)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1307)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3449)
at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3550)
at oracle.jdbc.driver.OracleCallableStatement.execute(OracleCallableStatement.java:4710)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.execute(OraclePreparedStatementWrapper.java:1374)
at DBControler.viewStdInfo(DBControler.java:95)
at Test_02.main(Test_02.java:18)

为什么?

创建函数时没有出错吗?如果缺少类型或任何表,则将创建函数,但函数体将无效,因为它无法编译


如果函数是在没有错误的情况下创建的,然后删除或更改了它所依赖的对象,则该函数将被标记为无效,可以重新编译,但如果无法编译(缺少表或列或其他内容),则可能会失败。

可能的错误原因是:(在代码段-函数中)

一,。 包“类型”不存在

  create or replace package types 
    as 
        type cursorType is ref cursor; 
    end; 
    /
2无效的SQL select语句(表或列在创建函数后已被删除或更改)


您需要使用
simple
sql语句编写
new函数
,并在
sql
提示符下使用
Java
code运行它。

引发了什么异常?错误在哪一行?eclipse显示了这个错误:java.sql.SQLException:ORA-06550:line 1,第13列:PLS-00905:object SAS.STD_GETINFOFUNC无效ORA-06550:line 1,第7列:PL/sql:Statement ignoredi如果您查看异常,您将看到它说GETINFOFUNC无效。我建议查看此函数是否存在,以及您是否正确使用了它是的,我在运行它之前创建了此函数。我的函数代码在帖子的顶部,看起来是正确的。请看一看我的函数代码。@SasvathanSarvanandan-其中一个表在当前架构中不存在。请检查您在函数中编写的表的名称。我检查了所有表和列,但表的结构似乎没有任何问题。如果您进入Toad,它将显示哪些对象无效以及原因。是的,您是对的,包是问题所在。非常感谢你的帮助。