【问题标题】:How can a stored procedure be executed in Oracle with in and out parameters?如何在 Oracle 中使用 in 和 out 参数执行存储过程?
【发布时间】:2016-09-01 14:15:32
【问题描述】:

这是我的存储过程:

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; 

当我尝试使用

执行它时
EXEC EXAM_STATS_STUDENTS_SD('6901');

我收到以下错误:

PLS-00306:调用“STATS_SD”时参数的数量或类型错误

你有什么想法吗?

【问题讨论】:

  • 你做过研究吗? SO中有一些类似的问题,比如:stackoverflow.com/questions/10024771/…
  • 你的程序是STATS_SD,它接受2个参数...那么你到底在用EXAM_STATS_STUDENTS_SD('6901')执行什么?
  • 拥有一个带有一个输出参数的过程可能是一个很好的函数候选者。
  • 你的输入参数是NUMBER,你在exec命令中传递了一个VARCHAR2
  • 我的错。我最初使用不带引号的数字,只是尝试使用带引号的数字。没有引号也行不通:(

标签: oracle stored-procedures


【解决方案1】:

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

create or replace procedure get_data(o_cur OUT SYS_REFCURSOR) as
begin
  OPEN o_cur FOR
  select * from emp;
end;

并使用 get_data 过程:

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;

【讨论】:

    【解决方案2】:

    您将错误的数据类型传递给您的过程。

    根据您的声明,NUMBER 应该是:

     P_ID IN NUMBER
    

    但是,您在 exec 命令中传递了一个 VARCHAR2:

    EXEC EXAM_STATS_STUDENTS_SD('6901');
    

    注意值周围的''。 尝试调用它:

    EXEC EXAM_STATS_STUDENTS_SD(6901);
    

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

    【讨论】:

    • 第二个参数是OUT参数。如果我想从 SP 获得它,我该如何提供它? :)
    猜你喜欢
    • 2012-04-18
    • 2019-04-26
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    • 2021-05-18
    • 2020-09-22
    相关资源
    最近更新 更多