oracle 如何将声明游标语句转换为存储过程

x6492ojm  于 2023-08-03  发布在  Oracle
关注(0)|答案(2)|浏览(86)

我尝试了很多创建程序与光标没有成功。
在声明中,它正在工作:

DECLARE 
sid varchar(20);
CURSOR mycursor IS 
SELECT SID
FROM "V$SESSION";

BEGIN
    OPEN MYCURSOR;
    LOOP
        FETCH mycursor INTO SID;
        EXIT WHEN mycursor%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE(SID);
    END LOOP;
    CLOSE mycursor;
END;

字符串
但是当我试图将它放入存储过程并调用它时,我得到了无效状态错误:

CREATE OR REPLACE PROCEDURE SYSTEM.getSessionInfo
AS
sid varchar(20);
 CURSOR mycursor IS 
SELECT SID
FROM "V$SESSION";

BEGIN
    OPEN MYCURSOR;
    LOOP
        FETCH mycursor INTO SID;
        EXIT WHEN mycursor%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE(SID);
    END LOOP;
    CLOSE mycursor;
END;

CALL SYSTEM.getSessionInfo(1)


我试着从博客中取一些有用的例子,但我没有成功地运行它们。
(我得到了同样的错误)
我的代码有什么问题?

ddhy6vgd

ddhy6vgd1#

怎么了?至少有三件事。
1.不要滥用SYS、SYSTEM和类似的用户。他们不应该被用来作为你的Playground。创建另一个,在您计划使用的对象上授予特权,并在那里创建过程
1.你创建了一个不接受任何参数的过程,但是在调用它的时候,你仍然传递了1作为参数。为什么?为什么?
1.你不需要call一个程序;使用begin-end块,它总是工作,无处不在

SQL> show user
USER is "SYS"
SQL> grant select on v_$session to scott;

Grant succeeded.

字符串
移动到 * 普通 * 用户:

SQL> connect scott@pdb1
Enter password:
Connected.
SQL> create or replace procedure getsessioninfo
  2  as
  3    sid varchar(20);
  4    cursor mycursor is
  5      select sid
  6      from v$session;
  7  begin
  8      open mycursor;
  9      loop
 10          fetch mycursor into sid;
 11          exit when mycursor%notfound;
 12          dbms_output.put_line(sid);
 13      end loop;
 14      close mycursor;
 15  end;
 16  /

Procedure created.


测试:

SQL> set serveroutput on
SQL> begin
  2    getsessioninfo;
  3  end;
  4  /
1
2
3
4
9
14
16
17
124
<snip>
868
874
878
879

PL/SQL procedure successfully completed.

SQL>


call开始:

SQL> call  getsessioninfo;
call  getsessioninfo
      *
ERROR at line 1:
ORA-06576: not a valid function or procedure name

SQL>


但是,您可以使用exec,但前提是您的客户端工具允许:

SQL> exec  getsessioninfo;
1
2
3
4
<snip>

pobjuy32

pobjuy322#

我错过了:我不得不执行更多的grant命令来获取所有权限:

SQL> grant select_catalog_role to USERNAME

Grant succeeded.

SQL> grant select any dictionary to USERNAME

Grant succeeded.

字符串
在我之前试过的那个之后

SQL> grant select on v_$session to USERNAME;

Grant succeeded.

相关问题