6

我在 db2 中有一个存储过程

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;    
end@

我正在尝试通过 Erlang odbc:param_query 调用。

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

以上给了我适当的回报

{executed,1,[{101}]}

但是当我将多个值传递为

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

它抛出异常

异常退出:函数 odbc:decode/1 中的 {badarg,odbc,param_query,'Params'}(odbc.erl,第 894 行)

有没有其他方法可以将列表(数组)传递给存储过程?

4

2 回答 2

1

我相信你需要在两个参数列表中都有相同数量的参数,这意味着在你的第二个列表或参数中添加三个 1。

odbc:param_query(Ref,  "CALL sum (?, ?)", [{sql_integer, [1,2,3,4]}, {sql_integer, out, [1,1,1,1]}]).
于 2017-12-29T15:32:11.210 回答
0

看起来整数列表没有 OBDC 数据类型(至少有对应的 Erlang 数据类型)(请参阅erlang obdc 文档)。我不知道最终查询应该是什么样子(int 数组的语法),但我认为您可以通过将查询创建为字符串来实现您想要的:

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

然后使用odbc:sql_query(Ref, Query).

于 2013-09-22T05:38:29.150 回答