Oracle存储过程使用总结

1.使用Oracle存储过程查询结果集:

网上写的都是他妈的扯淡!其实一句话就行了,你只要返回一个游标就OK了。具体代码如下:

CREATE OR REPLACE
PROCEDURE PR_ORDER_LIST(
    ORDER_ID VARCHAR2,
    BEGINDATE VARCHAR2,
    ENDDATE VARCHAR2,
    CUSTOMER VARCHAR2,
    STATUS VARCHAR2,
    V_TEMP out sys_refcursor
)
IS
SQLTEXT VARCHAR2(4000);
BEGIN 

SQLTEXT := ‘select s.OrderId,c.CustomerName,s.SendAddress,p.TextValue as BussinessStatus,
NVL(s.UpdateT,s.InsertT) as OrderDate from SaleOrder s
LEFT JOIN CustomerInfo c on s.CustomerId = c.CustomerId and c.CustomerType = ‘‘C‘‘
LEFT JOIN DataParameter p on s.BussinessStatus = p.Code and p.ParameterType = ‘‘BussinessStatus‘‘
where to_char(NVL(s.UpdateT,s.InsertT),‘‘yyyyMMdd‘‘) between ‘‘‘||BEGINDATE||‘‘‘ and ‘‘‘||ENDDATE||‘‘‘ ‘;

IF ORDER_ID <> ‘‘ THEN

SQLTEXT := SQLTEXT || ‘ and s.OrderId like ‘‘%‘||ORDER_ID||‘%‘‘‘;

END IF;

IF CUSTOMER <> ‘‘ THEN

SQLTEXT := SQLTEXT || ‘ and s.CustomerId = ‘||to_number(CUSTOMER);

END IF;

IF STATUS <> ‘‘ and STATUS <> ‘0‘ THEN

SQLTEXT := SQLTEXT || ‘ and s.BussinessStatus in (‘||STATUS||‘)‘;

END IF;

SQLTEXT := SQLTEXT || ‘ order by NVL(s.UpdateT,s.InsertT) desc‘;
dbms_output.put_line(SQLTEXT);           --这个是打印
--execute immediate SQLTEXT;     这个是动态执行sql,写游标可以不用这个,用下面那个
--如果要往变量里面注入值,需要使用上面这个
open V_TEMP FOR SQLTEXT;  --彺游标里面注入值 ,这里是注入了一个sql字符串

END;

2.然后就是包的定义,包就相当于C#里面的类,可以封装类型、方法等等。

3.C#程序段使用方法:

/// <summary>
        /// 订单列表
        /// </summary>
        /// <param name="begin"></param>
        /// <param name="end"></param>
        /// <param name="orderid"></param>
        /// <param name="customer"></param>
        /// <param name="status"></param>
        /// <returns></returns>
        public DataTable SaleOrderList(string begin, string end, string orderid, string customer, string status)
        {
            DBManager vDBManager = new DBManager();
            vDBManager.ConnectionOpen();
            vDBManager.AddParameter(":begin", begin);
            vDBManager.AddParameter(":end", end);
            vDBManager.AddParameter(":orderid", orderid);
            vDBManager.AddParameter(":customer", customer);
            vDBManager.AddParameter(":status", status);
            vDBManager.AddOutParameter("V_TEMP", null);             //这里注意,一定要是out类型的参数
            DataTable dt = vDBManager.RunProcedure("PR_ORDER_LIST", "table1");
            vDBManager.ConnectionClose();
            return dt;
        }
/// <summary>
        /// 添加输出参数
        /// </summary>
        /// <param name="key"></param>
        /// <param name="value"></param>
        public void AddOutParameter(string key, object value)
        {
            command.Parameters.Add(new OracleParameter(key, OracleType.Cursor)).Direction = ParameterDirection.Output;
        }

        /// <summary>
        /// 执行存储过程
        /// </summary>
        /// <param name="storedProcName">过程名</param>
        /// <param name="parameters">参数</param>
        /// <param name="tableName">表名</param>
        /// <returns></returns>
        public DataSet ExecuteProcName(string storedProcName, string tableName)
        {
            using (OracleDataAdapter adapter = new OracleDataAdapter())
            {
                DataSet ds = new DataSet();
                adapter.SelectCommand = BuildQueryCommand(storedProcName);
                adapter.Fill(ds, tableName);
                command.Parameters.Clear();
                return ds;
            }
        }

另外,这个是游标的使用方法:

CREATE OR REPLACE
PROCEDURE PR_MOD_BASE
IS

cursor c_base IS
SELECT MIN(INVENTORY_DATE) IDATE,KUNNR,MATNR FROM STOCK_BASE_DATA GROUP BY TO_CHAR(INVENTORY_DATE,‘yyyy-MM-dd‘),
KUNNR,MATNR HAVING count(*) > 1;

c_row c_base%rowtype;

BEGIN

FOR c_row in c_base loop
        DELETE FROM STOCK_BASE_DATA WHERE INVENTORY_DATE = c_row.IDATE and KUNNR = c_row.KUNNR and MATNR = c_row.MATNR;
end loop;
COMMIT;
END;
时间: 2024-08-29 20:14:36

Oracle存储过程使用总结的相关文章

oracle存储过程实例

oracle存储过程实例 分类: 数据(仓)库及处理 2010-05-03 17:15 1055人阅读 评论(2)收藏 举报 认识存储过程和函数 存储过程和函数也是一种PL/SQL块,是存入数据库的PL/SQL块.但存储过程和函数不同于已经介绍过的PL/SQL程序,我们通常把PL/SQL程序称为无名块,而存储过程和函数是以命名的方式存储于数据库中的.和PL/SQL程序相比,存储过程有非常多长处,详细归纳例如以下: * 存储过程和函数以命名的数据库对象形式存储于数据库其中.存储在数据库中的长处是非

java怎样将一组对象传入Oracle存储过程

java怎样将一组对象传入Oracle存储过程.须要注意的是jar包是有要求的,假设使用不当会导致仅仅有数字能传过去,字符串传只是去.假设是Oracle11g则须要选用例如以下的jar包,F:\app\Administrator\product\11.2.0\dbhome_1\jlib\orai18n.jar. D:\program\weblogic\oracle_common\modules\oracle.jdbc_11.2.0\ojdbc6.jar 样例例如以下: CREATE OR REP

springMVC + oracle存储过程 构建高性能灵活易维护的java web架构

MVC让简单的业务也变得复杂 不知道你在使用MVC模式开发项目的时候是否觉得很麻烦,一个简单的增删改查动作却要涉及到多个文件操作. 以一条数据增加为例说明. 假设我们使用hibernate并且dao层是已经封装好的 从图中可以看出如果我们在系统中写一个增加功能需要自己动手写的地方至少是 jsp , action , service,servicesImpl 四层. 如果是复杂的添加操作那么我们很可能还会自己定义dao层的接口和方法,那样就是6层操作了. 如果使用mybatis 至少也是写4层,常

Oracle 存储过程

存储过程:就是一组用于完成特定数据库功能的SQL 语句集,该SQL语句集经过编译后存储在数据库系统中.在使用时候,用户通过指定已经定义的存储过程名字并给出相应的存储过程参数来调用并执行它,从而完成一个或一系列的数据库操作. Oracle存储过程包含三部分:过程声明,执行过程部分,存储过程异常. 1 create or replace procedure 过程名 2 as ...; --声明语句段 3 begin 4 ...; --执行语句段 5 exception --异常处理语句段 6 ...

Oracle 存储过程定义和优点及与函数区别

定义: 存储过程(Stored Procedure )是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中.用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它.存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程. 存储过程是由流控制和SQL 语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,应用程序使用时只要调用即可.在ORACLE 中,若干个有联系的过程可以组合在一起构成程序包. 优 点: 1.(预编译)存储过程只在创造

jdbc调用 oracle 存储过程操作

创建有参存储函数findEmpNameAndSal(编号),查询7902号员工的的姓名和月薪,[返回多个值,演示out的用法]当返回2个或多个值,必须使用out符号当返回1个值,就无需out符号 create or replace function findEmpNameAndSal(pempno in number,pename out varchar2) return numberas psal emp.sal%type;begin select ename,sal into pename,

Oracle ——存储过程

1.带参数的存储过程CREATE OR REPLACE PROCEDURE sp_pro2 (spname VARCHAR2, newsal NUMBER) ISBEGIN     UPDATE emp SET sal = newsal WHERE ename=spname;END; --参数VARCHAR2不需要指定大小exec sp_pro2('SMITH',10);或者call sp_pro2('SMITH',10); Oracle --存储过程,布布扣,bubuko.com

面试概率极大的Oracle存储过程

1.什么是存储过程.存储过程是数据库服务器端的一段程序,它有两种类型.一种类似于SELECT查询,用于检索数据,检索到的数据能够以数据集的形式返回给客户.另一种类似于INSERT或DELETE查询,它不返回数据,只是执行一个动作.有的服务器允许同一个存储过程既可以返回数据又可以执行动作.2.什么时候需要用存储过程 如果服务器定义了存储过程,应当根据需要决定是否要用存储过程.存储过程通常是一些经常要执行的任务,这些任务往往是针对大量的记录而进行的.在服务器上执行存储过程,可以改善应用程序的性能.这

用java调用oracle存储过程总结(转)

//1.call+包名+存储过程名(传入.传出值用?) String str="{call SMSBUSINESS.deleteZhZMember(?,?,?)}"; //2.建立连接 Connection conn=null; conn=DriverManager.getConnection(); //3.使用java.sql.*类 CallableStatement cs=conn.prepareCall(str); //4.传入in值 cs.setInt(1,id); cs.se

Oracle存储过程的编写经验与优化措施

1.开发人员如果用到其他库的Table或View,务必在当前库中建立View来实现跨库操作,最好不要直接使用"databsevv.dbo.table_name",因为sp_depends不能显示出该SP所使用的跨库table或view,不方便校验. 2.开发人员在提交SP前,必须已经使用set showplan on分析过查询计划,做过自身的查询优化检查. 3.高程序运行效率,优化应用程序,在SP编写过程中应该注意以下几点: a) SQL的使用规范: i. 尽量避免大事务操作,慎用ho