3

在 Oracle 中,我可以声明一个引用游标...

TYPE t_spool IS REF CURSOR RETURN spool%ROWTYPE;

...并使用它来传递游标作为返回值...

FUNCTION end_spool
    RETURN t_spool
    AS
    v_spool t_spool;
    BEGIN
        COMMIT;
        OPEN v_spool FOR
            SELECT
                *
            FROM
                spool
            WHERE
                key = g_spool_key
            ORDER BY
                seq;
        RETURN v_spool;
    END end_spool;

...然后使用 JDBC 将其捕获为结果集...

private Connection conn;
private CallableStatement stmt;
private OracleResultSet rset;
[...clip...]
stmt = conn.prepareCall("{ ? = call " + call + "}");
stmt.registerOutParameter(1, OracleTypes.CURSOR);
stmt.execute();
rset = (OracleResultSet)stmt.getObject(1);

MySQL中的等价物是什么?

4

3 回答 3

7

Mysql 有一个隐式游标,如果您发出选择,您可以神奇地从存储过程返回。

这是一个例子:

CREATE PROCEDURE `TEST`()
MODIFIES SQL DATA
BEGIN
  SELECT * FROM test_table;
END;

在你的java代码中:

String query = "{CALL TEST()}";
CallableStatement cs = con.prepareCall(query,
    ResultSet.TYPE_SCROLL_INSENSITIVE,
    ResultSet.CONCUR_READ_ONLY);
ResultSet rs = cs.executeQuery();
于 2009-01-15T02:32:49.403 回答
3

谷歌搜索 MySQL 中的游标,似乎您实际上不能从 Proc 或函数返回游标。此外,我在MySQL JDBC 手册中找到了以下内容:

“MySQL 不支持 SQL 游标,并且 JDBC 驱动程序不模拟它们,因此“setCursorName()”无效。”

总的来说,我相信 Oracle 在这里的实现会破坏 JDBC,并且不会在其他地方(MySQL、MSSQL 等)使用。您应该将结果作为选择语句返回并遍历 JDBC ResultSet,这是使用 JDBC 时的标准(和预期)实践。

于 2008-11-08T05:19:36.943 回答
-1

在过程中填写临时表,然后读取临时表... :)

于 2010-06-01T19:00:03.443 回答