Oracle不是有效的函数或过程名称

时间:2013-12-13 18:23:22

标签: java oracle stored-procedures

我编译了以下JAVA类并将其加载到数据库中。

import java.sql.*;
import java.io.*;

    public class BeerBeer {
      // Edit to return ResultSet
      public static String getBreweryInfo (int Raz_ID) 
      throws SQLException 
      { 
        String sql = 
          "SELECT Nosaukums FROM Alus_razotaji WHERE ID = ?";//vaicajums
        String toReturn = "";
        try {
          Connection conn = DriverManager.getConnection("jdbc:default:connection:");
          PreparedStatement apstmt = conn.prepareStatement(sql);
          apstmt.setInt(1, Raz_ID); 
          ResultSet rset = apstmt.executeQuery();// SQL vaicājuma izpildīšana
          if (rset.next()) {
              toReturn = rset.getString(1);
              rset.close();
              apstmt.close();
              return toReturn;
          }else{
              return toReturn;
          } 
        }
        catch (SQLException e) {
          System.err.println(e.getMessage()); //Kļūdu izvadīsana
          toReturn = "Exx";
          return toReturn;
        } 
      }
    }

我制作了一个与Java方法调用相关联的PL / SQL包。

 CREATE OR REPLACE PACKAGE BeerBeer AS
FUNCTION getBreweryInfo(Raz_ID number) RETURN varchar2;
END BeerBeer;

CREATE OR REPLACE PACKAGE BODY BeerBeer AS
  FUNCTION getBreweryInfo(Raz_ID number) RETURN varchar2 AS Language Java
  NAME 'BeerBeer.getBreweryInfo(int) return java.lang.String';
END BeerBeer;

当我尝试通过以下方式调出函数时: CALL BeerBeer.getBreweryInfo(3)我收到错误:不是有效的函数或过程名。

可能出现什么问题?

1 个答案:

答案 0 :(得分:2)

您已在程序包中创建了一个函数,但您尝试将其称为过程。没有名为getBreweryInfo的程序,只有一个功能。返回值必须在某个地方。

假设这是从Java调用的,调用in my earlier answer仍然适用 - 您需要一个占位符作为返回值,注册为out参数。

如果您是从SQL * Plus进行测试,则可以执行以下操作:

var razotaji varchar2(80);
exec :razotaji := beerbeer.getBreweryInfo(3);
print razotaji

或者在PL / SQL块中:

set serveroutput on
declare
  razotaji varchar2(80);
  razotaji := beerbeer.getBreweryInfo(3);
  dbms_output(razotaji);
end;
/

@rgettman建议的内容也应该有效:

select BeerBeer.getBreweryInfo(3) from dual;

您说的错误消息:

ORA-00904 "BeerBeer"."GetBreweryInfo" invalid identifier

建议您没有完全按照建议执行,但将标识符包装在双引号中,否则消息中的标识符将为大写。 Oracle仅对引用的标识符区分大小写。由于您(正确地)在创建包时没有引用标识符,因此在调用它时不应引用它们。所以这对你定义的内容是错误的:

select "BeerBeer"."GetBreweryInfo"(3) from dual;