erlang使用ODBC调用存储过程

本文介绍如何在Linux环境下使用Erlang语言通过ODBC连接并调用Oracle数据库中的存储过程,重点讲解了输入参数及输出参数的设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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值啦。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值