存储过程中的游标完成并卡住(Oracle Linux VM上的Oracle 11g)

时间:2015-05-06 20:35:13

标签: oracle plsql plsqldeveloper

我在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>

任何人都有可能导致它发生的原因吗?

1 个答案:

答案 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;

因此您不必担心关闭不在您程序中的光标