Что эквивалентно REF CURSOR Oracle в MySQL при использовании JDBC?
В 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?
3 ответа
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();
Погугливая курсоры в MySQL, не похоже, что вы на самом деле можете вернуть курсор из Proc или Function. Кроме того, я обнаружил следующее в руководстве по MySQL JDBC:
"MySQL не поддерживает курсоры SQL, и драйвер JDBC не эмулирует их, поэтому"setCursorName()"не имеет никакого эффекта".
В целом, я считаю, что реализация Oracle нарушает JDBC и не используется в других местах (MySQL, MSSQL и т. Д.). Вы должны возвращать свои результаты как оператор выбора и выполнять итерации по JDBC ResultSet, как это обычно (и предполагается), при использовании JDBC.
Заполнить временную таблицу в процедуре и просто прочитать временную таблицу...:)