【问题标题】:PLS-00201 when calling executing PLSQL from java从 java 调用执行 PLSQL 时的 PLS-00201
【发布时间】:2017-02-17 15:21:35
【问题描述】:

当我尝试在 Oracle 本身中执行该过程时,它工作正常。但是当我从 java 调用相同的过程时,我得到了 PLS-00201 。如果有任何错误,请告诉我。

java.sql.SQLException: ORA-06550: line 1, column 7:
PLS-00201: identifier 'PR_REJECT_FILE' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:330)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:287)

这是我的程序调用:

CallableStatement cs=null;

    try
    {
        cs = this.dteConn.prepareCall("{ call PR_REJECT_FILE (?,?,?) }");
        cs.setString(1,status);
        cs.setInt(2, fileid);
        cs.setString(3,t_id);
        cs.execute();

    }
    catch (Exception e) 
    {
        e.printStackTrace();
    }

【问题讨论】:

  • 检查用户是否对该数据库有权限
  • 首先检查用户是否拥有这个过程。如果没有,请检查用户是否对该过程执行了授权。第三检查过程中是否有公共同义词,否则应将其命名为 SCHEMA_NAME.PR_REJECT_FILE ,其中 schema_name 是拥有它的用户。

标签: java oracle stored-procedures


【解决方案1】:

PR_REJECT_FILE 是什么?我的意思是它是一个函数还是一个过程? call 命令不适用于 PL/SQL,而是用于 sql*plus。 我的意思是您不能像在 PLSQL 的代码中那样调用过程或函数,这取决于 PR_REJECT_FILE 的输出以及拥有它的用户或架构。

如果是过程,你可以这样称呼它:

begin
PR_REJECT_FILE (?,?,?);
end;

如果它是一个返回标量值的函数,你可以像下面这样调用它:

select PR_REJECT_FILE (?,?,?) from dual;

如果PR_REJECT_FILE 是给另一个用户的,并且你有执行它的权限,那么你必须在上面的代码中带上那个用户的前缀(user.PR_REJECT_FILE)。

我更喜欢搜索使用 JDBC 的包、过程或函数。

【讨论】:

  • 抱歉没有添加,这是一个程序。在 Java 中,调用将采用该语法。我有其他来自 java 的相同语法的过程调用
  • 是的,你说得对,你可以和JDBC一起使用,我记得我曾经这样使用过,但是据我所知,SQLPLUS中的调用过程是这样的,不是int PLSQL,在PLSQL中你不需要调用关键字。
【解决方案2】:

将程序的执行权限授予 Java 应用程序中使用的 db 用户名。

GRANT EXECUTE ON PR_REJECT_FILE TO DBUsername_used_in_your_Java_Application;

例如

GRANT EXECUTE ON PR_REJECT_FILE TO APPDBUSERNAME;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-15
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多