在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中的等价物是什么?
答案 0 :(得分:7)
Mysql有一个隐式游标,如果你发出一个select,你可以从存储过程中神奇地返回。
以下是一个例子:
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();
答案 1 :(得分:3)
在MySQL中搜索游标,看起来你实际上并不能从Proc或Function返回一个Cursor。另外,我在MySQL JDBC manual中找到了以下内容:
“MySQL不支持SQL游标,并且JDBC驱动程序不会模拟它们,因此”setCursorName()“无效。”
总的来说,我认为Oracle的实现在这里打破了JDBC,并没有在其他地方使用(MySQL,MSSQL等)。您应该将结果作为select语句返回并遍历JDBC ResultSet,这是使用JDBC时的标准(和预期)实践。
答案 2 :(得分:-1)
在过程中填写一个临时表,然后只读取临时表...:)