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

时间:2016-06-12 14:31:55

标签: oracle plsql

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

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;
/

这里我在表格中有名称列,并且我声明了变量。

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

请你帮我澄清一下。

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

3 个答案:

答案 0 :(得分: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_以及为“参数”命名P_的好方法。这不是因为一些愚蠢的匈牙利系统符号规则。 (所以不要也开始命名你的变量_IN__NUM_等等!)这是因为在实践中你想在PL / SQL和SQL中使用相同的名称但是你不想得到它们他们很困惑。

答案 1 :(得分: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。

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

答案 2 :(得分:-1)

这应该成为像Toad这样的SQL工具吗?例如如果您尝试运行这样的查询,它将失败,并显示一条消息,例如“声明的变量名不应与查询中的列名相同”?还是应该抛出SQL错误?我想不出任何情况,您会想要这样做并想要结果,因此肯定不会这样做吗?