У меня есть две таблицы, table_version_1
и table_version_2
, я пытаюсь создать новую таблицу на основе этих двух таблиц. Для которого я должен написать 4 хранимые процедуры, procedure1
, procedure2
, procedure3
, procedure4
Я запускаю procedure1
из моего приложения
select * from procedure1
I я звоню procedure2
в procedure1
PERFORM procedure2
, и я звоню procedure3
в procedure2
PERFORM procedure3
и звоню procedure4
в procedure3
PERFORM procedure3
Моя хранимая процедура выглядит примерно так:
CREATE OR REPLACE FUNCTION procedure1(tb_name, compare_tb_name, file_version, compare_file_version)
RETURNS text
LANGUAGE 'plpgsql'
COST 100
VOLATILE
AS $BODY$
DECLARE
createquery text;
fpo_data jsonb;
inddata jsonb;
f_primary_key text;
rowscount INTEGER;
datacount INTEGER;
fcdata1 text;
fid INTEGER;
BEGIN
createquery := 'CREATE TABLE IF NOT EXISTS ' || tb_name || '_' || file_version || '_' || compare_file_version || '_pk(
id serial PRIMARY KEY,
fc_pkey1 VARCHAR (250) NULL,
fc_pkey2 VARCHAR (250) NULL,
fc_pkey3 VARCHAR (250) NULL,
fpo_data TEXT NULL,
fid INTEGER NULL
)';
EXECUTE createquery;
EXECUTE 'SELECT count(*) FROM ' || tb_name || '_' || file_version || '_' || compare_file_version || '_pk' INTO rowscount;
EXECUTE 'SELECT count(*) FROM ' || tb_name INTO datacount;
IF(rowscount <> datacount) THEN
EXECUTE 'SELECT json_agg((fpdata, foseqid))::jsonb
FROM (SELECT fo_data AS fpdata, fo_seq_id as foseqid
FROM '||tb_name||'
LIMIT 1000
) t' INTO fpo_data;
FOR inddata IN SELECT * FROM jsonb_array_elements(fpo_data) LOOP
EXECUTE 'INSERT INTO ' || tb_name || '_' || file_version || '_' || compare_file_version || '_pk(fc_pkey1, fpo_data, fid) VALUES ($1, $2, $3)' USING f_primary_key, inddata, fid;
END LOOP;
ELSE
PERFORM procedure2(tb_name, compare_tb_name, file_version, compare_file_version);
END IF;
return 'Primary Key Generation completed';
END;
$BODY$;
Я не написал полный запрос. Я только что написал важные шаги моего запроса. Моя проблема заключается в том, что в приведенном выше запросе у меня есть запрос на создание, вставьте запрос и выберите запрос, а в конце хранимой процедуры я написал оператор return. Если я удаляю return
, все мои шаги create query, insert query and select query
терпят неудачу, и если я пишу return
, то это не будет procedure2
. Как правильно выполнить эту процедуру?