.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 ...
随机推荐
- Libre OJ 130、131、132 (树状数组 单点修改、区间查询 -> 区间修改,单点查询 -> 区间修改,区间查询)
这三题均可以用树状数组.分块或线段树来做 #130. 树状数组 1 :单点修改,区间查询 题目链接:https://loj.ac/problem/130 题目描述 这是一道模板题. 给定数列 a[1] ...
- Typescript学习笔记(一)基础类型
为了面向ng2和前端未来,开始搞向ts,ts是微软出的一枚语言,作为es6的超集,他出的一些特性还是蛮好用的(略坑).对于我等纯前端(从开始就接触javascript)的人来说,真想说,这特么什么鬼. ...
- RAP 接口Mock示例
前后端分离式开发的思考 目前大部分公司都实行了前后端分离开发.然而在项目开发过程当中,经常会遇到以下几个尴尬的场景: 1.前端开发依赖于后端接口数据,需要与后端接口联调才能获得数据展示,从而拖慢了开发 ...
- VMware Workstation 14 激活码
激活码: 1.FF31K-AHZD1-H8ETZ-8WWEZ-WUUVA 2.CV7T2-6WY5Q-48EWP-ZXY7X-QGUWD
- tensorflow-gpu版本出现libcublas.so.8.0:cannot open shared object file
文章主要参考以下博客https://www.aliyun.com/zixun/wenji/1289957.html 在利用GPU加速tensorflow时,出现了libcublas.so.8.0:ca ...
- 通过$.ajax设置预加载动画加强用户体验
以前在jquery请求数据时,总喜欢用简洁的$.get与$.post提交数据,但有时发现由于网速的问题,有些时候网站加载js获得的数据会非常慢,于是就想能不能请求数据中间,给加载数据一个提示,增加用户 ...
- 购物demo
这段时间从一个模板网站上拷了个购物系统的demo,试着写了一下,发现div+css布局还真是精妙无穷呢.设置好了布局,加上动态效果也只是锦上添花而已.所以,接下来的重点就是布局了! 我把网址粘上去:h ...
- docker的使用 -- windows
1. 下载docker desktop https://www.docker.com/products/docker-desktop 更多操作指令 ps: 值得注意的是,刚下载下来的docker只能在 ...
- Golang的排序和查找
Golang的排序和查找 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.排序的基本介绍 排序是将一组数据,依指定的顺序进行排列的过程.排序的分类如下 1>.内部排序 指将 ...
- Java NIO系列教程(八)JDK AIO编程
目录: Reactor(反应堆)和Proactor(前摄器) <I/O模型之三:两种高性能 I/O 设计模式 Reactor 和 Proactor> <[转]第8章 前摄器(Proa ...