2016-06-27 3 views
0

Я пытаюсь ввести данные INSERT через функцию postgres, и я не могу заставить ее работать. Я получаю сообщение об ошибке с указаниемФункция Postgres для вставки массивов

ERROR: function unnest(integer) does not exist SQL state: 42883 Hint: No function matches the given name and argument types. You might need to add explicit type casts.

Я использую Postgres 9.5, и моя функция выглядит следующим образом:

CREATE FUNCTION insert_multiple_arrays(
some_infoid INTEGER[], 
other_infoid INTEGER[], 
some_user_info VARCHAR, 
OUT new_user_id INTEGER 
) 
RETURNS INTERGER AS $$ 
BEGIN 
INSERT INTO user_table (user_info) VALUES ($3) RETURNING user_id INTO new_user_id; 
INSERT INTO some_info_mapper (user_id, some_info_id) SELECT new_user_id, unnest($1); 
INSERT INTO other_info_mapper (user_id, other_info_id) SELECT new_user_id,unnest($2); 
END; 
$$ LANGUAGE plpgsql; 

Я буду называть хранимую процедуру из моего внутреннего интерфейса через ЗЕЬЕСТ. Примером может служить так:

createUser(user, callback){ 
    let client = this.getDb(); 
    client.query("SELECT insert_multiple_arrays($1, $2, $3)", 
     [user.some_info_ids, user.other_info_ids, user.info], function(err, results){ 
     if(err){ 
      callback (err); 
     } 
     callback(null, results); 
    }); 
}; 

Выходной сигнал, что я ожидал бы быть следующим:

user_table 

    user_id   | user_info  | 
----------------------+-----------------+ 
    1     | someInfo  | 



some_info_mapper 

    user_id   | some_info_id | 
----------------------+-----------------+ 
    1     | 33    | 
    1     | 5    | 


other_info_mapper 

    user_id   | other_info_id | 
----------------------+-----------------+ 
    1     | 8    | 
    1     | 9    | 
    1     | 22    | 
    1     | 66    | 
    1     | 99    | 

Как обрабатывать эту ошибку? Нужно ли мне делать какую-то обработку для моих данных, чтобы поместить ее в формат, который принимает postgres?

+0

Какого типа является '' user.some_info_ids' и user.other_info_ids'? Являются ли они целыми числами? Вот что говорит ошибка. – cachique

+0

Да, поля являются целыми числами, как и параметры запроса sql. –

+0

1-Поля должны быть массивом целых чисел, а не целыми. и 2- Ваш драйвер должен поддерживать передающие массивы в подготовленных операциях. Какую версию languaje/driver вы используете в своем кодовом коде? – cachique

ответ

0

После изучения комментариев @cachiques, кажется, что данные не были отправлены правильно в конце концов. Как оказалось, данные, передаваемые на задний конец, были объектами массива, которые нужно было проанализировать дальше, чем я понял. После анализа sql работал отлично. Вот код, который я использовал для анализа со стороны сервера, который будет отправлен запрос SQL:

user.other_info_ids = req.body.other_info.map(function(obj) { return obj.info_id; }); 
1

Вы вызываете insert_multiple_arrays с тремя параметрами, но показываете определение с четырьмя. Возможно, у вас есть старая версия с тремя параметрами, которая все еще скрывается там, глючит и пытается найти ошибку в 4-параметрической версии, которая на самом деле не используется?

+0

А, я понимаю, что вы имеете в виду. Я просто забыл добавить параметр OUT в запрос ... Я обновлю его. В основном то, что я пытаюсь сделать, это создать нового пользователя, вернуть вновь созданный идентификатор пользователя и использовать его в качестве параметра для следующих двух операторов insert. –

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