.net 使用oracle 的存储过程有返回值也有数据集(游标)
public void GetData(string username, string userip, string userkey, string userareaid, string ypid, string in_provinces, string yearid, out DataTable data, out string out_success, out string out_message)
{
try
{
string constr = ConfigurationManager.ConnectionStrings["constr"].ToString();
using (OracleConnection con = new OracleConnection(constr))
{
con.Open();
OracleCommand cmd = new OracleCommand("proc_pricefind", con);
cmd.CommandType = CommandType.StoredProcedure;
OracleParameter[] paras = new OracleParameter[]
{
new OracleParameter("username", username),
new OracleParameter("userip", userip),
new OracleParameter("userkey", userkey),
new OracleParameter("userareaid", userareaid),
new OracleParameter("ypids", ypid),
new OracleParameter("in_provinces", in_provinces),
new OracleParameter("yearid", yearid),
new OracleParameter("data",OracleType.Cursor),
new OracleParameter("out_success",OracleType.VarChar,4000),
new OracleParameter("out_message",OracleType.VarChar,4000)
};
paras[paras.Length - 1].Direction = ParameterDirection.Output;
paras[paras.Length - 2].Direction = ParameterDirection.Output;
paras[paras.Length - 3].Direction = ParameterDirection.Output;
cmd.Parameters.AddRange(paras.ToArray());
OracleDataAdapter da = new OracleDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
out_success = paras[paras.Length - 2].Value.ToString();
out_message = paras[paras.Length - 1].Value.ToString();
data = ds.Tables[0];
//如果没有返回数据集的话,可以直接使用ExecuteNonQuery()。然后取out的值,这样就不需要把OracleDataReader装换为datatable
//cmd.ExecuteNonQuery();
// out_message = paras[paras.Length - 3].Value;
//OracleDataReader odr = paras[paras.Length - 3].Value as OracleDataReader;
// data=ConvertDataReaderToDataTable(odr);
}
}
catch (Exception ex)
{
out_success = "0";
out_message = ex.Message;
data = null;
}
}
create or replace procedure proc_pricefind(username varchar,
userip varchar,
userkey varchar,
userareaid varchar,
ypids varchar,
in_provinces varchar,
yearid varchar,
data out sys_refcursor,
out_success out varchar,
out_message out varchar) is
findcount number;
configcount number;
findareaidcount number;
configareacount number;
guid varchar(36);
begin
out_success := '0';
out_message := '';
select sys_guid() into guid from dual;
insert into findprice_userrecord
(recordid,
usernmae,
userip,
userkey,
userareaid,
ypid,
findareaid,
yearid,
addtime)
values
(guid,
username,
userip,
userkey,
userareaid,
ypids,
in_provinces,
yearid,
sysdate);
commit;
insert into findprice_log_userrecord
select guid,
sys_guid(),
b.产品名称,
b.剂型分类名称,
b.规格,
b.转换系数,
b.材质,
b.企业名,
t.purprice
from mid_monthspurprice t
inner join view_drug a
on a.sdid = t.sdid
inner join base_stddrug b
on a.sdcode = b.原流水码
where substr(t.dr, 0, 4) = yearid
and b.ypid = ypids
and t.provinceareaid = in_provinces;
commit;
--判断计算条数
select count(distinct t.ypid ||','|| t.findareaid||','|| t.yearid) kk
into findcount
from findprice_userrecord t
where t.userareaid = userareaid;
select t.findnumber
into configcount
from findprice_config t
where t.areaid = userareaid;
if findcount > configcount then
delete from findprice_userrecord t where t.recordid = guid;
delete from findprice_log_userrecord t where t.recordid = guid;
commit;
--删除插入进去的数据
raise_application_error(-20000, '查询的总条数超过了限制');
end if;
--判断计算的省份
select count(1) tol
into out_success
from mon_joinpoint
where instr((select min(t.findareaid)
from findprice_config t
where t.areaid = userareaid),
provinceidnew) > 0
and provinceareaid in (in_provinces);
select count(distinct t.findareaid) tol
into findareaidcount
from findprice_userrecord t
where t.userareaid = userareaid;
if out_success = 0 and findareaidcount > 10 then
delete from findprice_userrecord t where t.recordid = guid;
delete from findprice_log_userrecord t where t.recordid = guid;
commit;
raise_application_error(-20000, '查询省份超过了限制' || configcount);
end if;
open data for
select ypids,
b.产品名称,
b.剂型分类名称,
b.规格,
b.转换系数,
b.材质,
b.企业名,
t.purprice
from mid_monthspurprice t
inner join view_drug a
on a.sdid = t.sdid
inner join base_stddrug b
on a.sdcode = b.原流水码
where substr(t.dr, 0, 4) = yearid
and b.ypid = ypids
and t.provinceareaid = in_provinces;
out_success:='1';
end proc_pricefind;
如果给存储过程加了获取异常的脚本
EXCEPTION
WHEN OTHERS THEN
那么需要在
data out sys_refcursor, 返回的类型顺便赋一些值,不然在.net中执行存储过程会报错如下: open data for
select '0' from dual;
最简单的
create or replace procedure proc_relpage(pageindex number,
data out sys_refcursor) is
begin
open data for
select *
from rel_stdzdrugtemp20160204 a
) );
end proc_relpage;
.net 使用oracle 的存储过程有返回值也有数据集(游标)的更多相关文章
- oracle 写存储过程有返回值时 注意在loop循环处添加返回值:=
例子: create or replace procedure p_xl is v_count NUMBER(10); begin for rs in(select yhbh from dbyh) l ...
- oracle存储过程(返回列表的存储结合游标使用)总结 以及在java中的调用
这段时间开始学习写存储过程,主要原因还是因为工作需要吧,本来以为很简单的,但几经挫折,豪气消磨殆尽,但总算搞通了,为了避免后来者少走弯路,特记述与此,同时亦对自己进行鼓励. 以下是我在开发项目中第一次 ...
- C#获取执行存储过程的" 返回值"代码
以下是C#代码: /// <summary> /// 执行存储过程,返回" 返回值" /// </summary> /// <param name=& ...
- SqlServer如何获取存储过程的返回值
1.Output参数返回值 1 CREATE PROCEDURE [dbo].[upInformation]( 2 @age int , 3 @id bigint OUTPUT 4 ) 5 AS 6 ...
- 利用SQLServer查询分析器获取存储过程的返回值,检查测试存储过程
1.存储过程没有返回值的情况(即存储过程语句中没有return之类的语句)用方法 int count = ExecuteNonQuery(..)执行存储过程其返回值只有两种情况(1)如果通过查询分析器 ...
- 在Delphi中如何获得SQL中存储过程的返回值?
示例存储过程:create procedure proc_loginusername varchar(20),password varchar(20)asdeclare @result intsele ...
- .net 接收存储过程的返回值 。。。。
.net 接收存储过程的返回值 .... Posted on 2009-06-10 20:26 且行且思 阅读(...) 评论(...) 编辑 收藏 例如在向数据库添加新数据时,需要检测是否有重复 本 ...
- 关于ExecuteNonQuery执行存储过程的返回值 、、实例讲解存储过程的返回值与传出参数、、、C#获取存储过程的 Return返回值和Output输出参数值
关于ExecuteNonQuery执行存储过程的返回值 用到过ExecuteNonQuery()函数的朋友们在开发的时候肯定这么用过. if(cmd.ExecuteNonQuery("xxx ...
- JDBC和JPA调用储存过程 接收存储过程有返回值
============jdbc==========================================--java代码:一个输出参数--String connURL = null;Con ...
随机推荐
- js 时间日期格式转换
Date.prototype.Format = function(formatStr) { var str = formatStr; var Week = ['日', '一', '二', '三', ' ...
- Manjaro下带供电的USB Hub提示error -71
问题描述 这款USB Hub是绿联出的1转7带供电的白色款. 在lsusb中显示为 Bus 004 Device 023: ID 05e3:0616 Genesys Logic, Inc. hub B ...
- (转)每天进步一点点——五分钟理解一致性哈希算法(consistent hashing)
背景:在redis集群中,有关于一致性哈希的使用. 一致性哈希:桶大小0~(2^32)-1 哈希指标:平衡性.单调性.分散性.负载性 为了提高平衡性,引入“虚拟节点” 每天进步一点点——五分钟理解一致 ...
- 收藏:win32 控件之 sysLink控件(超链接)
来源:https://blog.csdn.net/dai_jing/article/details/8683487 手动创建syslink(msdn): CreateWindowEx(, WC_LIN ...
- semantic ui框架学习笔记一
面包屑导航 面包屑导航经常用于多个栏目下的内容管理,是web页面里比较常用的组合.例如: <div class="ui breadcrumb"> <a class ...
- 关于form与表单操作
form表单自动提交规则 form表单中只有一个type=text的input,在input中按enter键,会自动提交: form表单中有多个type=text的input,且无type=submi ...
- Android Eclipse 安装教程 hosts替换
http://www.cnblogs.com/Potato-lover/p/5582542.html 第一步,也是最为关键的一步——修改hosts文件 为什么说是最关键的一步呢?因为接下来的操作,我们 ...
- ES6---扩展运算符和rest‘...’(三点运算符),在数组、函数、set/map等中的应用
ES6新增的三点运算符,是由三个点表示,在数组中扮演着重要的角色,可以对数组进行合并与分解.可以对set等数据结构进行转换.可以对函数参数进行简化表示,接下来,我们一起揭开其神秘面纱… ●三点—res ...
- redis的使用场景和基本数据类型
一:redis使用的场景 redis是一个高性能的NoSQL数据库,特点是高性能,持久存储,适应高并发的应用场景. 下面看看它的使用场景1.取最新N个数据的操作比如取网站的最新文章,通过下面方式,我们 ...
- nginx最简安装
在 CentOS 6.2 下安装nginx 一:nginx所需依赖的安装 用yum安装依赖: yum -y install zlib zlib-devel openssl openssl-devel ...