【问题标题】:Assign a value to a variable on RETURN PL/SQPL在 RETURN PL/SQL 上为变量赋值
【发布时间】:2019-04-25 07:19:21
【问题描述】:

有没有办法在 PL/SQL oracle 中实现这一点?

    RETURN (return_status:=1);

当我尝试执行此操作时会出现编译错误。如果这是不可能的,请提出一个更好的替代方案,而不是这样做

   return_status := 1;
   RETURN (return_status);

【问题讨论】:

  • 您在寻找RETURN 1;吗?
  • 不,我想在一行中为 return_status IN RETURN 分配一个值,而不是两次,即先将值分配给 return_status,然后再分配 RETURN(return_status)。
  • 分两行这样做有什么问题?
  • 混淆原因:在一些编程语言中(比如Java,你来自哪里),赋值也可以用作表达式,所以可以写成return a=1,或者a = b = c = 1。 PL/SQL 不是这样的语言。赋值只是语句,不能这样使用,你必须分两行来做。没有更好的选择。

标签: oracle plsql plsql-package


【解决方案1】:

当我们执行 RETURN 时,过程在该点终止,控制流传递给调用程序。所以这个结构没有任何价值......

 RETURN (return_status:=1);

... 因为程序单元中的任何内容都无法在返回后对return_status 执行任何操作。

这是一个函数,return_status 是一个 OUT 参数

这就是问题的根源:糟糕的设计。要么返回一个值,要么将其作为 OUT 参数,但不能两者兼而有之。 PL/SQL 中公认的做法是函数返回一个值并且没有 OUT 参数。只有过程(没有 RETURN)有 OUT 参数。

所以你的选择是:

  1. return 1 并且没有 OUT 参数
  2. 设置 OUT 参数 = 1 并返回其他内容
  3. 改为程序

【讨论】:

  • 或者4,如果你坚持保留返回值和out参数,就分两行做。
【解决方案2】:

我不明白问题是什么?

如果你想返回值 return_status 那么第二个选项就可以了(如果你真的在做一个硬编码的赋值,你可以只返回 1。

我想也许你实际上有一个外部变量 return_status 你试图通过调用这个函数来改变它的值。在这种情况下,使用过程并将 return_status 设置为 IN OUT 变量(甚至可能只是 OUT)。

【讨论】:

  • @M.HarisAzfar 如果您要返回该值,那么您之后也不能在其他任何地方使用该变量 - 返回一个值是函数的最后一步(除非发生异常) .在这种情况下,你不能吃蛋糕 - 你可以在某处设置变量,在函数中使用它然后返回它,或者你可以直接返回值,而不需要将它存储在变量中。
【解决方案3】:

AFAIK,您不能在 Oracle FUNCTIONS RETURN 语句中赋值。

从Oracle Docs,语法应该是

返回 [[(] 表达式 [)]];

表达式参考Expressions

根据您的要求(1 个条件而不是 2 个)我能想到的唯一解决方案是使用 case expression。像下面这样(如果你有任何条件)

RETURN
    CASE when return_status is not null  
         THEN 1

【讨论】:

    【解决方案4】:

    允许使用带有 OUT 参数的函数,但味道不对。

    【讨论】:

    • 有什么问题?
    • 没有技术问题。这更像是一个哲学/卫生的事情。从调用代码的角度来看,函数的“正常”行为是取一些 IN 参数并返回一个值。从调用中可以明显看出它返回值的事实。仅当您查看函数的实现/声明时,该函数也在修改参数的事实才显而易见。如果您需要从函数返回多个值,我宁愿返回非标量数据类型
    • 或具有多个输出参数的过程
    猜你喜欢
    • 2013-02-10
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多