мне нужно захватить все product_id, чтобы я мог использовать его в SQL в пункте - PullRequest
0 голосов
/ 22 сентября 2018
CREATE OR replace FUNCTION testfunction(timestamp) returns void 
AS 
  $body$ 
  DECLARE 
    product_ids text; 
  BEGIN 
    -- this is returning multiple rows, but it assigning only one to  prodcut_ids variable. 
    SELECT DISTINCT product_id AS product_id 
    INTO            product_ids 
    FROM            test_product 
    WHERE           created_on > $1::timestamp 
    ORDER BY        product_id ; 

    RAISE notice 'product IDs : %', product_ids; 
    EXECUTE 'copy (SELECT * FROM test_product WHERE product_id in (' 
    || product_ids 
    || ' ) ) TO ''C:\projects\test_product.csv'' CSV HEADER'; 
  END $body$ LANGUAGE plpgsql volatile;

-- it is only exporting one record even the above select returning 

несколько строк.

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

В каком-то другом сценарии его оператор выдает ошибку не существует: bigint = text, 42883

Для одного значения при приведении его к тексту оно работает нормально.ГДЕ product_id :: text in (inputProduct_ids);

СОЗДАТЬ ФУНКЦИЮ ourFunction (text) {inputProduct_ids text: = $ 1;

SELECT STRING_AGG (product_id :: TEXT, ',' ORDER BY product_id) INTO product_ids ОТ fdp_product ГДЕ product_id в ('|| inputProduct_ids || ');
/// //

}

выберите нашу функцию (' 573, 574, 575, 576, 579, 580, 581, 584 ');

0 голосов
/ 22 сентября 2018

Поместите условие непосредственно в EXECUTE.Для отображения используйте STRING_AGG, чтобы отобразить разделенные запятыми product_ids.

CREATE OR replace FUNCTION testfunction ( timestamp ) returns void 
AS 
  $body$ 
  DECLARE 
    v_created_on timestamp := $1;
  BEGIN 
    SELECT STRING_AGG( product_id,',' ORDER BY product_id) 
    INTO            product_ids 
      FROM            test_product 
       WHERE          created_on > v_created_on; 

    RAISE notice 'product IDs : %', product_ids; 
    EXECUTE 'copy ( SELECT * FROM test_product WHERE created_on >  $1 ) 
    TO ''C:\projects\test_product.csv'' CSV HEADER' USING v_created_on; 
  END; 
 $body$ LANGUAGE plpgsql volatile;
...