第 六 章   调用存储函数

内容一览

从存储函数中获取ResultSet
    函数返回类型SETOF
    函数返回一个指针

    PostgreSQL?的JDBC驱动程序完全支持调用PostgreSQL?的存储函数。

 
Note
    CallableStatement支持和后端对存储过程的支持一样好。PostgreSQL?不支持有输出参数的函数。这意味着除了函数返回值,你不能在其他地方registerOutParameter。
 

    例6.1 在存储函数中调用built

    这个例子说明了如何在上述函数中调用PostgreSQL? built,简单实现把所提供的字符串转换成大写。

 
CallableStatement upperProc = conn.prepareCall("{ ? = call upper( ? ) }");
upperProc.registerOutParameter(1, Types.VARCHAR);
upperProc.setString(2, "lowercase to uppercase");
upperProc.execute();
String upperCased = upperProc.getString(1);
upperProc.close();

6.1 从存储函数中获取ResultSet

     PostgreSQL 的存储函数返回结果有两种方式。函数或者返回一个指针值或者返回某种数据类型的SETOF。函数应该怎么调用取决于是哪一种的返回方式。

6.1.1  函数返回类型SETOF

    返回集合数据的函数不能通过调用接口CallableStatement,而应该使用常规的Statement, 或者PreparedStatement 接口。

例6.2 从函数中读取SETOF类型值
 
Statement stmt = conn.createStatement();
stmt.execute("CREATE OR REPLACE FUNCTION setoffunc() RETURNS SETOF int AS "
        + "' SELECT 1 UNION SELECT 2;' LANGUAGE sql");

ResultSet rs = stmt.executeQuery("SELECT * FROM setoffunc()");
while (rs.next()) {
// do something
}
rs.close();
stmt.close();

6.1.2   函数返回一个指针

    调用返回指针的函数时,你必须映射返回类型的getObject到一个结果集中。

 
Note

    当前支持的从指针中创建ResultSet的方法有一些限制。这些限制是JDBC驱动程序而不是服务器的不足,在技术上是可以解决的,但是我们暂时没有时间。ResultSetMetaData不可用,调用getMetaData将返回空值;即使是一个基于ResultSet的指针,所有数据将被找到并且缓存在客户端。 “获得基于指针的结果集”章中描述的读取大小的参数将被忽略。

例6.3 从函数中获得指针的值
 
// Setup function to call.
Statement stmt = conn.createStatement();
stmt.execute("CREATE OR REPLACE FUNCTION refcursorfunc() RETURNS refcursor AS '"
        + " DECLARE "
         + " mycurs refcursor; "
        + " BEGIN "
        + " OPEN mycurs FOR SELECT 1 UNION SELECT 2; "
        + " RETURN mycurs; "
        + " END;' language plpgsql");
stmt.close();
// We must be inside a transaction for cursors to work.
conn.setAutoCommit(false);
// Procedure call.
CallableStatement proc = conn.prepareCall("{ ? = call refcursorfunc() }");
proc.registerOutParameter(1, Types.Other);
proc.execute();
ResultSet results = (ResultSet) proc.getObject(1);
while (results.next()) {
// do something with the results...
}
results.close();
proc.close();

把指针返回值直接看作游标名也是可能的,可以用ResultSet的getString实现。有了游标名,你可以自由地直接使用游标命令,像FETCH和MOVE

例6.4 把指针看作游标名
 
Note

conn.setAutoCommit(false);
CallableStatement proc = conn.prepareCall("{ ? = call refcursorfunc() }");
proc.registerOutParameter(1, Types.Other);
proc.execute();
String cursorName = proc.getString(1);
proc.close();


Prev  Up  Next
5.5 创建并修改数据库对象 Home 第 七 章  存储二进制数据