我在Oracle VM VirutalBox中安装了Oracle Linux 11g。 (分配4GB RAM) 我有一个有几个表的用户。我在这个用户的模式中创建了一个过程,它使用了一个游标:
CREATE OR REPLACE PROCEDURE SHOW_STATS (p_emp_id IN number)
IS
v_name varchar2(50);
CURSOR c_stat IS
SELECT J.IS_DESCRIPTION as st_name, count(*) AS st_count
FROM inventory I , inventory_status J
WHERE I.STATUS=J.IS_ID and I.EMPLOYEE_ID = p_emp_id
GROUP BY J.IS_DESCRIPTION;
c_stat_rec c_stat%rowtype;
BEGIN
IF NOT c_stat%ISOPEN THEN
OPEN c_stat;
END IF;
SELECT first_name || ' ' || last_name
INTO v_name
FROM employees
WHERE employee_id = p_emp_id;
DBMS_OUTPUT.PUT_LINE ('Employee ' || v_name || ' Stats:');
DBMS_OUTPUT.PUT_LINE ('-----------------------------------------');
LOOP
FETCH c_stat INTO c_stat_rec ;
EXIT WHEN c_stat%NOTFOUND ;
DBMS_OUTPUT.PUT_LINE (c_stat_rec.st_count || ' items in status ' || c_stat_rec.st_name);
END LOOP;
END;
该过程已成功编译。 当我在我的笔记本电脑(Win8)上测试PL / SQL Developer上的程序时 - 它在运行程序后卡住了。即,当我通过一个简单的块进行测试时:
begin
-- Call the procedure
show_stats(10004);
end;
我在游标中尝试了SELECT语句 - 它运行并提供输出。
调试运行过程好了(出于某种原因,没有输出),但是当它退出程序时,我得到了防沙处理,PL / SQL客户端卡住了,我不得不让它崩溃。 / p>
任何人都有可能导致它发生的原因吗?
答案 0 :(得分:0)
为什么不使用这样的游标?
CREATE OR REPLACE PROCEDURE SHOW_STATS (p_emp_id IN number)
is
v_name varchar2(100);
begin
SELECT first_name || ' ' || last_name
INTO v_name
FROM employees
WHERE employee_id = p_emp_id;
for i in (
SELECT J.IS_DESCRIPTION as st_name, count(*) AS st_count
FROM inventory I , inventory_status J
WHERE I.STATUS=J.IS_ID and I.EMPLOYEE_ID = p_emp_id
GROUP BY J.IS_DESCRIPTION) loop
end loop;
exception
when others then
dbms_output.put_line(sqlerrm);
end;
因此您不必担心关闭不在您程序中的光标