【问题标题】:PL/SQL mysterious arrow operatorPL/SQL 神秘箭头运算符
【发布时间】:2013-12-06 10:52:22
【问题描述】:

什么是我们在UTL_TCP使用示例中经常看到的操作符“=>”?

http://www.oracle-base.com/articles/misc/ftp-from-plsql.php

  l_conn := ftp.login('ftp.company.com', '21', 'ftpuser', 'ftppassword');
  ftp.ascii(p_conn => l_conn);
  ftp.get(p_conn      => l_conn,
          p_from_file => '/u01/app/oracle/test.txt',
          p_to_dir    => 'MY_DOCS',
          p_to_file   => 'test_get.txt');
  ftp.logout(l_conn);

我不明白“p_conn => l_conn”的目的是什么,因为我们从不在任何地方使用 p_conn。 即使关闭连接也是使用 ftp.logout(l_conn) 完成的,而不是使用 p_conn。 在此运算符“=>”之前使用的所有变量甚至都没有在任何地方定义。

也许它是特定于 UTL_TCP 包的运算符,因为我从未见过它在其他任何地方使用过,也无法在任何 PL/SQL 文档、Oracle 或其他文档中找到它。

【问题讨论】:

  • 使用命名符号被认为是最佳实践,因为这意味着您的代码不再依赖于参数的顺序 - 它使您的代码更清晰并有助于避免常见错误(例如缺少参数,或错误地以错误的顺序获取参数)。
  • 但是——命名参数通过增加它的大小使代码更加笨拙,无论是垂直的还是水平的!

标签: sql oracle operators


【解决方案1】:

这是一种将参数传递给名为命名表示法的 PL/SQL 子例程的方法。
有关更多信息,请参阅 Oracle 官方文档:
http://docs.oracle.com/cd/B12037_01/appdev.101/b10807/08_subs.htm#sthref1013

它主要用于当您不知道一个过程需要多少参数或它们的预期顺序时。因此,您只需将要传递的每个参数命名为相应的值。

文档摘录:

位置符号。您可以按照在过程中声明的顺序指定相同的参数。

这种表示法很紧凑,但是如果您以错误的顺序指定参数(尤其是文字),则可能很难检测到该错误。如果过程的参数列表发生变化,您必须更改代码。

命名符号。您指定每个参数的名称及其值。箭头 (=>) 用作关联运算符。参数的顺序不重要。

这种表示法更冗长,但使您的代码更易于阅读和维护。如果过程的参数列表发生更改,例如,如果重新排序参数或添加新的可选参数,您有时可以避免更改代码。命名表示法是一种很好的做法,适用于调用其他人的 API 或定义供其他人使用的 API 的任何代码。

混合记法。您使用位置表示法指定第一个参数,然后为最后一个参数切换到命名表示法。

您可以使用这种表示法来调用具有一些必需参数、后跟一些可选参数的过程。

【讨论】:

    【解决方案2】:

    摘自documentation

    子程序参数的位置与命名符号

    调用子程序时,您可以使用位置符号或命名符号来编写实际参数。也就是说,您可以通过位置或名称指示实际参数和形式参数之间的关联。所以,给定声明

    DECLARE
       acct INTEGER;
       amt  REAL;
       PROCEDURE credit_acct (acct_no INTEGER, amount REAL) IS ...
    

    您可以通过四种逻辑上等效的方式调用过程 credit_acct:

    BEGIN
       credit_acct(acct, amt);                  -- positional notation
       credit_acct(amount => amt, acct_no => acct);  -- named notation
       credit_acct(acct_no => acct, amount => amt);  -- named notation
       credit_acct(acct, amount => amt);             -- mixed notation
    

    【讨论】:

      猜你喜欢
      • 2014-01-30
      • 1970-01-01
      • 1970-01-01
      • 2012-04-19
      • 2019-07-26
      • 1970-01-01
      • 1970-01-01
      • 2013-07-16
      • 2020-01-23
      相关资源
      最近更新 更多