Sql*_*oob 8 java oracle plsql function jdbc
所以我有一个功能可以检查我的预订表中有多少取消:
CREATE OR REPLACE FUNCTION total_cancellations
RETURN number IS
t_canc number := 0;
BEGIN
SELECT count(*) into t_canc
FROM booking where status = 'CANCELLED';
RETURN t_canc;
END;
/
Run Code Online (Sandbox Code Playgroud)
要在sql中执行他,我使用:
set serveroutput on
DECLARE
c number;
BEGIN
c := total_cancellations();
dbms_output.put_line('Total no. of Cancellations: ' || c);
END;
/
Run Code Online (Sandbox Code Playgroud)
我的结果是:
anonymous block completed
Total no. of Cancellations: 1
Run Code Online (Sandbox Code Playgroud)
我的问题是有人可以帮我调用JAVA中的函数,我试过但没有运气.
Java提供CallableStatements了这样的目的.
CallableStatement cstmt = conn.prepareCall("{? = CALL total_cancellations()}");
cstmt.registerOutParameter(1, Types.INTEGER);
cstmt.setInt(2, acctNo);
cstmt.executeUpdate();
int cancel= cstmt.getInt(1);
System.out.print("Cancellation is "+cancel);
Run Code Online (Sandbox Code Playgroud)
将打印与pl/sql中相同的打印方式.根据文档Connection#prepareCall(),
创建CallableStatement对象以调用数据库存储过程.CallableStatement对象提供了用于设置其IN和OUT参数的方法,以及用于执行对存储过程的调用的方法.
您还可以传递函数的参数.对于前者,
conn.prepareCall("{? = CALL total_cancellations(?)}");
cstmt.setInt(2, value);
Run Code Online (Sandbox Code Playgroud)
将值作为输入参数传递给函数.
希望这可以帮助 !
准备可调用语句
有两种可用格式:Oracle 使用的熟悉的块语法和 ANSI 92 标准语法。在我们的示例程序中,块语法的形式如下:
CallableStatement vStatement = vDatabaseConnection.prepareCall( "begin ? := javatest( ?, ? ); end;" );ANSI 92 语法的形式为:
Run Code Online (Sandbox Code Playgroud)CallableStatement vStatement = vDatabaseConnection.prepareCall( "{ ? = call javatest( ?, ? )}");
如果您收到以下错误,您可能需要使用第一种格式。
Total_cancellations 不是一个过程或者是未定义的错误。
示例代码。
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@xx.xxx.xx.xxx:1521:xxx", "user","pass");
CallableStatement cstmt = conn.prepareCall("begin ? := TEST_FUNC(?,?); end;");
cstmt.registerOutParameter(1, Types.INTEGER);
cstmt.setString(2, "Test");
cstmt.setInt(3, 1001);
cstmt.execute();
int result = cstmt.getInt(1);
System.out.print("Result: " + result);
cstmt.close();
conn.close();
Run Code Online (Sandbox Code Playgroud)