0

次の PL/SQL コードは、WHERE が次のようになっている場合、動作が異なります。

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

2 に答える 2

4

このバージョンでは:

  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 Aldridge が提案するように、ラベルを使用してローカル変数をテーブル列から区別します。

<<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-18T15:12:07.643 に答える