0

動的クエリで FOR ループを使用する関数があります。理由はわかりませんが、postgres はレコード変数から単一のフィールドを取得できません...それでもエラーが発生します

SELECT (1,token).id - syntax error?

これからフィールド値を取得する機会はありますか?

CREATE OR REPLACE FUNCTION mobile666(v_limit integer, v_offset integer) RETURNS void AS
$BODY$
  DECLARE
    r record;
    x text[];
    kap text;
    i_attrs text[] := ARRAY[
    ['test','id','value'],
    ['test', 'id','value'],
    ['test', 'id','value'],
    ['test', 'id','value']
    ];
    quer text;

  BEGIN
    FOREACH x SLICE 1 IN ARRAY i_attrs LOOP
   FOR r in EXECUTE
    'SELECT * FROM ' || x[1]::regclass || ' WHERE ' || quote_ident(x[2]) || ' IS NOT NULL'  LOOP

  execute 'SELECT '|| r || '.' || quote_ident(x[2]) INTO kap;
     RAISE NOTICE 'id %', kap;
execute 'SELECT '|| r || '.' || quote_ident(x[5]) INTO kap;
     RAISE NOTICE 'id %', kap;

  END LOOP;
  END LOOP;

    END;
  $BODY$
LANGUAGE plpgsql VOLATILE
COST 400;



CREATE TABLE test
(
  id integer NOT NULL,
  value text NOT NULL,
  CONSTRAINT pk_test PRIMARY KEY (id )
)
WITH (
  OIDS=FALSE
);


INSERT INTO test(
            id, value)
    VALUES (1,'token'),(2,'smt'),(3,'cocc');
4

1 に答える 1

0

これを試してください:

CREATE OR REPLACE FUNCTION mobile666(v_limit integer, v_offset integer) RETURNS void AS
$BODY$
DECLARE
    r record;
    x text[];
    kap text;
    i_attrs text[] := ARRAY[
    ['test','id','value'],
    ['test', 'id','value'],
    ['test', 'id','value'],
    ['test', 'id','value']
    ];
    quer text;

BEGIN
    FOREACH x SLICE 1 IN ARRAY i_attrs LOOP
        FOR r in EXECUTE
            'SELECT * FROM ' || x[1]::regclass || ' WHERE ' || quote_ident(x[2]) || ' IS NOT NULL'  LOOP

            execute 'SELECT ($1::text::' || x[1] || ').' || x[2] INTO kap USING r;
            RAISE NOTICE 'id %', kap;
            execute 'SELECT ($1::text::' || x[1] || ').' || x[3] INTO kap USING r;
            RAISE NOTICE 'id %', kap;
        END LOOP;
    END LOOP;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 400;

手がかりは、動的 SQL 文字列内のレコードr( ) を適切なテーブル ( ) にキャストすることです。この後、次のようなレコード列にアクセスでき、テーブル名または列名を動的に変更できます。$1$1::text::table_name($1::text::table_name).col_name

于 2013-04-30T12:58:48.957 に答える