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 <> '' 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;
CREATE OR REPLACE
PROCEDURE "KX_LIST_FROMSTORE_ADD_ITEM"(IN_ORDER_ID NVARCHAR2,
OU_TEMP OUT SYS_REFCURSOR) IS
/*订单转交货的时候用来获取订单行项目带到交货单编辑界面的存储过程*/ BEGIN
OPEN OU_TEMP FOR
SELECT DISTINCT A.DETAILID,
A.ORDERID,
A.PRODUCTID,
PI2.BARCODE,
PI1.PRODUCTNAME,
PI1.PRODUCTCODE,
PI1.SPEC,
A.UNITID,
UI.UNITNAME,
SNUM(A.DETAILID, A.SEQ) AS QUANTITY,
A.DISCOUNT,
KX_GET_FORMATNUMBER(A.UNITPRICE) UNITPRICE,
A.TAXRATE,
CASE ORDERTYPE
WHEN 'SH01' THEN
DECODE(A.PRODUCTTYPE,
'TA01',
KX_GET_FORMATNUMBER(A.PRODUCTMONEY),
0)
ELSE
KX_GET_FORMATNUMBER(A.PRODUCTMONEY)
END AS PRODUCTMONEY,
A.TAXMONEY,
KX_GET_FORMATNUMBER(A.PAYABLEMONEY) PAYABLEMONEY,
A.ISGIVEAWAY,
A.DETAILID AS COLGUID,
A.PARENTGUID,
A.ORDERID AS VGBEL,
A.SEQ AS VGPOS,
A.ORDERID AS RELEVANCEORDER,
A.MEMO,
A.CHARG,
O.STOREID,
O.SERVICEP,
O.MEMO AS ORDERMEMO,
O.PAYTYPE,
O.TOTALMONEY,
KX_GET_FORMATNUMBER(PI2.SALEPRICE) AS INITUNITPRICE,
A.SEQ,
A.QUANTITY AS ORDERQUANTITY,
(SELECT P.TEXTVALUE
FROM DATAPARAMETER P
WHERE P.CODE = A.PRODUCTTYPE
AND P.PARAMETERTYPE = 'ProductType') AS PRODUCTTYPE,
--KX_GET_DO_COUNT(a.PRODUCTID, a.UNITID, a.SURPLUSQUANTITY) as OutQuantity1,
FUN_HASORDER(A.PRODUCTID,
A.ORDERID,
'XXX',
A.UNITID,
A.SEQ) AS OUTQUANTITY
FROM SALEORDERDETAIL A
LEFT JOIN SALEORDER O
ON A.ORDERID = O.ORDERID
LEFT JOIN CUSTOMERINFO C
ON C.CUSTOMERID = O.CUSTOMERID
LEFT JOIN PRODUCTINFO PI1
ON A.PRODUCTID = PI1.PRODUCTID
LEFT JOIN PRODUCTPRICE PI2
ON A.PRODUCTID = PI2.PRODUCTID
AND PI2.UNITID = A.UNITID
AND PI2.CUSTOMERTYPE2 = C.CUSTOMERTYPE2
LEFT JOIN UNITINFO UI
ON A.UNITID = UI.UNITID
WHERE A.ORDERID = IN_ORDER_ID
AND A.CLOSEDESC = ''
AND A.STATUS <> 'C'
ORDER BY A.SEQ ASC;
KX_HISTORY_LOG(IN_ORDER_ID, '', '订单'||IN_ORDER_ID||'转交货', 'M');
END;

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

  1. oracle 存储过程

    来自:http://www.jb51.net/article/31805.htm Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 I ...

  2. Oracle存储过程语法

    原文链接:http://www.jb51.net/article/31805.htm Oracle存储过程基本语法 存储过程  1 CREATE OR REPLACE PROCEDURE 存储过程名  ...

  3. ORACLE存储过程调用Web Service

    1. 概述 最近在ESB项目中,客户在各个系统之间的服务调用大多都是在oracle存储过程中进行的,本文就oracle存储过程调用web service来进行说明.其他主流数据库,比如mysql和sq ...

  4. Oracle存储过程基本语法介绍

    Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR RE ...

  5. MyBatis调用Oracle存储过程

    MyBatis调用Oracle存储过程 1.无输入和输出参数的存储过程 2.带有输入和输出参数的存储过程 3.返回游标的存储过程 mybatis中的配置文件代码 <resultMap type= ...

  6. Oracle存储过程(转)

    Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR RE ...

  7. Oracle存储过程中异常Exception的捕捉和处理

    Oracle存储过程中异常的捕捉和处理 CREATE OR REPLACE Procedure Proc_error_process ( v_IN in Varchar2, v_OUT Out Var ...

  8. Oracle存储过程动态创建临时表/存储过程执行权限问题--AUTHID CURRENT_USER

    关于Oracle存储过程执行权限问题的解决 http://blog.sina.com.cn/s/blog_6ceed3280101hvlo.html (2014-04-02 04:06:28) 转载▼ ...

  9. ORACLE存储过程学习

    存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR REPLACE PROCEDURE ...

  10. C# 获取 oracle 存储过程的 返回值1

    /// <summary> /// 返回对应表的模拟自增字段值 /// </summary> /// <param name="tablename"& ...

随机推荐

  1. Hibernate -- 配置c3p0连接池, 事务隔离级别, 管理session

    知识点1:配置c3p0连接池(了解) * 引入c3p0-0.9.1.jar * 在hibernate.cfg.xml文件中增加如下配置 <!-- C3P0连接池设定--> <!-- ...

  2. RabbitMQ 之 WorkQueues工作队列

    模型图 为什么会出现 work queues? 前提:使用 simple 队列的时候 (上一篇博客)我们应用程序在是使用消息系统的时候,一般生产者 P 生产消息是毫不费力的(发送消息即可),而消费者接 ...

  3. scala学习手记8 - 自适应的默认做法

    scala有一些默认做法,会让代码更简洁.更易读写,下面列出了这样几个特性: 1. 支持脚本.scala支持脚本,因此无须将所有的代码都放到类里.如果脚本可以满足需求,就将代码放到一个脚本里,无须再创 ...

  4. Java_io__BIO_NIO_AIO

    1. http://stevex.blog.51cto.com/4300375/1284437 http://www.cnblogs.com/zhuYears/archive/2012/09/28/2 ...

  5. vue 时间格式化

    export function formatDate(date, fmt) { if (/(y+)/.test(fmt)) { fmt = fmt.replace(RegExp.$1, (date.g ...

  6. 蓝盾第三代AI防火墙分析

    蓝盾第三代AI防火墙是国内首个“AI-Enabled”的防火墙.有别于市场上第一代特征识别.第二代应用识别防火墙.传统安全网关,需要依赖于签名和特征库技术对威胁进行检查,效率较低且存在大量误报漏报,特 ...

  7. Database项目中关于Procedure sp_refreshsqlmodule_internal的错误

    最近项目中发现一怪问题,使用DB项目发布数据库时,总提示 “(110,1): SQL72014: .Net SqlClient Data Provider: Msg 1222, Level 16, S ...

  8. $fn、$extends $fn.extends的用法,jquery的插件开发

    原文链接:http://caibaojian.com/jquery-extend-and-jquery-fn-extend.html Query.fn.extend(); jQuery.extend( ...

  9. New Concept English three (36)

    21 54 We are less credulous than we used to be. In the nineteenth century, a novelist would bring hi ...

  10. poscms仿站知识点总结(二)

    1.相同类型div添加不同class 遇到一个样式上的问题,模板页面有8个子项,样式都是一样,至于数据是可以用for循环来添加的,但是for循环的时候,每个div的 类名是无法及时更改的,但是模板页面 ...