【问题标题】:Close cursor in stored procedure in oracle implicitly or explicitly in Oracle 10?在 Oracle 10 中隐式或显式地关闭 oracle 存储过程中的游标?
【发布时间】:2026-01-09 15:20:02
【问题描述】:

我使用存储在 Oracle 10.2 中的过程,我有一个问题,在这个版本中,Cursor 是隐式关闭还是隐式关闭?或者关闭sinse Java,例如:

sql = "{ call procedureName (?,?)}";
    PreparedStatement st = getCon().prepareCall(sql);
    .
    .
    .
    st.execute();
    .
    .
    .
    st.close();

以及在存储过程中哪里关闭游标?

谢谢!

添加存储过程。

CREATE OR REPLACE PROCEDURE OWNER.STOREDPROCEDURE(
    V_OPTION IN NUMBER,
    V_STA IN OWNER.TABLENAME.ATTRIBUTENAME%TYPE,
    V_DESC IN OWNER.TABLENAME.ATTRIBUTENAME%TYPE,
    V_CURSOR OUT SYS_REFCURSOR,
    Error_Code OUT NUMBER,
    Error_Msg OUT VARCHAR2)

    IS
    V_ST_LN NUMBER:= LENGTH(V_STA);
    V_DSC_LN NUMBER:= LENGTH(V_DESC);
    BEGIN
        IF V_ST_LN >0 AND V_DSC_LN >0 THEN
            IF V_STA IS NOT NULL  AND V_OPTION IS NOT NULL THEN
                CASE V_OPTION
                    WHEN 1 THEN
                        OPEN V_CURSOR FOR
                            SELECT *FROM OWNER.TABLENAME SB WHERE SB.STA = V_STA;
                            Error_Code:=0;
                            Error_Msg:='DONE';
                    WHEN 2 THEN
                        IF  V_DESC IS NOT NULL THEN
                            OPEN V_CURSOR FOR
                                SELECT *FROM OWNER.TABLENAME SB WHERE SB.STA = V_STA AND SB.DESC != V_DESC;
                                Error_Code:=0;
                                Error_Msg:='DONE';
                        ELSE
                                Error_Code:=1;
                                Error_Msg:='NO CONDITIONS TO BE EXECUTED STOREDPROCEDURENAME';
                        END IF;
                END CASE;
                ELSE
                    Error_Code:=1;
                    Error_Msg:='NO CONDITIONS TO BE EXECUTED STOREDPROCEDURENAME';
            END IF;
        ELSE
             Error_Code:=1;
              Error_Msg:='NO CONDITIONS TO BE EXECUTED STOREDPROCEDURENAME';
          END IF;
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            Error_Code:=1;
            Error_Msg:='DONE, NO DATA FOUND';
            RAISE_APPLICATION_ERROR (-20100, 'NO DATA FOUND  STOREDPROCEDURENAME(' || SQLCODE || ' ' || SQLERRM || ')');
         WHEN OTHERS THEN
            Error_Code:=4;
            Error_Msg:=SQLCODE || ' ' || SQLERRM;
            RAISE_APPLICATION_ERROR ( 20100, 'DON'T EXECUTE STOREDPROCEDURENAME (' || SQLCODE || ' ' || SQLERRM || ')');
END STOREDPROCEDURENAME;
/
GRANT EXECUTE ON OWNER.STOREDPROCEDURE TO USER;

在哪里关闭我的 CURSOR?

【问题讨论】:

  • 你的意思是如何关闭你在Oracle存储过程中的CURSOR?您需要在程序中执行此操作。如果你的意思是 JDBC Statement,你应该使用 try-with-resources 来关闭它。
  • 是的,在存储过程中。
  • 那请分享程序的相关部分。
  • @MickMnemonic 更新我的帖子!谢谢

标签: java sql oracle stored-procedures jdbc


【解决方案1】:

只是为了使光标概念清晰:

隐式光标:

  • 对于只有一个结果的 SQL 语句。例如:

更新 ... 设置 .. WHERE id=47

  • DB-Server 负责处理。

显式光标:

  • 面向集合的查询,其结果可以包含多于 1 行。
  • 在过程中明确声明。

游标的打开和关闭在程序中正常发生。

在使用Cursor-For-Loop时,Cursor的打开和关闭会自动完成。

【讨论】: