【问题标题】:How to obtain name of input variable of the procedure (PLSQL)如何获取过程输入变量的名称(PLSQL)
【发布时间】:2013-10-16 12:37:42
【问题描述】:

假设我有一个名为 myProc(variable varchar2); 的过程

那我叫它:

exec myProc(actionVariable);

有没有办法,如何在过程 myProc 中获取“actionVariable”作为字符串?所以当我以不同的方式使用程序时:

exec myProc(anotherVariable);

我将在过程 myProc 中获取“anotherVariable”作为字符串。

谢谢。我只发现我可以使用'select argument_name from user_arguments....'获取原始变量名

【问题讨论】:

  • 没有。为什么知道调用者用于其变量的本地私有名称会很有用?如果它甚至有一个名字——如果传递了一个文字,你会期待什么,exec myProc('Some string value')?如果你只有很少的调用者,我想你可以添加另一个参数并让他们将其设置为他们的局部变量名,但有什么意义呢?
  • 你是对的。我只需要“myProc”的简单可用性。需要通过添加一行来实现它的功能(没有声明变量等)。我需要这个名字,因为它有标准的名字结构,我可以从中快速获取重要信息。所以你说,唯一可能的方法是调用“myProc”,如“exec myProc(anotherVariable, 'anotherVariable');。我可以声明变量 nameVariable='anotherVariable';,但我需要编写更多行来代替一行实现这个功能....
  • 我不确定你说的两行是什么意思;你的意思是你的过程将是两行代码,或者调用需要两行,还是别的什么?您不必为调用声明变量,只需传递一个文字字符串即可。无论如何,是的,我认为做你想要做的唯一方法是将名称作为另一个变量传递。
  • 这是一个非常复杂的系统。我无法重新设计它(叹气..)。我只需要使用变量,因为它操作很多行。这个变量有标准名称,我可以使用。让我更清楚地解释它。这个变量有名字,比如说,'varIDShop',它是 varchar2 变量。它被多次使用。我需要在 myProc 中使用表 Shop 进行操作。这就是为什么我现在必须使用 myProc(varIDShop, 'Shop');。更简单的是 myProc(varIDShop)。这不是一次出现,也不是一个变量……我只是想让它更简单。

标签: sql oracle stored-procedures plsql sqlplus


【解决方案1】:

你无法确定你的调用者分配给它传递的变量的名称(据我所知;也许你可以用 PL/Scope 破解一些东西,但它会很可怕)。

我可以看到三个选项,具体取决于您需要多少变化。我假设您的评论中没有多少名称会影响该过程所针对的表。

您可以将变量名或您感兴趣的位作为单独的参数传递:

procedure myProc(variable varchar2, variable_name varchar2) ...
exec myProc(varIDShop, 'Shop');

您可以使用每个变体的包装程序稍微调整一下:

procedure myProc(variable varchar2, variable_name varchar2) ...
procedure myProcShop(variable varchar2) is
begin
  myProc(variable, 'Shop');
end;
/
exec myProcShop(varIDShop);

...所以你的调用只需要选择相关的包装函数来调用。

或者您可以声明多个变量,每个变量一个,并且只设置相关的一个:

procedure myProc(shop_variable varchar2, office_variable varchar2, ...) ...
exec myProc(shop_variable => varIDShop);

...然后测试程序中设置的内容。

最后两个都意味着您的调用仍然只有一个参数,但它们有点复杂,并且有可能使用错误的变量名或过程名(剪切和粘贴错误)。虽然第一个也是如此,我想。

但是,这些都没有直接在调用者中使用变量名。但另一方面,您可以调用其中任何一个,例如用于测试,根本不需要声明变量 - 只需传递一个字符串文字:

exec myProc('Tesco', 'Shop');
exec myProc(shop_variable => 'Sainsbury');
exec myProcShop('Asda');

【讨论】:

    猜你喜欢
    • 2018-10-09
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多