Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
游标类型为的包内ORACLE调用存储过程_Oracle_Plsql - Fatal编程技术网

游标类型为的包内ORACLE调用存储过程

游标类型为的包内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

我真的很难调用下面的存储过程。我使用的是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_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提供了输出,它还可以,但它看起来像脚本输出。我不知道。