游标类型为的包内ORACLE调用存储过程
我真的很难调用下面的存储过程。我使用的是oracle sql developer版本19.2。我尝试过的是,但我收到了错误(与评论中描述的错误相同)。为什么从SQLDeveloper调用如此简单的存储过程如此困难游标类型为的包内ORACLE调用存储过程,oracle,plsql,Oracle,Plsql,我真的很难调用下面的存储过程。我使用的是oracle sql developer版本19.2。我尝试过的是,但我收到了错误(与评论中描述的错误相同)。为什么从SQLDeveloper调用如此简单的存储过程如此困难 create or replace PACKAGE BODY "PCK_FIRST" IS PROCEDURE GET_GETNAMES( USER_ID IN NUMBER, M_RESULT OUT TYPES.CURSOR_TY
create or replace PACKAGE BODY "PCK_FIRST" IS
PROCEDURE GET_GETNAMES(
USER_ID IN NUMBER,
M_RESULT OUT TYPES.CURSOR_TYPE
) IS
BEGIN
OPEN M_RESULT FOR
SELECT * FROM PER_NAMES WHERE ID = USER_ID;
END;
END PCK_FIRST;
首先,我建议您运行此操作,然后再次尝试执行您的过程
create or replace package types as
type cursor_type is ref cursor;
end
/
否则尝试更改类型。使用sys\u refcursor键入光标
--example
create table test_user (
user_id number(19) not null,
username varchar2(50)
);
insert into test_user values (1, 'user1');
insert into test_user values (2, 'user2');
create or replace procedure test_proc (
p_user_id in number,
p_out_rec out sys_refcursor
)
is
l_out SYS_REFCURSOR;
begin
open l_out for
select *
from test_user
where user_id = p_user_id;
end;
/
declare
l_output sys_refcursor;
l_userid number := 1;
begin
test_proc(1, l_output);
end;
PL/SQL procedure successfully completed.
首先,我建议您运行此操作,然后再次尝试执行您的过程
create or replace package types as
type cursor_type is ref cursor;
end
/
否则尝试更改类型。使用sys\u refcursor键入光标
--example
create table test_user (
user_id number(19) not null,
username varchar2(50)
);
insert into test_user values (1, 'user1');
insert into test_user values (2, 'user2');
create or replace procedure test_proc (
p_user_id in number,
p_out_rec out sys_refcursor
)
is
l_out SYS_REFCURSOR;
begin
open l_out for
select *
from test_user
where user_id = p_user_id;
end;
/
declare
l_output sys_refcursor;
l_userid number := 1;
begin
test_proc(1, l_output);
end;
PL/SQL procedure successfully completed.
声明类型为
TYPES.CURSOR\u VALUE
的变量,然后将其用作游标的输出:
声明
cur TYPES.CURSOR_TYPE;
每个名称的p_id。id%类型;
每个p_名称的p_名称。名称%TYPE;
开始
PCK_优先。获取名称(1,cur);
环
将cur提取到p_id、p_名称中;
未找到cur%时退出;
DBMS|u OUTPUT.PUT|u行(p|id | |':'| | p| u name);
端环;
封闭电流;
结束;
/
小提琴
如果要在SQL Developer中调用它,请执行以下操作:
变量cur REFCURSOR;
首先执行pck_,获取getnames(1,:cur);
印刷电路;
并使用F5将其作为脚本运行(而不是使用Ctrl-Enter作为单个语句运行)。声明类型为
TYPES的变量。CURSOR\u VALUE
然后将其用作光标的输出:
声明
cur TYPES.CURSOR_TYPE;
每个名称的p_id。id%类型;
每个p_名称的p_名称。名称%TYPE;
开始
PCK_优先。获取名称(1,cur);
环
将cur提取到p_id、p_名称中;
未找到cur%时退出;
DBMS|u OUTPUT.PUT|u行(p|id | |':'| | p| u name);
端环;
封闭电流;
结束;
/
小提琴
如果要在SQL Developer中调用它,请执行以下操作:
变量cur REFCURSOR;
首先执行pck_,获取getnames(1,:cur);
印刷电路;
并使用F5将其作为脚本运行(而不是使用Ctrl-Enter作为单个语句运行)。问题在于我无法更改存储过程。它在更大的包装内。我只想这样称呼它。为什么更改游标如此重要?问题是我不能更改存储过程。它在更大的包装内。我只想这样称呼它。为什么更改光标如此重要?在您链接到的答案的注释中描述了几个不同的错误。具体是什么错误?你到底是怎么称呼这个过程的。在您对另一个答案的评论中,您指出此过程在一个包中。对吗?我假设这与定义了
游标类型的包不同?@JustinCave-是的,过程在包内。我已经编辑了我的代码。对不起,我不明白你问题中关于类型的另一部分?你的过程声明说m\u result
是类型。cursor\u类型
。这意味着您有一个types
包,其中定义了cursor\u type
。我的猜测是,它被定义为一个简单的弱类型ref游标(即,它与sys\u refcursor
相同),但这只是一个猜测。您用来调用此过程的代码是什么?您得到的错误是什么?@JustinCave-应该在哪里声明此游标?当然它在“类型”文件夹中——我已经检查了所有类型。错误是:未声明绑定变量“c”类型
包中的游标类型
的声明是什么?它是一个简单的弱类型ref游标吗?您用来调用过程的代码是什么?我假设变量c
就是在这里使用的,没有声明。在您链接到的答案的注释中描述了几个不同的错误。具体是什么错误?你到底是怎么称呼这个过程的。在您对另一个答案的评论中,您指出此过程在一个包中。对吗?我假设这与定义了游标类型的包不同?@JustinCave-是的,过程在包内。我已经编辑了我的代码。对不起,我不明白你问题中关于类型的另一部分?你的过程声明说m\u result
是类型。cursor\u类型
。这意味着您有一个types
包,其中定义了cursor\u type
。我的猜测是,它被定义为一个简单的弱类型ref游标(即,它与sys\u refcursor
相同),但这只是一个猜测。您用来调用此过程的代码是什么?您得到的错误是什么?@JustinCave-应该在哪里声明此游标?当然它在“类型”文件夹中——我已经检查了所有类型。错误是:未声明绑定变量“c”类型
包中的游标类型
的声明是什么?它是一个简单的弱类型ref游标吗?您用来调用过程的代码是什么?我假设这就是变量c
未经声明就被使用的地方。非常感谢代码,它可以工作。是否有一种方法可以使输出看起来更像datatable输出,类似于SELECT*FROM PER_名称。Print cur提供了输出,它还可以,但它看起来像脚本输出。我不知道。非常感谢您的代码,它可以工作。是否有一种方法可以使输出看起来更像datatable输出,类似于SELECT*FROM PER_名称。Print cur提供了输出,它还可以,但它看起来像脚本输出。我不知道。