私はPostgreSQLで動的SQLを使用しようとしています。私はフィールドをdb_row
レコードから別のEXECUTE
ステートメントで使用しようとしています。フィールドid
はレコード変数に設定されているが、私はまだエラーを取得:postgresql、レコードデータ型のカラムを特定できませんでした
ERROR: could not identify column "id" in record data type
LINE 1: SELECT $1.id FROM audit.portfolio WHERE alter_type = 'INSERT...
^
QUERY: SELECT $1.id FROM audit.portfolio WHERE alter_type = 'INSERT' AND id = $1.id
CONTEXT: PL/pgSQL function inline_code_block line 14 at EXECUTE
これは私のデータとテスト機能である:
CREATE TABLE IF NOT EXISTS public.portfolio
(
id INTEGER NOT NULL,
name CHARACTER VARYING,
CONSTRAINT portfolio_pkey PRIMARY KEY (id)
)
WITH (OIDS = FALSE);
CREATE TABLE IF NOT EXISTS audit.portfolio
(
alter_type TEXT,
id INTEGER NOT NULL,
name CHARACTER VARYING,
CONSTRAINT portfolio_pkey PRIMARY KEY (id)
)
WITH (OIDS = FALSE
);
INSERT INTO public.portfolio (id, name) VALUES (1, 'NAME 1'), (2, 'NAME 2');
-- temp function
DO $$
DECLARE
db_row RECORD;
pk_val BIGINT;
BEGIN
FOR db_row IN EXECUTE format(
'SELECT *, 100 AS created_by_id, %L::TIMESTAMP AS creation_time FROM public.%I ORDER BY %I',
'2014-01-01 00:00:00', 'portfolio', 'id', 'id')
LOOP
RAISE NOTICE 'db_row.id: %', db_row.id;
EXECUTE
format(
'SELECT $1.%I FROM audit.%I WHERE alter_type = %L AND %I = $1.%I',
'id', -- this will be dynamic and change when table change
'portfolio', -- this will be dynamic and change when table change
'INSERT',
'id', -- this will be dynamic and change when table change
'id' -- this will be dynamic and change when table change
)
INTO pk_val
USING db_row;
RAISE NOTICE 'pk_val: %', pk_val;
END LOOP;
END$$;
それはpostgresのEXECUTE ... USING db_row
のように思えるが似ているdb_row
の完全な構造を見ていません行はテーブルからです。
私の最終目標は、既存のテーブル名 これを行う取る関数を作成することです:
EXECUTE
format(
'SELECT $1.%I FROM audit.%I WHERE alter_type = %L AND %I = $1.%I',
'primary_key_col',
'table_name',
'INSERT',
'primary_key_col',
'primary_key_col'
)
INTO pk_val
USING db_row
このEXECUTE
文でdb_row.id
値を使用するpostgresのを伝えるためにどのように?
多分これは助けることができます。 http://stackoverflow.com/questions/14065271/how-to-use-execute-format-using-in-postgres-function – McNets
この例では、テーブル名、カラム、プライマリキー名を知っています。しかし、実際のコードでは私はしません。だから私は 'USING db_row.id、db_row.col2'などは使用できません。 – piotrekkr