2013-09-21 51 views
5

Tôi có một thủ tục lưu trữ trong DB2Làm thế nào để gọi thủ tục lưu trữ dùng mảng sử dụng odbc: param_query trong 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] 

Tôi cố gắng để gọi qua Erlang odbc: param_query.

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

Ở trên là đem lại cho tôi trở lại đúng như

{executed,1,[{101}]} 

Nhưng khi tôi vượt qua nhiều giá trị như

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

Người ta ném một ngoại lệ

thoát ngoại lệ: {badarg, odbc, param_query, 'Params'} trong hàm odbc: giải mã/1 (odbc.erl, dòng 894)

Có cách nào khác để chuyển danh sách (Array) đến thủ tục lưu sẵn không?

Trả lời

0

Dường như không có loại dữ liệu OBDC (ít nhất với loại dữ liệu Erlang tương ứng) cho danh sách số nguyên (xem erlang obdc documentation). Tôi không biết làm thế nào các truy vấn cuối cùng sẽ giống như (cú pháp cho mảng int) nhưng tôi nghĩ rằng bạn có thể đạt được những gì bạn muốn bằng cách tạo truy vấn của bạn như là một chuỗi:

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

và sau đó sử dụng odbc:sql_query(Ref, Query).

0

Tôi tin rằng bạn cần có số lượng đối số bằng nhau trong cả hai danh sách đối số, nghĩa là thêm ba số 1 vào danh sách hoặc đối số thứ 2 của bạn.

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