我编译了以下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)我收到错误:不是有效的函数或过程名。
可能出现什么问题?
答案 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;