Что эквивалентно REF CURSOR Oracle в MySQL при использовании JDBC? - PullRequest
3 голосов
/ 08 ноября 2008

В 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 ]

7 голосов
/ 15 января 2009

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();
3 голосов
/ 08 ноября 2008

Поиск в курсорах в MySQL, не похоже, что вы на самом деле можете вернуть курсор из Proc или Function. Кроме того, в руководстве MySQL JDBC я нашел следующее:

«MySQL не поддерживает курсоры SQL, а драйвер JDBC не эмулирует их, поэтому« setCursorName () »не действует».

В целом, я считаю, что реализация Oracle здесь нарушает JDBC и не используется в других местах (MySQL, MSSQL и т. Д.). Вы должны возвращать свои результаты как оператор выбора и выполнять итерации по JDBC ResultSet, как это обычно (и предполагается), при использовании JDBC.

0 голосов
/ 01 июня 2010

заполнить временную таблицу в процедуре и просто прочитать временную таблицу ...:)

...