zoukankan      html  css  js  c++  java
  • 分页存储过程 和 调用

    ORACLE段:
    首先在ORACLE建立PACKAGE和PACKAGE BODY,将在这里面定义函数和存储过程返回结果集。
    1:建立PACKAGE:


    CREATE OR REPLACE package SCOTT.pk_wt
    is
    type mytype is ref cursor;
    procedure p_wt(mycs out mytype);
    function f_get(str in varchar2)
    return varchar2;
    end;
    /
    说明:其实PACKAGE只是个声明罢了。我们在这里定义了一个存储过程返回结集和一个函数,返回字符串。

    2:建立PACKAGE BODY:
    CREATE OR REPLACE package BODY SCOTT.pk_wt
    is
    procedure p_wt(mycs out mytype)
    is
    begin
    open mycs for select * from test;
    end p_wt;

    function f_get(str varchar2)
    return varchar2
    is
    str_temp varchar2(100) := 'good luck!';
    begin
    str_temp := str_temp || str;
    return str_temp;
    end f_get;

    end pk_wt;
    /
    说明:这里建立PACKAGE BODY是具体的说明和使用,将采用什么方式实现。。

    分页存储过程

     CREATE OR REPLACE PACKAGE DotNet is
     --**************************************************************** 
     TYPE type_cur IS REF CURSOR;    
     --定义游标变量用于返回记录集 
     PROCEDURE DotNetPagination
       ( 
       Pindex in number,                --分页索引 
       Psql in varchar2,                --产生dataset的sql语句 
       Psize in number,                 --页面大小 
       Pcount out number,               --返回分页总数 
       v_cur out type_cur               --返回当前页数据记录 
       ); 
       procedure DotNetPageRecordsCount 
       ( 
       Psqlcount in varchar2,           --产生dataset的sql语句 
       Prcount   out number             --返回记录总数
        );
       end DotNet;
    --****************************************************************

    CREATE OR REPLACE PACKAGE Body DotNet is
    --*************************************************************************************** 
    PROCEDURE DotNetPagination 

    Pindex in number, 
    Psql in varchar2, 
    Psize in number, 
    Pcount out number, 
    v_cur out type_cur 

    AS 
    v_sql VARCHAR2(1000); 
    v_count number; 
    v_Plow number; 
    v_Phei number; 
    Begin 
    ------------------------------------------------------------取分页总数 
    v_sql := 'select count(*) from (' || Psql || ')'; 
    execute immediate v_sql into v_count; 
    Pcount := ceil(v_count/Psize); 
    ------------------------------------------------------------显示任意页内容 
    v_Phei := Pindex * Psize + Psize;  v_Plow := v_Phei - Psize + 1;   
    v_sql := 'SELECT *
                 FROM (                
                  SELECT A.*, rownum rn                  
                  FROM  ('|| Psql ||') A                
                   WHERE rownum <= '|| to_char(v_Phei) || '                
                   ) B          
               WHERE rn >= ' || to_char(v_Plow) ;
    --注意对rownum别名的使用,第一次直接用rownum,第二次一定要用别名rn   
    open v_cur for v_sql; 
    End DotNetPagination;
    --************************************************************************************** 
    procedure DotNetPageRecordsCount 

    Psqlcount in varchar2, 
    Prcount   out number 
    )
     as 
     v_sql varchar2(1000);
      v_prcount number;
       begin  v_sql := 'select count(*) from (' || Psqlcount || ')'; 
        execute immediate v_sql into v_prcount; 
        Prcount := v_prcount;                 
        --返回记录总数 
        end DotNetPageRecordsCount;
        --**************************************************************************************
        end DotNet;


    C#段:
    在C#中代码将分为两部分,一部分是使用函数,另外一部分是使用结果集。
    定义一个连接,从WEBCONFIG里去取得:
    private OracleConnection orcn=new OracleConnection(System.Configuration.ConfigurationSettings.AppSettings["scott"]);
    C#调用ORACLE函数:
    OracleCommand cmd=new OracleCommand("pk_wt.f_get",orcn);
    cmd.CommandType=CommandType.StoredProcedure;
    OracleParameter p1=new OracleParameter("str",OracleType.VarChar,10);
    p1.Direction=System.Data.ParameterDirection.Input;
    p1.Value=this.TextBox1.Text;
    OracleParameter p2=new OracleParameter("result",OracleType.VarChar,100);
    p2.Direction=System.Data.ParameterDirection.ReturnValue;
    cmd.Parameters.Add(p1);
    cmd.Parameters.Add(p2);
    orcn.Open();
    cmd.ExecuteNonQuery();
    orcn.Close();
    this.Button_function.Text=p2.Value.ToString();
    其中RESULT是系统自定义的函数返回变量,特别要注意的是,函数的参数的返回类型要指定,另外就是COMMAND类型也需要指定,另外和一般的存储过程没什么差别。

    C#调用ORACLE返回结果集:
    OracleCommand cmd=new OracleCommand("pk_wt.p_wt",orcn);
    cmd.CommandType=CommandType.StoredProcedure;
    OracleParameter p1=new OracleParameter("mycs",OracleType.Cursor);
    p1.Direction=System.Data.ParameterDirection.Output;
    cmd.Parameters.Add(p1);
    OracleDataAdapter da=new OracleDataAdapter(cmd);
    DataSet ds=new DataSet();
    da.Fill(ds,"test");
    this.DataGrid1.DataSource=ds;
    this.DataGrid1.DataBind();
    这里没什么可说的类。。只是定义的数据类型是游标,类型是OUTPUT,另外没什么了。。

    个人总结:
    ORACLE的PACKAGE和PACKAGE BODY将是我们返回结集和使用函数的唯一方法,这一定要好好学习

  • 相关阅读:
    csp-s 92
    支持smtp/imap smtp/pop3的撞库python撞库脚本
    关于KB2839299 微软补丁前后的kifastcallentry
    (转载)RegSetValueEx设置REG_SZ类型键值时要注意的问题
    x64windows安全机制进程_线程_模块加载回调摘要
    windbg脚本实践3----监控特定进程创建
    windbg脚本实践2----监控特定注册表键值创建和删除
    windbg脚本实践1----监控特定文件创建 删除 读写
    纪念在乙方安全公司的2年_关于杀毒软件和远控的斗争
    文件删除的windows下面的三种路径(轻量级)
  • 原文地址:https://www.cnblogs.com/lann/p/1526194.html
Copyright © 2011-2022 走看看