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

エラー:デフォルト値を持つ入力パラメータは、Postgresでもデフォルトである必要があります

    あなたの例では多くが正しくありません。というか、あまり あなたの例にぴったりです。

    CREATE OR REPLACE FUNCTION f_test(
         name text = NULL
       , city text = NULL
       , phonenumber text = NULL
        ,address text = NULL
       , OUT sno bigint)
    RETURNS void AS
     $func$
    DECLARE 
        phonenumber AS VarChar(20);  -- would collide with parameter name
    BEGIN
    phonenumber := phonenumber;      -- nonsense
    
    SELECT INTO sno  max(ssno) + 1 FROM emp;  -- SELECT INTO for assignment
    
    IF sno IS NULL THEN
      sno := ident_current('emp') + 1;
    END IF;
    
    RAISE NOTICE '%, %, %, %', name, city, phonenumber, address;
    
    INSERT INTO emp(ename, ecity, ephonenumber, eaddress)
    VALUES (name, city, phonenumber, address);
    
    END
    $func$  LANGUAGE plpgsql;

    主なポイント

    • エラーメッセージはそれ自体を物語っています:

      これは、ほぼマニュアルの内容 です。 :

    • RETURNS voidを組み合わせても意味がありません OUTを使用 パラメータ。

    • パラメータ名と衝突する変数名を宣言しないでください。ここではまったく役に立たない。

    • plpgsql代入演算子は:=<です。 / code> =ではありません 。

    • 通常、 RAISEは使用しません レベルINFO NOTICEが必要です 代わりに。

    • SELECT plpgsqlではターゲットなしでは不可能です。SELECTINTOが必要です。 。

    • IF END IFで終了します ENDではありません 。

    さらに簡素化

    COALESCE IFを置き換える 声明。集計関数は、テーブルが空の場合でも行を返します。
    ただし、これも必要ありません。 RETURNINGを使用するだけです 新しいIDを直接返す句:

    CREATE OR REPLACE FUNCTION f_test(
         name text = NULL
       , city text = NULL
       , phonenumber text = NULL
       , address text = NULL
       , OUT sno bigint)
    AS
    $func$
    BEGIN
    RAISE NOTICE '%, %, %, %', name, city, phonenumber, address;
    
    INSERT INTO emp(ename, ecity, ephonenumber, eaddress)
    VALUES (name, city, phonenumber, address)
    RETURNING ssno
    INTO   sno;             -- Assuming you want to return autoincremented id 
    
    END
    $func$  LANGUAGE plpgsql;
    


    1. Node.jsWindowsを使用したOracleデータベースへの接続

    2. godaddyでMySQLとEntityFrameworkを使用したセキュリティ例外

    3. SELECT WHERE IN()を使用してどのように順序を維持しますか?

    4. `COUNT(*)`を累積的に合計することはできません