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 的存储过程有返回值也有数据集(游标)的更多相关文章

  1. oracle 写存储过程有返回值时 注意在loop循环处添加返回值:=

    例子: create or replace procedure p_xl is v_count NUMBER(10); begin for rs in(select yhbh from dbyh) l ...

  2. oracle存储过程(返回列表的存储结合游标使用)总结 以及在java中的调用

    这段时间开始学习写存储过程,主要原因还是因为工作需要吧,本来以为很简单的,但几经挫折,豪气消磨殆尽,但总算搞通了,为了避免后来者少走弯路,特记述与此,同时亦对自己进行鼓励. 以下是我在开发项目中第一次 ...

  3. C#获取执行存储过程的" 返回值"代码

    以下是C#代码: /// <summary> /// 执行存储过程,返回" 返回值" /// </summary> /// <param name=& ...

  4. SqlServer如何获取存储过程的返回值

    1.Output参数返回值 1 CREATE PROCEDURE [dbo].[upInformation]( 2 @age int , 3 @id bigint OUTPUT 4 ) 5 AS 6 ...

  5. 利用SQLServer查询分析器获取存储过程的返回值,检查测试存储过程

    1.存储过程没有返回值的情况(即存储过程语句中没有return之类的语句)用方法 int count = ExecuteNonQuery(..)执行存储过程其返回值只有两种情况(1)如果通过查询分析器 ...

  6. 在Delphi中如何获得SQL中存储过程的返回值?

    示例存储过程:create procedure proc_loginusername varchar(20),password varchar(20)asdeclare @result intsele ...

  7. .net 接收存储过程的返回值 。。。。

    .net 接收存储过程的返回值 .... Posted on 2009-06-10 20:26 且行且思 阅读(...) 评论(...) 编辑 收藏 例如在向数据库添加新数据时,需要检测是否有重复 本 ...

  8. 关于ExecuteNonQuery执行存储过程的返回值 、、实例讲解存储过程的返回值与传出参数、、、C#获取存储过程的 Return返回值和Output输出参数值

    关于ExecuteNonQuery执行存储过程的返回值 用到过ExecuteNonQuery()函数的朋友们在开发的时候肯定这么用过. if(cmd.ExecuteNonQuery("xxx ...

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

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

随机推荐

  1. CF739E Gosha is hunting

    法一: 匹配问题,网络流! 最大费用最大流,S到A,B流a/b费0,A,B到i流1费p[i]/u[i],同时选择再减p[i]*u[i]? 连二次!所以i到T流1费0流1费-p[i]*u[i] 最大流由 ...

  2. 洛谷P2375 动物园

    我要死了.这是我做过的最恶心的题之一. 天下第一的大毒瘤.有gay毒. 我不如熊猫好多年... 题意:给定字符串,求g[i],表示:[0, i]中满足该子串既是前缀又是后缀还不重叠的子串数. 解:题面 ...

  3. win32: 静态控件(Static) - SS_NOTIFY - 响应事件

    SS_NOTIFY 在缺省情况下,静态控件是不响应鼠标事件的.只有在设置该风格后,当用户单击静态 控件时,静态控件才向父窗口发送STN_CLICKED通知 -> WM_COMMAND. 2014 ...

  4. 安装SDL遇到的问题

    版本:SDL-1.2.15 转自,遇到的问题与此一样:http://blog.csdn.net/huierlc/article/details/50165237 问题1:make时出现 fatal e ...

  5. dos下编译java

    dos下运行java程序,不借助其他的IDE,即可编译运行java程序. 工具/原料   电脑 方法/步骤     打开开始,运行cmd,进入dos界面.   分别运行java,和javac,检测jd ...

  6. (链表) 206. Reverse Linked List

    Reverse a singly linked list. Example: Input: 1->2->3->4->5->NULL Output: 5->4-> ...

  7. BZOJ4698 差分 + 二分 + SA

    https://www.lydsy.com/JudgeOnline/problem.php?id=4698 题意:求N个字符串中最长的相同字串的长度,相同的定义是:两个子串长度相同且一个串的全部元素加 ...

  8. CodeForces7D 字符串hash + dp

    https://cn.vjudge.net/problem/20907/origin 长度是 n 的字符串 s,如果它自身是回文数,且它的长度为 的前缀和后缀是 (k - )-回文数,则它被称作 k- ...

  9. .gitignore无效的原因

    有时候,我们编写gitinore后发现文件还是没有被忽略,这是什么原因呢? 熟知git的老鸟们可能已经知道,因为这个文件在之前已经被追踪了,如果想忽略已经被追踪的文件我们需要把这个追踪去除. 对所有文 ...

  10. 2017-12-15python全栈9期第二天第五节之格式化输出补充之想要在格式化输出中表示单纯的%号就加%

    #!/user/bin/python# -*- coding:utf-8 -*-name = input('姓名:')age = input('年龄:')height = input('身高:')ms ...