【问题标题】:PL/SQL:set output value with reflectionPL/SQL:用反射设置输出值
【发布时间】:2017-11-02 10:30:04
【问题描述】:

我有以下存储过程:

Procedure MyProc
(
Output1 OUT VARCHAR2
Output2 OUT VARCHAR2
Output3 OUT VARCHAR2
)
IS
BEGIN
SELECT mt.value
from myTable mt
join all_arguments aa on aa.argument_name=mt.key;
END myProc;

如何将 mt.Value 放入相应的参数(即Output1output2output3?)

编辑:需要更多细节

所以,我有我的输出参数Output1Output2Output3, 我的表包含以下内容>

CREATE TABLE myTable ( key, value ) AS
SELECT 'Output1', 'Result1' FROM DUAL UNION ALL
SELECT 'Output2', 'Result2' FROM DUAL UNION ALL
SELECT 'Output3', 'Result3' FROM DUAL;

所以,最后,我想在Output1 中返回Result1,在Output2 中返回Result2,在Output3 中返回Result3

目的是有一个非常灵活的过程,因为返回值的数量很大,可以更改,我希望至少添加行。

现在,当我添加一个输出时,我需要在我的输出参数列表中添加一个输出(这个是无法避免的),但我还需要在我的列表中添加一个条件,比如说

IF mt.key='Output4' THEN mt.Value Into Output4

我想避免最后的声明。

【问题讨论】:

  • 你想通过这个实现什么?请提供minimal reproducible example,包括myTable 的DDL 语句和一些示例数据的DML 语句,以说明您的问题并说明您的预期输出。
  • 你想用这个实现什么?定义一个集合 (CREATE TYPE StringList IS TABLE OF VARCHAR2(30);) 然后 BULK COLLECT INTO 该集合并返回一个包含可变数量的项目而不是可变数量的 out 参数的集合是否合适?

标签: sql oracle stored-procedures reflection plsql


【解决方案1】:

可以使用into:

select mt.value into output1
from myTable mt join
     all_arguments aa
     on aa.argument_name = mt.key;

【讨论】:

  • 连接表中可能有多行(因为预计会有 3 个输出,并且每个输出将在单独的行中)并且SELECT ... INTO ... 只能处理单行。跨度>
  • @MT0 。 . . “如何将 mt.Value 放入相应的参数中”。这就是INTO 所做的。
  • 当查询返回多行时,您将得到ORA-01422: exact fetch returns more than requested number of rows。这就是 INTO 在您期望查询匹配 3 行(即每个输出一个)时所做的。
  • @MT0 。 . .如果查询返回多行或没有行,则该问题没有意义。
  • OP 似乎正试图通过反射做一些“聪明”的事情——这有点道理(它们有可变数量的行并希望将它们分配给 out 参数)但它也是可能不是他们应该瞄准的解决方案,因为他们似乎有一个 XY 问题,并且正在询问如何完成他们过于复杂的解决方案,而不是针对同一问题的更好解决方案。
猜你喜欢
  • 2010-09-23
  • 1970-01-01
  • 2018-07-08
  • 2014-07-28
  • 1970-01-01
  • 2019-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多