Java 在oracle 10中,是隐式关闭还是显式关闭oracle存储过程中的游标?
Iam使用存储在Oracle10.2中的过程,我有一个问题,在这个版本中,光标是隐式关闭还是隐式关闭?或关闭sinse Java,例如:Java 在oracle 10中,是隐式关闭还是显式关闭oracle存储过程中的游标?,java,sql,oracle,stored-procedures,jdbc,Java,Sql,Oracle,Stored Procedures,Jdbc,Iam使用存储在Oracle10.2中的过程,我有一个问题,在这个版本中,光标是隐式关闭还是隐式关闭?或关闭sinse Java,例如: sql = "{ call procedureName (?,?)}"; PreparedStatement st = getCon().prepareCall(sql); . . . st.execute(); . . . st.close(); 以及在存储过程中的何处关闭光标 谢谢
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;
在此处关闭光标的位置?只是为了明确光标的概念: 隐式光标:
- 对于只有一个结果的SQL语句。例如:
- DB服务器处理这个问题
- 面向集合的查询,其结果可以包含多行
- 在过程中明确声明
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;
使用循环游标时,游标的打开和关闭将自动完成。您的意思是如何关闭Oracle存储过程中的
游标?您需要在程序中执行此操作。如果您指的是JDBC语句
,您应该使用它来关闭它。是的,在存储过程中。然后请共享该过程的相关部分。@MickMnemonic更新我的帖子!感谢可能的副本,请阅读第一章。只需要几分钟。以后谢谢我;)