【问题标题】:How to retrieve values post-execution of PL/SQL stored procedure?如何在 PL/SQL 存储过程执行后检索值?
【发布时间】:2015-07-16 14:36:09
【问题描述】:

我对 oracle 数据库的东西很陌生。有一个其他人编写的 PL/SQL 过程并存储在我正在访问的数据库中。我希望我的程序执行它并检索结果。执行是有效的。但是我无法检索结果。显然我做得不对,但我在文档中找不到正确的方法。

这里是存储过程的要点(去掉了多余的行)

procedure ISDRAWINGVALID(DWGNO_IN in VARCHAR2) is
valid BOOLEAN;
begin
-- do some stuff to see if the drawing is valid
IF <some stuff> THEN
valid := TRUE;
ELSE
valid := FALSE;
END IF;
END ISDRAWINGVALID;

我的程序向数据库发出以下命令以执行并检索返回。

BEGIN ISDRAWINGVALID( <drawingnumber> ); END;
SELECT ISDRAWINGVALID.valid FROM DUAL;

第一行工作正常,程序执行并具有预期的效果。 第二行返回错误,无效标识符“ISDRAWINGVALID.valid”

显然我没有使用正确的方法来检索值。有人可以告诉我吗?

谢谢

【问题讨论】:

  • 您发布的程序没有返回任何内容。一旦过程完成执行,局部变量就会超出范围。您无法在程序之外访问它。如果您希望该过程向调用者返回某些内容,则该过程需要执行诸如声明OUT 参数之类的操作。根据“做一些事情”是什么,您可能希望创建一个返回 boolean 而不是过程的函数。
  • 您不能从过程中返回结果。您可以设置一个 OUT 参数而不是局部变量,然后您的调用者可以查看它。或者您可以改用函数,但 Oracle SQL 没有布尔类型,因此您仍然只能从 PL/SQL 调用它。一个函数看起来仍然更合适,除非你没有显示的代码正在修改任何数据;但是您是否坚持已有的程序,这似乎有点毫无意义?

标签: oracle plsql return


【解决方案1】:

当你提出问题时,没有办法得到结果。

如果您可以将过程作为函数获取,则可以直接在 select 语句中调用它。

否则,您将不得不绕道而行,涉及结果表或带有结果函数和包变量的 pl/sql 包。

您的过程已被其他 pl/sql 代码调用 - 而不是在选择查询中。

编辑

我想我可能错了。 在 Java 中,您可以通过调用创建准备好的语句,并直接获取返回值作为结果集。 检查一下并返回结果:http://archive.oreilly.com/pub/a/onjava/2003/08/13/stored_procedures.html?page=2

抱歉,如果您没有使用 Java,我无法看到您在使用什么。

【讨论】:

  • 您不能调用从选择返回布尔值的函数,因为 Oracle SQL 没有布尔类型。所以它必须返回一个代理值;是/否、0/1 等
【解决方案2】:

使用函数并返回要在 SQL 中使用的 NUMBER:

CREATE OR REPLACE
FUNCTION ISDRAWINGVALID(DWGNO_IN in VARCHAR2) RETURN NUMBER
IS
   valid NUMBER;
BEGIN
   IF <some stuff> THEN
      valid := 1;
   ELSE
      valid := 0;
   END IF;
   RETURN valid;
END ISDRAWINGVALID;

从 PL/SQL 使用:

DECLARE
   valid NUMBER;
BEGIN
   valid := ISDRAWINGVALID( <drawingnumber> );
END;
/

从 SQL 中使用:

SELECT ISDRAWINGVALID( <drawingnumber> ) FROM DUAL;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 2021-05-27
    • 2018-07-01
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    相关资源
    最近更新 更多