0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

PL/SQLでWhereが効かないんだけど!

Posted at

結論

PL/SQLの変数名はカラム名と一致させないようにしようね、という話。

Where句指定してるのに全件取れるんだけど!

hoge.sql
--宣言は省略
CREATE PACKAGE BODY hoge AS
    FUNCTION getUserName(id VARCHAR2) RETURN VARCHAR2
    IS
        username VARCHAR2;
    BEGIN
        SELECT NAME
        INTO username
        FROM USERS
        WHERE USERS.ID = id; --主キー

        RETURN username;
    END;
END hoge;
/

これをexecute name := hoge.getUserName('1234')すると、

ORA-01422: 完全フェッチがリクエストよりも多くの行を戻しました

となってしまった。
主キー指定しているんで、1レコードしか返って来ないはずなのに。
試しにレコード数を確認して見る。

hoge.sqlちょっと改造
--宣言は省略
CREATE PACKAGE BODY hoge AS
    FUNCTION getUserName(id VARCHAR2) RETURN VARCHAR2
    BEGIN
        SELECT NAME
        FROM USERS
        WHERE USERS.ID = id; --主キー

        DBMS_OUTPUT.PUT_LINE(SQL%COUNT);
        DBMS_OUTPUT.PUT_LINE(id);
    END;
END hoge;

してみると、

15,332
1234

ID指定してるのに全レコード抽出されとるやんけ! Where効いてないとか何事なんだ!
Where効かないことなんてある!?

よく見れ

hoge.sqlのSELECT文
        SELECT NAME
        FROM USERS
        WHERE USERS.ID = id; --主キー

カラム名と変数名が一緒。
ということは、SELECT文の中ではidはカラム名と解釈されて、

hoge.sqlのSELECT文のOracle側の理解
        SELECT NAME
        FROM USERS
        WHERE USERS.ID = USERS.ID; --主キー

と等価になる。
そりゃ全件取得されるわ。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?