2016-06-20 2 views
0

Я пытаюсь написать функцию, которая имеет 2 аргумента: один массив целых чисел, и один массив JSONфункция Psql с массивом JSON

пример моего JSON {[{день: 1}, {день : 2}]}

моя функция:

create or replace function ctrl_func(theids integer[],thejsons text[]) 
RETURNS integer AS \$$ 
DECLARE 
    i integer; 
    tj text[]; 
    BEGIN 
    FOR i IN 1 .. array_upper(theids, 1) 
    LOOP 
    raise notice 'ids %',theids[i]; 
    raise notice 'the jsons %',thejsons[i]; 
    // do other stuff but thejsons fail 
    END LOOP; 
    END; 
    \$$ LANGUAGE plpgsql; 

Теперь, я не понимаю, как передать параметр thejsons, я с треском провалился во всех моих испытаниях

Вот что я сделал

 select ctrl_func('{66,67}','{{{{day:1},{day:2}}},{{{day:122},{day:222}}}}'); 

и уведомление.

NOTICE: ids 66 
NOTICE: the jsons <NULL> 

Я знаю, что я делаю что-то неправильно, это его в прохождении параметра или выбирающего thejsons [I] значения? Я пытаюсь несколько часов изменить, как я передаю слова, гуглинг, как сумасшедший, и я не могу найти ничего, что дало бы мне представление о том, что делать.

Я был бы очень благодарен за любые намеки, указания или объяснения происходящего. Заранее спасибо

Я добавляю все свои заключительные тесты, я упростил, чтобы получить точную проблему. Я, очевидно, пропустил что-то большое - если кто-нибудь может это сделать, я был бы благодарен. Проводил часть ночи и все утро в документах, но результата не было. Вот то, что я до сих пор:

create table tata (json28 jsonb); 
insert into tata values('[{"a":2},{"b":3}]'); 
select * from tata; 
    json28   
---------------------- 
[{"a": 2}, {"b": 3}] 

моя новая функция:

create or replace function trl_toto(thejsons text[]) RETURNS integer AS $$ 
    DECLARE 
    js1 text; 
    js text; 
    BEGIN 
    raise notice 'the jsons %',thejsons; 
    raise notice 'the jsons0 %',to_json(thejsons[1]::text); 
    select regexp_replace(regexp_replace(thejsons[1]::text,'^{{','['),'}}$',']') into js1; 
    raise notice 'js1 %',js1; 
    select regexp_replace(regexp_replace(regexp_replace(js1,'^\"',''),'\"$',''),'\\','','g') into js; 
    raise notice 'js %',js; 
    update tata set json28=to_json(js)::jsonb; 
     return 1; 
    END; 
    $$ LANGUAGE plpgsql; 

Теперь я использую функцию

select trl_toto('{"{{{\"day\":1},{\"day\":2}}}","{{{\"day\":122},{\"day\":222}}}"}'); 
    NOTICE: the jsons {"{{{\"day\":1},{\"day\":2}}}","{{{\"day\":122}, {\"day\":222}}}"} 
    NOTICE: the jsons0 "{{{\"day\":1},{\"day\":2}}}" 
    NOTICE: js1 [{"day":1},{"day":2}] 
    NOTICE: js [{"day":1},{"day":2}] 

проверить данные в таблице

select * from tata; 
     json28    
    ----------------------------- 
    "[{\"day\":1},{\"day\":2}]" 

Как я могу избавиться от первого и последнего " и "? Что не так, когда я пытаюсь ввести js, так как он имеет правильный формат?

+0

' '{{{{день: 1}, {день : 2}}}, {{{day: 122}, {day: 222}}}} 'выглядит как литерал' text', а не 'text []' literal, для меня. Вы пробовали что-то вроде «{» {{{день: 1}, {день: 2}}} "," {{{день: 122}, {день: 222}}} "} ''? – jmelesky

+0

да - теперь я могу видеть слова [i]. Теперь мне нужно выяснить, как преобразовать это в Json, чтобы я мог использовать его в остальной части запроса. будет продолжено в этом направлении для решения проблемы. спасибо за указатель – Pat070

+0

Я все еще не могу много сделать в остальной части моей функции. Я хотел бы использовать моего сына. i sql Я могу сделать: обновить tata set jsoncol = '[{day: 1}, {day: 2}]', и это работает; но в функции я получаю «{{{день: 1}, {день: 2}}}« Как преобразовать »{{в [? (следует ли добавить мои тесты в свой первый вопрос?) – Pat070

ответ

0

Массив json - это единственное значение json или jsonb. Там нет оснований использовать text[] для этого, просто использовать jsonb:

create or replace function example_function(jsondata jsonb) 
returns void language plpgsql as $$ 
begin 
    raise notice 'json array: %', jsondata; 
    raise notice 'json array first element: %', jsondata->0; 
end $$; 

select example_function('[{"a":1}, {"b":2}]'); 

CREATE FUNCTION 
NOTICE: json array: [{"a": 1}, {"b": 2}] 
NOTICE: json array first element: {"a": 1} 

Вы можете использовать его в петлю с jsonb_array_length():

create or replace function example_function_with_loop(jsondata jsonb) 
returns void language plpgsql as $$ 
declare 
    i int; 
begin 
    raise notice 'json array: %', jsondata; 
    for i in 0 .. jsonb_array_length(jsondata)- 1 loop 
     raise notice 'element #%: %', i, jsondata->i; 
    end loop; 
end $$; 

select example_function_with_loop('[{"a":1}, {"b":2}]'); 

CREATE FUNCTION 
NOTICE: json array: [{"a": 1}, {"b": 2}] 
NOTICE: element #0: {"a": 1} 
NOTICE: element #1: {"b": 2} 
+0

Спасибо, я буду загляните в нее.Моя функция теперь работает после большого количества регулярных выражений. Данные передаются из узла, я изучу ваше решение, чтобы увидеть, как я могу упростить все. – Pat070

Смежные вопросы