Linux环境下,使用erlang语言,通过ODBC,访问Oracle数据库。
现在需要调用Oralce的一个存储过程,此存储过程有输入参数,也有输出参数,其定义如下:
CREATE OR REPLACE PROCEDURE PROC_INSERT_SYS_REC_FILE
( call_id in varchar2,
voice_file_name in varchar2,
start_time in date,
v_id out integer
) IS
begin
insert into sys_rec_file (CALLID, VOICE_FILE_NAME, START_TIME) VALUES(call_id, voice_file_name, start_time)
returning id into v_id;
end PROC_INSERT_SYS_REC_FILE;
如上所示,存储过程PROC_INSERT_SYS_REC_FILE的目的是向一个录音文件表(SYS_REC_FILE)中插入一条记录的,
由于在插入记录时数据库的TRIGGER会自动生成一个ID做为记录的主键,而ERLANG应用程序需要在录音结束后修改此记录的end_time(录音结束时间)字段。所以,需要获得此记录的ID字段的值。这里就是存储过程的v_id输出参数。
问题就是这样一个问题啦。
erlang的代码如下:
odbc:param_query(DBRef,
"{call proc_insert_sys_rec_file(?,?,?,?)}",
[{{sql_varchar, 64}, [CallID]},
{{sql_varchar, 512}, [FileName]},
{sql_timestamp, [calendar:local_time()]},
{sql_integer, out, [1]}]).
如下所示:
1. 调用存储过程的查询字串就是:"{call proc_insert_sys_rec_file(?,?,?,?)}"
如果有返回值的话就这样:"{? = call proc_insert_sys_rec_file(?,?,?,?)}"。
2. 前三个是输入参数,其完成的参数描述应该像这样:{{sql_varchar, 64}, in, [CallID]}
由于in是默认值,所以就省啦。
3. 第4个是输出参数,{sql_integer, out, [1]}。
其中比较怪异的是[1],它表示在返回的结果list中做为第1个tuple。
上面的调用如果正确执行的话会返回:{executed, 1, [{19}]}。
其中的19就是存储过程返回的V_ID值啦。