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 ...
随机推荐
- 序列化人人网框架下的DAO?也就是在Spring下序列化DAO的问题(spring+quartz集群下)
人人网框架地址:http://code.google.com/p/paoding-rose/ 问题发生: 用Quartz作集群时用JobDataMap传递DAO,提示DAO未序列化,可框架的DAO为接 ...
- JSON.parse()和jQuery.parseJSON()的区别
jQuery.parseJSON(jsonString) : 将格式完好的JSON字符串转为与之对应的JavaScript对象 (jquery 方法) 1 2 3 var str = '[{&qu ...
- C语言的32个保留字
auto :声明自动变量 double :声明双精度变量或函数 int: 声明整型变量或函数 struct:声明结构体变量或函数 break:跳出当前循环 else :条件语句否定分支(与 if 连用 ...
- 使用SGD(Stochastic Gradient Descent)进行大规模机器学习
原贴地址:http://fuliang.iteye.com/blog/1482002 其它参考资料:http://en.wikipedia.org/wiki/Stochastic_gradient_ ...
- Candy leetcode java
题目: There are N children standing in a line. Each child is assigned a rating value. You are giving c ...
- 新鲜出炉!9个超高分辨率的iPhone 6原型素材打包下载
iPhone 6 出场,设计师又有得忙活了,但是新鲜的资源你们在哪里?!今天我们收集了一组精致的iPhone 6 模型素材,超高分辨率,多种视图,全都打包完毕,点一下就可以拿回家!赶紧来取吧!—— ...
- 以AVL树为例理解二叉树的旋转(Rotate)操作
树旋转是在二叉树中的一种子树调整操作, 每一次旋转并不影响对该二叉树进行中序遍历的结果. 树旋转通常应用于需要调整树的局部平衡性的场合. 树旋转包括两个不同的方式, 分别是左旋转和右旋转. 两种旋转呈 ...
- Spark RDD关联操作小结
前言 Spark的rdd之间的关系需要通过一些特定的操作来实现, 操作比较多也,特别是一堆JOIN也挺容易让人产生混乱的. 因此做了下小结梳理一下. 准备数据 var rdd1 = sc.makeRD ...
- [置顶] hdu 4418 高斯消元解方程求期望
题意: 一个人在一条线段来回走(遇到线段端点就转变方向),现在他从起点出发,并有一个初始方向, 每次都可以走1, 2, 3 ..... m步,都有对应着一个概率.问你他走到终点的概率 思路: 方向问 ...
- Typescript declaration: Merge a class and an interface
参考: https://stackoverflow.com/questions/47670959/typescript-declaration-merge-a-class-and-an-interfa ...