在本教程中,我了解到我们不能使用相同的变量名和列
所以我试过这个
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;
/
这里我在表格中有名称列,并且我声明了变量。
根据教程,它应该给出一些错误。但它工作正常
请你帮我澄清一下。
那么我们可以使用同名列的变量吗?
答案 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错误?我想不出任何情况,您会想要这样做并想要结果,因此肯定不会这样做吗?