【问题标题】:New to Oracle (sql server background). Simple "select" stored proc doesn't executeOracle 新手(sql server 背景)。简单的“选择”存储过程不执行
【发布时间】:2014-02-14 02:29:50
【问题描述】:

我是 Oracle 的新手,正在尝试将一个简单的选择返回到我的调用应用程序中。

create or replace PROCEDURE testSelect 
( 
  column1 OUT table.column1%TYPE,
  column2 OUT table.column2%TYPE
)

IS

BEGIN

    SELECT column1, column2
    INTO column1, column2
    FROM table 

EXCEPTION
    WHEN OTHERS THEN RAISE;

END testSelect;

这可以编译,但是当我尝试执行过程“EXEC testSelect ();”时,我收到以下消息:“调用中的参数数量或类型错误”。

感谢您的帮助和时间。

【问题讨论】:

  • 我不会说这是一个重复,即使问题的措辞几乎相同。该线程中的答案涉及使用 sys_refcursor,我已经尝试过代替上述方法,但仍然无法正常工作。上面的示例看起来几乎与 Oracle 文档相同,但仍然无法执行。
  • 您使用的是哪个版本的 Oracle?
  • 您的exec 调用没有参数,但您的过程有两个。您需要定义一个要在调用中使用的变量。你从哪里运行这个?无论如何,这将只允许每个 OUT 参数中有一个值,听起来您正在尝试取回多行 - 所以您应该再次查看 sys_refcursor 或流水线函数。

标签: sql oracle stored-procedures


【解决方案1】:

更改为函数...这是一个如何在 SQL Developer 中执行的示例:

create or replace FUNCTION testSelect

RETURN SYS_REFCURSOR AS ret_cursor SYS_REFCURSOR;

BEGIN
    OPEN ret_cursor FOR
      SELECT column1, column2
      FROM table
    RETURN ret_cursor;
EXCEPTION
    WHEN OTHERS THEN RAISE;

END testSelect

为了在 SQL Developer 中执行查询,我使用了:

variable v_ref_cursor refcursor;
exec :v_ref_cursor := testSelect(); 
print :v_ref_cursor;

编辑

添加示例 proc 代码以及要在 SQL Developer 中执行的代码:

create or replace PROCEDURE sp_test (RESULTS OUT SYS_REFCURSOR)

AS

BEGIN
    OPEN RESULTS FOR
      SELECT columnA, columnB, columnC, columnD
      FROM test;
   EXCEPTION
    WHEN OTHERS THEN RAISE;

END sp_test;

执行:

var rc refcursor
exec sp_test(:rc)
print rc

【讨论】:

  • 您也可以使用流水线函数。
  • 我对 Oracle 还是很陌生(SQL Server 背景)。谢谢你的提示。我去读书。
猜你喜欢
  • 2011-11-07
  • 2019-02-05
  • 2011-05-14
  • 2015-08-28
  • 2019-04-03
  • 2010-12-11
  • 1970-01-01
  • 1970-01-01
  • 2021-09-25
相关资源
最近更新 更多