我有一个以下的oracle存储过程
CREATE OR REPLACE
PROCEDURE getRejectedReasons
(
p_cursor IN OUT SYS_REFCURSOR)
AS
BEGIN
OPEN p_cursor FOR SELECT * FROM reasons_for_rejection;
END;
但是,当我在sql-developer中运行此存储过程时,我什么也看不见。我只是看到这样的事情:
Connecting to the database oracleLocal.
Process exited.
Disconnecting from the database oracleLocal.
我来自MS sql server并且习惯于在运行这样的存储过程时看到实际结果。这个存储过程是不是返回结果,因为我使用的是光标??
答案 0 :(得分:5)
存储过程正在返回一些事情,只是你没有对结果做任何事情。
只需在SQLDeveloper中运行以下脚本即可完成此操作:
VARIABLE csr REFCURSOR;
EXEC getRejectedReasons(:csr); -- the colon identifies the parameter as a variable
PRINT csr;
另一种方法是获取每一行并进行某种处理:
DECLARE
-- sys_refcursor is weakly typed
refcsr SYS_REFCURSOR;
-- define a record so we can reference the fields
rej_rec Reasons_for_Rejection%ROWTYPE;
BEGIN
getRejectedReasons(refcsr);
-- loop through the results
LOOP
-- gets one row at a time
FETCH refcsr INTO rej_rec;
-- if the fetch doesn't find any more rows exit the loop
EXIT WHEN refcsr%NOTFOUND;
-- Do something here.
-- For example : DBMS_OUTPUT.PUT_LINE(rej_rec.reason_desc);
END LOOP;
END;
答案 1 :(得分:1)
你打开了光标。你没有从中选择任何东西,更新它或推进它。
所有打开都有效地将匹配的行选择到临时内存中,因此您可以逐行前进游标。你没有做的。
答案 2 :(得分:0)
Oracle和SQL Server之间的区别之一是后者自然返回结果集。顺便说一句,我会使用一个函数。
在Oracle中,函数通常返回单个元素。游标后来出现了。
在线有一些文档可以帮助您理解refcursor绑定变量的使用。这是SQL * Plus的一个:
http://download.oracle.com/docs/cd/B19306_01/server.102/b14357/ch5.htm#sthref1122
我认为在SQL Developer中你可以用autoprint做同样的事情,虽然我还没有测试过。
找到一篇也讨论类似内容的博客:
答案 3 :(得分:-1)
ETA:好的。忽略我写的东西。听别人说显然这是错的,因为我投了票。
tpdi说的是对的。声明后,您必须对光标执行某些操作。
以下是在嵌套循环中使用两个游标的示例
PROCEDURE update_insert_tree (exid_in IN NUMBER, outvar_out OUT VARCHAR2)
IS
nxtid NUMBER;
phaseid NUMBER;
rowcounter1 NUMBER;
BEGIN
rowcounter1 := 0;
outvar_out := 0;
FOR acur IN (SELECT dept_exercise_id, phase
FROM ep_dept_exercise
WHERE exercise_id = exid_in)
LOOP
<<dept_loop>>
FOR thecur IN (SELECT document_name, thelevel, sortnum, type_flag,
ex_save_id
FROM ep_exercise_save
WHERE exercise_id = exid_in)
LOOP
phaseid := acur.phase;
IF phaseid = 0
THEN
phaseid := 10;
UPDATE ep_dept_exercise
SET phase = 10
WHERE dept_exercise_id = acur.dept_exercise_id;
END IF;
<<doc_loop>>