如何在Oracle中使用in和out参数执行存储过程?

如何在Oracle中使用in和out参数执行存储过程?,oracle,stored-procedures,Oracle,Stored Procedures,以下是我的存储过程: CREATE OR REPLACE PROCEDURE STATS_SD ( P_ID IN NUMBER, PRC OUT SYS_REFCURSOR ) IS BEGIN OPEN PRC FOR SELECT ID, SESID FROM RESPONSES WHERE ID IN (P_ID) END; declare l_cur sys_refcursor; l_row emp%rowtype; begin

以下是我的存储过程:

CREATE OR REPLACE PROCEDURE STATS_SD 
(
  P_ID IN NUMBER,
  PRC OUT SYS_REFCURSOR
)
IS
BEGIN
  OPEN PRC FOR
  SELECT
    ID,
    SESID
  FROM RESPONSES
  WHERE ID IN (P_ID)
END; 
declare
  l_cur sys_refcursor;
  l_row emp%rowtype;
begin
  get_data(l_cur);
  LOOP
    fetch l_cur
    into l_row;
    exit when l_cur%notfound;
    -- do something with l_row here

  END LOOP;
  close l_cur;
end;
当我尝试使用

EXEC EXAM_STATS_STUDENTS_SD('6901');
我得到以下错误:

PLS-00306:调用“STATS\u SD”时参数的数量或类型错误


您知道为什么吗?

您向过程传递了错误的数据类型

根据您的声明,预计将有一个
编号

 P_ID IN NUMBER
但是,在exec命令中传递VARCHAR2:

EXEC EXAM_STATS_STUDENTS_SD('6901');
请注意值周围的
'
。 请尝试调用此选项:

EXEC EXAM_STATS_STUDENTS_SD(6901);

除此之外,您完全缺少第二个参数。

您向过程传递了错误的数据类型

根据您的声明,预计将有一个
编号

 P_ID IN NUMBER
但是,在exec命令中传递VARCHAR2:

EXEC EXAM_STATS_STUDENTS_SD('6901');
请注意值周围的
'
。 请尝试调用此选项:

EXEC EXAM_STATS_STUDENTS_SD(6901);

除此之外,您还完全缺少第二个参数。

下面是一个使用OUT参数的示例,该参数是sys\u refcursor。请注意,我关闭了使用它的pl/sql块中的光标(这很重要!):

并使用get_数据过程:

CREATE OR REPLACE PROCEDURE STATS_SD 
(
  P_ID IN NUMBER,
  PRC OUT SYS_REFCURSOR
)
IS
BEGIN
  OPEN PRC FOR
  SELECT
    ID,
    SESID
  FROM RESPONSES
  WHERE ID IN (P_ID)
END; 
declare
  l_cur sys_refcursor;
  l_row emp%rowtype;
begin
  get_data(l_cur);
  LOOP
    fetch l_cur
    into l_row;
    exit when l_cur%notfound;
    -- do something with l_row here

  END LOOP;
  close l_cur;
end;

下面是一个使用OUT参数的示例,该参数是sys\u refcursor。请注意,我关闭了使用它的pl/sql块中的光标(这很重要!):

并使用get_数据过程:

CREATE OR REPLACE PROCEDURE STATS_SD 
(
  P_ID IN NUMBER,
  PRC OUT SYS_REFCURSOR
)
IS
BEGIN
  OPEN PRC FOR
  SELECT
    ID,
    SESID
  FROM RESPONSES
  WHERE ID IN (P_ID)
END; 
declare
  l_cur sys_refcursor;
  l_row emp%rowtype;
begin
  get_data(l_cur);
  LOOP
    fetch l_cur
    into l_row;
    exit when l_cur%notfound;
    -- do something with l_row here

  END LOOP;
  close l_cur;
end;

你做过一些调查吗?在SO中有一些类似的问题,比如:您的过程是
STATS\u SD
,它接受两个参数。。。那么,您使用
考试统计数据学生统计数据('6901')
执行的到底是什么呢?对于一个函数来说,使用一个out参数的过程可能是一个很好的选择。您的输入参数是NUMBER,您在exec命令my bad中传递一个VARCHAR2。我最初使用的数字没有引号,只是尝试使用引号。如果没有引号,它也不起作用:(你做过一些研究吗?在SO中有一些类似的问题,比如:你的过程是
STATS\u SD
,它接受两个参数……那么你用
EXAM\u STATS\u STUDENTS\u SD('6901')到底在执行什么
?对于函数来说,使用带有一个out参数的过程可能是一个很好的选择。您的输入参数是NUMBER,您可以在exec命令my bad中传递一个VARCHAR2。我最初使用的数字没有引号,只是尝试使用引号。没有引号也无法工作:(第二个参数是OUT参数。如果要从SP获取,我如何提供它?:)第二个参数是OUT参数。如果要从SP获取,我如何提供它?:)