pl/sql 存储过程:参数名与列名相同

Posted

技术标签:

【中文标题】pl/sql 存储过程:参数名与列名相同【英文标题】:pl/sql stored procedure: parameter name same as column name 【发布时间】:2010-12-09 03:17:32 【问题描述】:

我有一个这样的存储过程

procedure P_IssueUpdate
(
    Id in integer,
    ModifiedDate in date,
    Solution in varchar2
) AS
BEGIN
update T_Issue
Set
  ModifiedDate = ModifiedDate,
  Solution = Solution
where id = id;
END P_IssueUpdate;

我的问题是参数名称与表格列名称相同。 有没有办法指示sql“=”后面的值应该是参数而不是列?

感谢您的帮助

【问题讨论】:

【参考方案1】:

您可以像这样在过程名称前加上参数和变量名称:

SQL> declare
  2     procedure p (empno number) is
  3        ename varchar2(10);
  4     begin
  5        select ename
  6        into p.ename
  7        from emp
  8        where empno = p.empno;
  9        dbms_output.put_line(p.ename);
 10     end;
 11  begin
 12     p (7839);
 13  end;
 14  /
KING

PL/SQL procedure successfully completed.

【讨论】:

详细解释可以看这里:link【参考方案2】:

我找到了解决方案。它通过完全限定参数来工作:

procedure P_IssueUpdate
(
    Id in integer,
    ModifiedDate in date,
    Solution in varchar2
) AS
BEGIN
update T_Issue
Set
  ModifiedDate = P_IssueUpdate.ModifiedDate,
  Solution = P_IssueUpdate.Solution
where id = P_IssueUpdate.id;
END P_IssueUpdate;

【讨论】:

【参考方案3】:

您所描述的内容称为variable shadowing。它可以以任何语言发生。您得到了很好的解决方法,但常见的解决方案是设计一个命名方案,使其永远不会发生。

例如,为列命名时不带前缀,变量的前缀取决于其作用域(P_ 用于参数,L_ 用于局部变量,G_ 用于全局包变量等...) .通过为您提供更多信息,这将具有使代码更具可读性的额外好处。

【讨论】:

【参考方案4】:

RE Vincent 关于添加前缀的回答——该解决方案一直有效,直到有人修改表并添加了一个名称恰好与参数名称冲突的列。不是每个人都通过每一行代码来确保他们的表修改不会与变量或参数名称冲突。 Oracle 的建议是限定 SQL 查询中的每个参数或变量名称。

如果您正在使用匿名块(在过程之外),则可以这样命名块并限定变量:

<<MY_BLOCK>>
declare
   X   sys.USER_TABLES%rowtype;
   Y   sys.USER_TABLES.TABLE_NAME%type := 'some_table_name';
begin
   select UT.*
   into   MY_BLOCK.X
   from   sys.USER_TABLES UT
   where  UT.TABLE_NAME = MY_BLOCK.Y;
end MY_BLOCK;

【讨论】:

以上是关于pl/sql 存储过程:参数名与列名相同的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL:将词法参数传递给存储过程

Oracle PL SQL:比较两个存储过程返回的引用游标结果

PL/SQL 05 存储过程 procedure

PL/SQL程序设计—— 存储函数&存储过程

PL/SQL轻量版——存储函数/存储过程

从 shell 脚本调用 PL/SQL 存储过程并捕获 out 参数