2013-09-21 2 views
5

Ich habe eine gespeicherte Prozedur in db2Wie Aufruf gespeicherte Prozedur unter Array mit odbc: param_query in Erlang

create type intArray as integer array[100]@ 

create or replace procedure sum(in numList intArray, out total integer) 
begin 
    declare i, n integer; 

    set n = CARDINALITY(numList); 

    set i = 1; 
    set total = 100; 

    while (i <= n) do 
    set total = total + numList[i]; 
    set i = i + 1; 
    end while;  
[email protected] 

ich durch Erlang odbc zu nennen versuchen: param_query.

odbc:param_query(Ref, "CALL sum (?, ?)", [{sql_integer,[1]}, {sql_integer,out, [1]}]). 

Die oben gibt mir die richtige Rückkehr als

{executed,1,[{101}]} 

Aber wenn ich mehrere Werte als

odbc:param_query(Ref, "CALL sum (?, ?)", [{sql_integer,[1,2,3,4]}, {sql_integer,out, [1]}]). 

Es wirft eine Ausnahme

Ausnahme Ausfahrt passieren: {badarg, odbc, param_query, 'Params'} in der Funktion odbc: decode/1 (odbc.erl, Zeile 894)

Gibt es eine andere Möglichkeit, eine Liste (Array) an die gespeicherte Prozedur zu übergeben?

Antwort

0

Es sieht aus, als ob es keinen OBDC-Datentyp (zumindest mit einem entsprechenden Erlang-Wert) für eine Liste von Integer gibt (siehe erlang obdc documentation). Ich weiß nicht, wie das die letzte Abfrage wie (die Syntax für int-Array) aussehen soll, aber ich denke, dass Sie erreichen, was Sie von der Erstellung Ihrer Abfrage als String wollen:

Query = io_lib:format("CALL sum (~p , ~p)",[int_array_syntax([1,2,3,4]),1])

und dann verwenden odbc:sql_query(Ref, Query).

0

Ich glaube, Sie müssen die gleiche Anzahl von Argumenten in beiden Listen von Argumenten haben, was bedeutet, fügen Sie drei 1s in Ihrer zweiten Liste oder Argumente.

odbc:param_query(Ref, "CALL sum (?, ?)", [{sql_integer, [1,2,3,4]}, {sql_integer, out, [1,1,1,1]}]). 
Verwandte Themen