PL / SQL:我们可以为变量和列使用相同的名称

问题描述 投票:1回答:3

在本教程中,我了解到我们不能拥有变量和列的相同名称

Here is the link

所以我试过这个

set SERVEROUTPUT ON;
declare 
n1 number;
name varchar(10);
begin
null;
DBMS_OUTPUT.PUT_LINE('sparsh' || TO_CHAR(45));
select name  into name from Employee;
DBMS_OUTPUT.PUT_LINE(name);
END;
/

这里我在表中有名称列,并且使用相同的名称声明变量。

根据教程,它应该给出一些错误。但它工作正常

你能帮我澄清一下吗?

那么我们可以使用同名列的变量吗?

oracle plsql
3个回答
3
投票

该教程稍有不妥。在SQL和PL / SQL中可以使用相同名称的变量,但这样做几乎肯定是个坏主意。

使用具有相同名称的变量将导致混淆范围问题。 PL / SQL块将正确地将PL / SQL name用于INTO子句,但它也会将其用于您可能不期望的其他位置。例如,如果您尝试在WHERE子句中使用它,则将使用SQL name

drop table employee;
create table employee(id number, name varchar2(100));
insert into employee values (1, 'Alice');


declare 
    name varchar(10) := 'Bob';
begin
    select name into name from Employee where name = name;
    dbms_output.put_line(name);
END;
/

OUTPUT:
Alice

这就是为什么将局部变量V_命名为“variable”并将P_命名为“parameter”的好方法。这不是因为一些愚蠢的匈牙利系统符号规则。 (所以不要也开始命名你的变量_IN__NUM_等!)这是因为在实践中你想在PL / SQL和SQL中使用相同的名字但是你不想让它们混淆。


0
投票
 declare 
    name varchar(10) := 'Bob';
begin
    select name into name from Employee where **id= id**;
    dbms_output.put_line(name);
END;
/

我使用Jon给出的相同示例。查看id = id的条件。如果你使用一个名称与列名相同的变量。它不会抛出任何错误,但它肯定会让你惊讶于一个庞大而意想不到的大数据集。在条件谓词中,列名称优先于变量名称。因此,在这种情况下,id = id都将被视为表列,并且条件将被评估为所有行的TRUE。

选择变量名称时没有这样的规则。但最好保持标准。


-1
投票

这应该是像Toad这样的SQL工具应该采用的吗?例如如果您尝试运行这样的查询,它将失败并显示一条消息,例如“声明的变量名称不应与查询中的列名称相同”?或者应该抛出SQL错误?我想不出你想要这样做的任何情况,并希望结果肯定不可能做到这一点?

© www.soinside.com 2019 - 2024. All rights reserved.