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 可以执行返回值不是游标的存储过程。)

----------------------------------------------推荐使用的---------------------------------------------------------------------------
2.2、官网论坛,给出的写法是(附带runCursorSP.m):
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调用返回游标的存储过程的分析和处理的更多相关文章

  1. Oracle 存储过程调用返回游标的另一个存储过程。

    一个扩展存储过程调用另一个存储过程,示例: 被调用存储过程:最后会返回一个游标,游标返回一个值.调用这个存储过程的存储过程同样需要获取它. procedure SearchBill --根据到货单号查 ...

  2. (转载)oracle 在一个存储过程中调用另一个返回游标的存储过程

    原文链接:http://www.jb51.net/article/20160.htm 实际项目当中经常需要在一个存储过程中调用另一个存储过程返回的游标,本文列举了两种情况讲述具体的操作方法. 第一种情 ...

  3. sqlserver 存储过程返回游标的处理

    创建表: create table tb1( id int , name ) ) ------------------------------------------------- 创建返回游标的存储 ...

  4. mybatis 调用存储过程 返回游标 实例

    存储过程示例: create or replace procedure Fsp_Plan_CheckPrj(v_grantno varchar2, v_deptcode number, v_curso ...

  5. ibatis调存储过程返回游标

    http://blog.sina.com.cn/s/blog_6f3ca78f01010pmj.html iBatic调用与JAVA调用很类似,只是JAVA把参数的注册放到了类里面,而iBatis把参 ...

  6. C#调用SQL中的存储过程中有output参数,存储过程执行过程中返回信息

      C#调用SQL中的存储过程中有output参数,类型是字符型的时候一定要指定参数的长度.不然获取到的结果总是只有第一字符.本人就是由于这个原因,折腾了很久.在此记录一下,供大家以后参考! 例如: ...

  7. java Servlet+mysql 调用带有输入参数和返回值的存储过程(原创)

    这个数据访问的功能,我在.NET+Mysql .NET+Sqlserver  PHP+Mysql上都实现过,并且都发布在了我博客园里面,因为我觉得这个功能实在是太重要,会让你少写很多SQL语句不说,还 ...

  8. JDBC和JPA调用储存过程 接收存储过程有返回值

    ============jdbc==========================================--java代码:一个输出参数--String connURL = null;Con ...

  9. oracle ibatis 存储过程 返回游标 嵌套表

    自己解决问题了 问题总结: 1.index by表不能存储在数据库中的type中,故选择嵌套表. 2.ibatis不支持oracle的复合数据类型的返回.(个人理解) 3.替代方案:用返回oracle ...

随机推荐

  1. Tomcat集群Spring+Quartz多次执行解决方案记录

    由于在集群环境下定时器会出现并发和重复执行的问题,我再三考虑记录有5 一.把定时器模块单独拿出来放到一台tomcat或者新建一个Java工程手动启动定时器,这样定时器的任务就可以从原来的集群中抽离开来 ...

  2. Eclipse 搭建struts2 spring3 hibernate3环境实战 待完善

    1.struts2 目前是2.3版本,下载地址http://struts.apache.org/download.cgi struts2包 struts2-core-2.3.16.3.jar stru ...

  3. how to configure logback for Mybatis to print my SQL

    To log SQL statements for particular mybatis mapper set DEBUG (TRACE to see query parameters and res ...

  4. C语言:返回两个数组中第一个元素的指针,并输出这个值

    // //  main.c //  Pointer_search // //  Created by ma c on 15/8/2. //  Copyright (c) 2015年. All righ ...

  5. Informatica 常用组件Lookup之九 配置未连接的查找转换

    在映射中,未连接的查找转换与管道是分开的.您可以使用 :LKP 引用限定符编写表达式以调用其它转换中的查找.未连接查找的常用用法包括: 测试表达式中某个查找的结果 基于查找结果过滤行 基于查找的结果将 ...

  6. 第三章 mybatis-generator + mysql/ptsql

    用了mybatis-generator,我就不再想用注解了,这与我之前说的注解与XML并用是矛盾的,知识嘛,本来就是多元化的,今天喜欢这个,明天喜欢那个,哈哈,看了mybatis-generator下 ...

  7. SQL Server’s Storage Top 10 Best Practices

    好文章, 简明扼要. Storage Top 10 Best Practices http://technet.microsoft.com/en-us/library/cc966534.aspx

  8. python 分词计算文档TF-IDF值并排序

    文章来自于我的个人博客:python 分词计算文档TF-IDF值并排序 该程序实现的功能是:首先读取一些文档,然后通过jieba来分词,将分词存入文件,然后通过sklearn计算每一个分词文档中的tf ...

  9. Eclipse 创建文件快捷菜单、避免格式化时自动换行、.properties文件中文乱码、在线安装FreeMarker

    创建文件快捷菜单设置 打开窗口“Customize Perspective - Java EE”,切换选项卡到“Shortcuts”: 进行一下配置: “Generate”:如上图勾选方式 " ...

  10. (转)unity3d中脚本生命周期(MonoBehaviour lifecycle)

    自:http://blog.csdn.net/qitian67/article/details/18516503 最近在做一个小示例,发现类继承于MonoBehaviour的类,有很多个方法,于是乎必 ...