問題は名前解決の1つです。
パラメータhostname
がある場合 およびhostname
参照しているテーブルの列では、スコープ解決ルールによってほとんどの人が混乱します。そのため、多くの人がパラメータとローカル変数に命名規則を使用して、それらをテーブル名と区別することを推奨しています。たとえば、私のコードではp_
を使用しています パラメータ名とl_
のプレフィックスを付ける ローカル変数のプレフィックスを付ける。
あなたのコードで、あなたが持っているとき
SELECT mySystems.SYSTEMID
INTO SysID
FROM mySystems
where mySystems.HOSTNAME = Hostname;
hostname
パラメータではなく、テーブルの列として解決されます。これにより、クエリはテーブル内のhostname
のすべての行を返します。 エラーの原因となるnullではありません。パラメータ名の前に関数名を明示的に付けて、hostname
を強制することができます。 パラメータに解決するには
SELECT mySystems.SYSTEMID
INTO SysID
FROM mySystems
where mySystems.HOSTNAME = GET_SYSTEMID.Hostname;
それはうまくいきます。ただし、関数名のプレフィックスを追加すると、一般的に煩わしくなります。パラメータ名とローカル変数名のプレフィックスの規則を採用すると、次のようになります
FUNCTION GET_SYSTEMID(p_hostname varchar2)
RETURN NUMBER
IS
l_sysID number;
BEGIN
SELECT mySystems.SYSTEMID
INTO l_sysID
FROM mySystems
where mySystems.HOSTNAME = p_hostname;
return l_sysID;
END GET_SYSTEMID;
これも機能し、(私の考えでは)明示的な関数名プレフィックスをあちこちに追加するよりも明確になる傾向があります。