如果WHERE如下所示,下面的PL/SQL代码的行为会有所不同:
WHERE USERNAME = 'aaaaaa'与此不同的是,如果是这样的话:
WHERE USERNAME = userName为什么如果userName := 'aaaaaa'的结果是不一样的?我做错了什么?谢谢!
declare
isFound NUMBER;
userName VARCHAR2(30);
begin
isFound := 0;
userName := 'aaaaaa';
SELECT COUNT(*)
INTO isFound
FROM MyTable
WHERE USERNAME = 'aaaaaa' -- userName
AND ROWNUM = 1;
IF isFound > 0 THEN
dbms_output.put_line('Found');
ELSE
dbms_output.put_line('Not found');
END IF;
end;发布于 2013-09-18 15:12:07
在这个版本中:
SELECT COUNT(*)
INTO isFound
FROM MyTable
WHERE USERNAME = userName
AND ROWNUM = 1;..。该表的USERNAME列正在与其自身进行比较,因此它将始终匹配。您不能将它与局部变量进行比较。如果要这样做,则需要为该列提供一个不同的名称:
declare
isFound NUMBER;
localUserName VARCHAR2(30);
begin
isFound := 0;
userName := 'aaaaaa';
SELECT COUNT(*)
INTO isFound
FROM MyTable
WHERE USERNAME = localUserName
AND ROWNUM = 1;
IF isFound > 0 THEN
dbms_output.put_line('Found');
ELSE
dbms_output.put_line('Not found');
END IF;
end;或者,正如David建议的那样,使用标签将局部变量与表列区分开来:
<<local>>
declare
isFound NUMBER;
userName MyTable.USERNAME%TYPE;
begin
isFound := 0;
userName := 'aaaaaa';
SELECT COUNT(*)
INTO isFound
FROM MyTable
WHERE USERNAME = local.userName
AND ROWNUM = 1;
...您也可以在命名块中使用这种方法;如果是在函数中,则可以将局部变量称为function_name.variable_name。由于这是一个匿名块,因此标签在本质上起到了与function_name相同的作用。
文档有关于名称解析的一节。
发布于 2013-09-18 15:30:41
你可以用标签。
<<the_code>>
declare
isFound NUMBER;
userName VARCHAR2(30);
begin
isFound := 0;
userName := 'aaaaaa';
SELECT COUNT(*)
INTO isFound
FROM MyTable
WHERE USERNAME = the_code.userName
AND ROWNUM = 1;
IF isFound > 0 THEN
dbms_output.put_line('Found');
ELSE
dbms_output.put_line('Not found');
END IF;
end;https://stackoverflow.com/questions/18875833
复制相似问题