Вызовите одну хранимую процедуру из другой хранимой процедуры, передав значения массива в postgresql - PullRequest
0 голосов
/ 20 февраля 2020

Я не могу передать значения массива в качестве входных данных для другой хранимой процедуры. Однако, когда я пытаюсь вставить (таблица kvstore заполнена без проблем) значения массива, таблица загружается. Пожалуйста, посоветуйте мне, как динамически передавать значения массива из одной хранимой процедуры в другую.

Уведомление о повышении печатает значения, как показано ниже. ПРИМЕЧАНИЕ: Значение 1: ПРИМЕЧАНИЕ: Значение 2:


CREATE OR REPLACE FUNCTION test_schema.test_insert_choice(
    p_member_crn  character varying,
    p_preferencearray text[][],
    p_created timestamp without time zone,
    p_modified timestamp without time zone,
    p_created_system smallint,
    p_created_by character varying,
    p_modified_by character varying,
    p_modified_system smallint
    )
  RETURNS text AS
$BODY$
DECLARE     


    lv_n_rtn                INTEGER ; 
    lv_t_err_msg            TEXT ;
    lv_t_err_dtl            TEXT ;


BEGIN   


    /*FOR i IN 1 .. array_upper(p_preferencearray, 1) LOOP
        INSERT INTO lcdm_main.kvstore (key, value)
        VALUES (p_preferencearray[i][1], p_preferencearray[i][2]);
    END LOOP;*/

    FOR i IN 1 .. array_upper(p_preferencearray, 1) LOOP
    raise notice 'Value 1: %', p_preferencearray[i][1];
    raise notice 'Value 2: %', p_preferencearray[i][2];
        perform  test_schema.test_insert_master(p_member_crn,
                                                         p_preferencearray[i][1],
                                                         p_preferencearray[i][2],
                                                         p_created,
                                                         p_modified,
                                                         p_created_system,
                                                         p_created_by,
                                                         p_modified_by,
                                                         p_modified_system);
    END LOOP;

    RETURN 0;

END;

$BODY$
  LANGUAGE plpgsql VOLATILE SECURITY DEFINER
  COST 100;```

1 Ответ

0 голосов
/ 20 февраля 2020

Нашел решение, и замена FOR на FOREACH помогла решить проблему

CREATE OR REPLACE FUNCTION test_schema.test_insert_choice(
    p_member_crn  character varying,
    p_preferencearray text[][],
    p_created timestamp without time zone,
    p_modified timestamp without time zone,
    p_created_system smallint,
    p_created_by character varying,
    p_modified_by character varying,
    p_modified_system smallint
    )
  RETURNS text AS
$BODY$
DECLARE     

    lv_n_rtn                INTEGER ; 
    lv_t_err_msg            TEXT ;
    lv_t_err_dtl            TEXT ;

       m   text[];
       arr text[] := p_preferencearray;

BEGIN   


   FOREACH m SLICE 1 IN ARRAY arr
   LOOP
       perform  test_schema.test_insert_master(p_member_crn,
                                                         m[1],  --Preference Id
                                                         m[2],  --Preference Value
                                                         p_created,
                                                         p_modified,
                                                         p_created_system,
                                                         p_created_by,
                                                         p_modified_by,
                                                         p_modified_system);
   END LOOP;

    RETURN 0;


END;

$BODY$
  LANGUAGE plpgsql VOLATILE SECURITY DEFINER
  COST 100;

Спасибо всем

...