我尝试了很多创建程序与光标没有成功。
在声明中,它正在工作:
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)
型
我试着从博客中取一些有用的例子,但我没有成功地运行它们。
(我得到了同样的错误)
我的代码有什么问题?
2条答案
按热度按时间ddhy6vgd1#
怎么了?至少有三件事。
1.不要滥用SYS、SYSTEM和类似的用户。他们不应该被用来作为你的Playground。创建另一个,在您计划使用的对象上授予特权,并在那里创建过程
1.你创建了一个不接受任何参数的过程,但是在调用它的时候,你仍然传递了
1
作为参数。为什么?为什么?1.你不需要
call
一个程序;使用begin-end
块,它总是工作,无处不在字符串
移动到 * 普通 * 用户:
型
测试:
型
从
call
开始:型
但是,您可以使用
exec
,但前提是您的客户端工具允许:型
pobjuy322#
我错过了:我不得不执行更多的grant命令来获取所有权限:
字符串
在我之前试过的那个之后
型