Matlab调用返回游标的存储过程的分析和处理
2、Matlab调用Oracl带游标参数输出的存储过程
笔者也是将工作之中遇到的问题进行了搜集与整理,才完成该文的编写,希望能帮助到有需要的朋友。
2.1、PLSQL中的存储过程
PROCEDURE p_test_for_matlab(p_i IN VARCHAR2, p_cur OUT type_cur) IS
BEGIN
OPEN p_cur FOR
SELECT * FROM mes_imp_operate_log d WHERE rownum <= p_i;
END;
下面执行存储过程返回(官网文档给的,处理返回游标时,很明显这样不行,满足不了需求):
% Execute query and get data from Oracle
curs = runstoredprocedure(conn, 'mes_wytest_pkg.p_test_for_matlab', {}, {oracle.jdbc.OracleTypes.CURSOR});

论坛Matlab团队的人给出解释是(因为runstoredprocedure该函数中包含了一句关闭游标的动作。因此无法获取和游标相关的数据,意思就是对于返回游标的存储过程,不好使)。 但是,上诉runstoredprocedure 可以执行返回值不是游标的存储过程。)

conn = database('AE','e','e', 'oracle.jdbc.driver.OracleDriver','jdbc:oracle:thin:@10.24.10.3:1521:');
curs = runCursorSP(conn, 'mes_wytest_pkg.p_test_for_matlab', {}, {oracle.jdbc.OracleTypes.CURSOR});
a = curs{,};
close(conn);
返回的结果是:


这就是我们要的东西。

-------------------------------------------------------拓展修改应用----------------------------------------------------------------
2.3、我们修改试试,尝试将存储过程修改成返回Number类型
curs = runCursorSP(conn, 'mes_wytest_pkg.p_test_for_matlab', {}, {oracle.jdbc.OracleTypes.NUMBER});
PROCEDURE p_test_for_matlab(p_i IN VARCHAR2, p_cur OUT NUMBER) IS
BEGIN
SELECT COUNT(*)
INTO p_cur
FROM mes_imp_operate_log d
WHERE rownum <= p_i;
END;
测试结果显示:

此处也可以使用 runstoredprocedure。
其 runCursorSP.m 文件是这样定义的(直接复制就好):
function x = runCursorSP(c,spcall,inarg,typeout)
%RUNCURSORSP Function to run an Oracle stored procedure that returns a
%cursor object. Usage is same as RUNSTOREDPROCEDURE %Set defaults for inarg and typeout
if nargin <
inarg = [];
end
if nargin <
typeout = [];
end %Get JDBC connection Handle
h = c.Handle; %Get Database name
dMetaData = dmd(c);
sDbName = get(dMetaData,'DatabaseProductName'); %Build stored procedure call
spcall = [spcall '('];
for i = :length(inarg)
if isnumeric(inarg{i}) || islogical(inarg{i})
inarg{i} = num2str(inarg{i},);
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
numout = length(typeout);
for i = :numout
spcall = [spcall '?,']; %#ok, not sure how long spcall will be
end %Allow for procedures with no inputs or outputs
if ~(isempty(inarg) && isempty(typeout))
spcall(end) = ')';
else
spcall(end) = [];
end
spcall = ['{call ' spcall '}']; %Create callable statement
csmt = h.prepareCall(spcall); %Register output parameters
for i = :numout
csmt.registerOutParameter(i,typeout{i});
end %Execute callable statement, method depends on output parameters
if ~isempty(typeout)
csmt.executeUpdate;
else
try
x = csmt.execute;
catch exception
error(message('database:runstoredprocedure:returnedResultSet', exception.message));
end
return
end %Return output parameters as native data types
x = cell(numout,);
for i = :numout
x{i} = csmt.getObject(i); %Check if Oracle resultset returned if(isa(x{i}, 'oracle.jdbc.driver.OracleResultSetImpl'))
data = fetchCursorData(c, x{i});
x{i} = data;
end end %Close callable statement
close(csmt)
end
function data = fetchCursorData(conn, rs)
%FETCHCURSORDATA function to fetch data in a resultset object returned when
% calling a stored procedure that returns a cursor.
% data = fetchCursorData(conn, rs)
% conn : Database Connection Object
% rs : ResultSet object %Fetch the data h = conn.Handle; fet = com.mathworks.toolbox.database.fetchTheData(h, rs, ''); md = getTheMetaData(fet);
status = validResultSet(fet,md); if(status ~= ) %Get preferences
p = setdbprefs({'NullStringRead';'NullNumberRead';'DataReturnFormat'});
tmpNullNumberRead = 'NullNumberReadPlaceHolderCFG3358'; %Fetch batchCount rows
resultSetMetaData = getValidResultSet(fet,md);
dataFetched = dataFetch(fet,resultSetMetaData,p.NullStringRead,tmpNullNumberRead); %Convert java.util.vector to cell array
%Get number of rows and columns rsmd = getMetaData(rs);
ncols = getColumnCount(rsmd); nrows = size(dataFetched) / ncols;
data = system_dependent(,dataFetched,nrows)'; %Convert NullNumberRead value into numeric value
i = find(strcmp(data,tmpNullNumberRead));
data(i) = {str2num(p.NullNumberRead)}; else
error('No valid resultset');
end %close resultset
rs.close; end
谢谢阅读!
分享是美德!
分享共进步!
Matlab调用返回游标的存储过程的分析和处理的更多相关文章
- Oracle 存储过程调用返回游标的另一个存储过程。
一个扩展存储过程调用另一个存储过程,示例: 被调用存储过程:最后会返回一个游标,游标返回一个值.调用这个存储过程的存储过程同样需要获取它. procedure SearchBill --根据到货单号查 ...
- (转载)oracle 在一个存储过程中调用另一个返回游标的存储过程
原文链接:http://www.jb51.net/article/20160.htm 实际项目当中经常需要在一个存储过程中调用另一个存储过程返回的游标,本文列举了两种情况讲述具体的操作方法. 第一种情 ...
- sqlserver 存储过程返回游标的处理
创建表: create table tb1( id int , name ) ) ------------------------------------------------- 创建返回游标的存储 ...
- mybatis 调用存储过程 返回游标 实例
存储过程示例: create or replace procedure Fsp_Plan_CheckPrj(v_grantno varchar2, v_deptcode number, v_curso ...
- ibatis调存储过程返回游标
http://blog.sina.com.cn/s/blog_6f3ca78f01010pmj.html iBatic调用与JAVA调用很类似,只是JAVA把参数的注册放到了类里面,而iBatis把参 ...
- C#调用SQL中的存储过程中有output参数,存储过程执行过程中返回信息
C#调用SQL中的存储过程中有output参数,类型是字符型的时候一定要指定参数的长度.不然获取到的结果总是只有第一字符.本人就是由于这个原因,折腾了很久.在此记录一下,供大家以后参考! 例如: ...
- java Servlet+mysql 调用带有输入参数和返回值的存储过程(原创)
这个数据访问的功能,我在.NET+Mysql .NET+Sqlserver PHP+Mysql上都实现过,并且都发布在了我博客园里面,因为我觉得这个功能实在是太重要,会让你少写很多SQL语句不说,还 ...
- JDBC和JPA调用储存过程 接收存储过程有返回值
============jdbc==========================================--java代码:一个输出参数--String connURL = null;Con ...
- oracle ibatis 存储过程 返回游标 嵌套表
自己解决问题了 问题总结: 1.index by表不能存储在数据库中的type中,故选择嵌套表. 2.ibatis不支持oracle的复合数据类型的返回.(个人理解) 3.替代方案:用返回oracle ...
随机推荐
- Spring+Quartz实现文件中转站
其实这个功能QQ邮箱就有,为什么还要自己开发一个呢?因为有的文件非常重要...其实是客户要求... 那么我们先来看一下QQ的界面: 我们设计的界面: 文件要到期了是否通知用户?这里我们支持邮件及短信方 ...
- dtree实现动态加载树形菜单,动态插入树形菜单
1.导入 dtree文件 dtree.css img文件夹 dtree.js 2. 建立对应 的数据库 1 父ID name id 3 建立连接 ...
- (转)不通过web.config在运行时注册httpmodules
https://blog.csdn.net/kufeiyun/article/details/7763070 在asp.net4 中,我们知道可以不用任何配置让一个方法在appdomain中尽早执行, ...
- OpenShift采用Blackbox_exporter进行服务状态监控
本文主要是针对prometheus的blackbox_exporter,对集群中的服务进行状态的监控 因为OpenShift 3.11版本自己带的promethues修改起来有一些问题,所以自己安装和 ...
- tsort - 拓扑排序
tsort - 拓扑排序 本文链接:http://codingstandards.iteye.com/blog/834572 (转载请注明出处) 用途说明 tsort命令通常用于解决一种逻辑问题, ...
- go语言之进阶篇指针类型和普通类型的方法集
方法集 类型的方法集是指可以被该类型的值调用的所有方法的集合. 用实例实例 value 和 pointer 调用方法(含匿名字段)不受方法集约束,编译器编总是查找全部方法,并自动转换 receiver ...
- Bootstrap学习js插件篇之滚动监听
1.滚动监听 案例 滚动监听插件可以根据滚动条的位置自动更新所对应的导航标记.Bootstrap中文网左侧就是一个滚动监听的例子. 代码段: <nav id="navbar-examp ...
- javascript制作公式编辑器,函数编辑器和图形绘制
自己是电子信息方向的,因此总是需要处理大量的电路实验.电路数据和电路仿真处理,每次处理数据时候还需要同样的数据很多遍, 又需要关于电路的频率响应和时域响应情况,所以一直有做一个这样公式编辑器的打算了. ...
- nginx rewrite only specific servername to https
需求: 把某个域名的80端口服务 ----> 重定向转到 这个域名的 443端口的服务. server { listen 80; server_name xxx.abcd.com.cn; ...
- C++的基本类型