runstoredprocedure有个小bug

作者:

Matlab 内置的 runstoredprocedure 函数,用来运行同时有输入和输出参数的存储过程:

x = runstoredprocedure(c, 'myproc', {2500, 'Jones'}, {java.sql.Types.NUMERIC})

同事在用的时候发现一个 bug ,但在网上居然找不到相关的信息。该 bug 出现在访问非 SQL 的数据库的储存过程时,至少存在于 R2010b 版。问题出现在对字符串输入参数的处理上( line 50 - 57 ):

%Build stored procedure call
spcall = [spcall '('];
for i = 1:length(inarg)
  if isnumeric(inarg{i}) || islogical(inarg{i})
    inarg{i} = num2str(inarg{i},17);
  elseif strcmp(sDbName,'MySQL') || strcmp(sDbName,'Microsoft SQL Server')
    inarg{i} = ['''' inarg{i} ''''];
  end
  spcall = [spcall inarg{i} ','];    %#ok, not sure how long spcall will be
end

上面这段代码是将储存过程的输入参数转化为函数参数的形式

myproc(2500, 'Jones',

但对于 Oracle 数据库或者其它非 SQL 类型的数据库,它被转化为了

myproc(2500, Jones,

上面的 Jones 左右边没有引号,当传入数据库进行执行时,数据库识别不出 Jones 是什么含义,从而导致报错:

??? Java exception occurred:
java.sql.SQLException: ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'myproc'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

at sun.jdbc.odbc.JdbcOdbc.createSQLException(Unknown Source)

at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source)

at sun.jdbc.odbc.JdbcOdbc.SQLExecute(Unknown Source)

at sun.jdbc.odbc.JdbcOdbcPreparedStatement.execute(Unknown Source)

at sun.jdbc.odbc.JdbcOdbcPreparedStatement.executeUpdate(Unknown Source)

修改方法很简单,在 runstoredprocedure 的 第 53 行 的 elseif 中间加一个%号,即

elseif strcmp(sDbName,'MySQL') || strcmp(sDbName,'Microsoft SQL Server')

改成

else%if strcmp(sDbName,'MySQL') || strcmp(sDbName,'Microsoft SQL Server')

也可以下载 修改后版本 ,直接覆盖 Matlab 安装目录下的 \toolbox\database\database\@database\ 目录下的 runstoredprocedure.m。

Q. E. D.

类似文章:
编程 » Matlab
在写 Matlab 程序时,函数的命名方式让人头疼,很难保证刚写的一个函数名在很久以前被用过,成为隐藏的一颗炸弹。
编程 » Matlab
Matlab 在启动时会自动运行脚本 startup.m。在这个脚本里可以自动修改当前目录,修改显示方式等等。比如
编程 » Matlab
第一步, which函数可用来获取 Matlab 函数的全路径(包含路径和文件名)。
编程 » Matlab
读者来信:
编程 » Matlab
写了一个统计代码量的函数,函数已 上传到 Matlab Central File Exchange 下载地址 ,使用方法:
风险管理 » VaR, VaR Primer
不管受到多少质疑,各大商业银行和投资银行的财务报表显示, VaR 框架已是现代风险管理的事实标准。我打算用接下来三个月的时间,对 VaR 框架进行一个全面的介绍,从历史到未来、从原理到算法、从逻辑框架到技术细节。这是酝酿了将近一个月的文章,原本打算写一个长篇文章,但随着资料的积累,也有了一些雄心,打算将这个领域彻底梳理一篇,到最后将完成若干篇文章,所有文章都将位于 VaR Primer 系列下。
今天一个朋友向我提起他参与北京买车摇号,他自己和周围十来人都没有摇中的事情,我关注了一下摇号的一些数据。