2016-06-27 15 views
0

Ich versuche, Daten über eine Postgres-Funktion einzufügen, und ich kann es nicht ganz funktionieren. Ich erhalte eine Fehlermeldung,Postgres-Funktion zum Einfügen von Arrays

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.

ich Postgres bin mit 9,5, und meine Funktion ist wie folgt:

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; 

Ich werde die gespeicherte Prozedur aus meinem Backend über eine SELECT-Anweisung anrufen. Ein Beispiel dafür ist etwa so:

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); 
    }); 
}; 

Die Ausgabe, die ich würde erwarte wie folgt:

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    | 

Wie gehe ich diesen Fehler? Muss ich meine Daten irgendwie verarbeiten, um sie in ein Format zu bringen, das Postgres akzeptiert?

+0

Welche sind 'user.some_info_ids' und' user.other_info_ids'? Sind sie ganze Zahlen? Das ist es, was der Fehler sagt. – cachique

+0

Ja, die Felder sind Ganzzahlen, ebenso wie die SQL-Abfrageparameter. –

+0

1 - Die Felder müssen ein Array von ganzen Zahlen sein, nicht nur ganze Zahlen. und 2- Ihr Treiber muss die Übergabe von Arrays in vorbereiteten Anweisungen unterstützen. Welche Sprache/Treiber-Version verwenden Sie in Ihrem Telefoncode? – cachique

Antwort

0

Nach der Untersuchung von @cachiques-Kommentaren scheint es, dass die Daten nicht korrekt gesendet wurden. Wie sich herausstellte, waren die Daten, die an das Backend übergeben wurden, Array-Objekte, die weiter analysiert werden mussten, als ich erkannte. Einmal geparst, funktionierte der Sql gut. Hier ist der Code, den ich verwendet, um von der Server-Seite zu analysieren, die die SQL-Abfrage gesendet werden würde:

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

Sie rufen insert_multiple_arrays mit drei Parametern, aber zeigen Sie die Definition mit vier. Vielleicht haben Sie eine alte 3-Parameter-Version, die immer noch dort lauert, Buggy und versucht, den Fehler in der 4-Parameter-Version zu finden, die nicht tatsächlich verwendet wird?

+0

Ah, ich verstehe was du meinst. Ich habe nur vergessen, den OUT-Parameter zur Abfrage hinzuzufügen ... Ich werde es aktualisieren. Grundsätzlich versuche ich, einen neuen Benutzer zu erstellen, die neu erstellte Benutzer-ID zurückzugeben und sie als Parameter für die nächsten beiden Insert-Anweisungen zu verwenden. –