sql >> データベース >  >> RDS >> Oracle

oracle pl/sql関数の名前解決エラー

    問題は名前解決の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;
    

    これも機能し、(私の考えでは)明示的な関数名プレフィックスをあちこちに追加するよりも明確になる傾向があります。




    1. MySQL INSERT else(存在する場合)UPDATE

    2. コマンドpythonsetup.pyeg_infoは、/ tmp / pip-install-fs0wmmw4 /mysqlclient/のエラーコード1で失敗しました

    3. MySQLとPostgresの両方で大文字と小文字を区別しないクエリをどのように記述しますか?

    4. MySQLクエリ/句の実行順序