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

PostgreSQLエラー:EXECUTEのクエリ文字列引数がnullです

    エラーメッセージは

    です。

    2つのEXECUTEがあります コマンド:

    _query := 'CREATE TABLE public.'
            || quote_ident(_table_name) || ' ( ) INHERITS (public.evidence)';
    EXECUTE _query;
    
    ...
    
    EXECUTE 'INSERT INTO public.'
          || quote_ident(_table_name) || ' VALUES ($1.*)' USING NEW;
    

    NULLにできる唯一の部分 table_nameです 。
    table_nameの唯一のチャンス NULLになる ここにあります:

    SELECT raised_local_time FROM notifications WHERE id=_notification_id
    INTO _raised_local_time;
    

    したがって、原因は2つの理由のいずれかである必要があります :

    1. NEW.notification_id NULLです 。

    2. notificationsに行がありません 指定されたNEW.notification_idに対して 。

    このデバッグ用に変更されたトリガー関数を試してください :
    CREATE OR REPLACE FUNCTION partition_evidence_by_month()
      RETURNS trigger AS
    $func$
    DECLARE 
       _table_name text;
    BEGIN
       SELECT 'evidence-' || to_char(raised_local_time, 'YYYY-MM')
       FROM   public.notifications -- schema-qualify to be sure
       WHERE  id = NEW.notification_id
       INTO   _table_name;
    
       IF _table_name IS NULL THEN
          RAISE EXCEPTION '_table_name is NULL. Should not occur!';
       END IF;
    
       IF NOT EXISTS (   -- create table if it does not exist
          SELECT 1
          FROM   pg_catalog.pg_class c
          JOIN   pg_catalog.pg_namespace n ON n.oid = c.relnamespace
          WHERE  c.relkind = 'r'
          AND    c.relname = _table_name
          AND    n.nspname = 'public') THEN
    
          EXECUTE 'CREATE TABLE public.'
                || quote_ident(_table_name) || ' ( ) INHERITS (public.evidence)';
       END IF;
    
       EXECUTE 'INSERT INTO public.'
             || quote_ident(_table_name) || ' VALUES $1'  -- Use NEW row directly
       USING  NEW;       -- write data to the partition table
    
       RETURN NULL;
    END
    $func$ LANGUAGE plpgsql;
    
    • 未使用の変数を削除し、コードを簡素化します。 (これは明らかに単純化された例です。)

      • 特に、date_trunc()は必要ありません。 まったく。元のタイムスタンプをto_char()にフィードするだけです 。

      • varchar(n)を使用しても意味がありません 。 textを使用するだけです またはvarchar

      • 不要な割り当てが多すぎるのは避けてください。PL/pgSQLでは比較的コストがかかります。

    • RAISEを追加します
      エラーメッセージが表示された場合は、考えられる2つの原因を区別することが次のステップになります。些細なことです...




    1. コマンドラインからMySQLダンプをダウンロードする

    2. 複雑なクエリで2つのテーブルを結合する(均一なデータではない)

    3. MySQLWorkbenchの上位の代替案

    4. codeigniterのアクティブレコード構文を使用してmysqlデータベースのフィールドをインクリメントします