Как вызвать хранимую процедуру внутри другой хранимой процедуры в postgreSQL - PullRequest
0 голосов
/ 19 марта 2020

У меня есть две таблицы, 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. Как правильно выполнить эту процедуру?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...