首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >检查是否存在行

检查是否存在行
EN

Stack Overflow用户
提问于 2013-09-18 15:03:16
回答 2查看 1.4K关注 0票数 0

如果WHERE如下所示,下面的PL/SQL代码的行为会有所不同:

代码语言:javascript
运行
复制
WHERE USERNAME = 'aaaaaa'

与此不同的是,如果是这样的话:

代码语言:javascript
运行
复制
WHERE USERNAME = userName

为什么如果userName := 'aaaaaa'的结果是不一样的?我做错了什么?谢谢!

代码语言:javascript
运行
复制
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;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-18 15:12:07

在这个版本中:

代码语言:javascript
运行
复制
  SELECT COUNT(*)
    INTO isFound
    FROM MyTable
   WHERE USERNAME = userName
     AND ROWNUM = 1;

..。该表的USERNAME列正在与其自身进行比较,因此它将始终匹配。您不能将它与局部变量进行比较。如果要这样做,则需要为该列提供一个不同的名称:

代码语言:javascript
运行
复制
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建议的那样,使用标签将局部变量与表列区分开来:

代码语言:javascript
运行
复制
<<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相同的作用。

文档有关于名称解析的一节

票数 4
EN

Stack Overflow用户

发布于 2013-09-18 15:30:41

你可以用标签。

代码语言:javascript
运行
复制
<<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;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18875833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档