結論
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; --主キー
と等価になる。
そりゃ全件取得されるわ。