ITPub博客

首页 > Linux操作系统 > Linux操作系统 > oracle动态sql存储过程示例

oracle动态sql存储过程示例

原创 Linux操作系统 作者:wisdomone1 时间:2012-10-26 12:58:18 0 删除 编辑
create or replace procedure p_deal_order_complete_info(
                                                       V_ORDER_ID           IN DEAL_ORDER.ORDER_ID%TYPE, --订单ID
                                                       V_ORDER_TYPE         IN DEAL_ORDER.ORDER_TYPE%TYPE, --订单类型
                                                       V_prov_code          IN DEAL_ORDER.Prov_Code%TYPE, --省编码
                                                       V_city_code          IN DEAL_ORDER.city_code%TYPE, --市编码
                                                       V_order_status       IN DEAL_ORDER.order_status%TYPE, --订单状态
                                                       V_channel_id         IN DEAL_ORDER.channel_id%TYPE, --渠道
                                                       V_begin_date         IN DEAL_ORDER.Create_Date%TYPE, --创建时间From (DATE)
                                                       V_end_date           IN DEAL_ORDER.Create_Date%TYPE, --创建时间To (DATE)
                                                       v_syscursor          out sys_refcursor
                                                       )
is
/* 过程、函数简要描述信息
    **********************************************************
    *  存储过程名  : p_deal_order_complete_info
    *  建立日期      : 2012-10-26
    *  作者              : abc
    *  模块              : 交易管理
    *  功能描述      : 导出订单信息
    *  输入参数      : 订单ID
                        订单类型
                        地区
                        订单状态
                        渠道
                        创建时间From (DATE)
                        创建时间To (DATE)
    *
    *
    *  输出参数      :<订单ID  --订单表
                       订单类型
                       地区
                       订单状态
                       金额
                       渠道
                       创建时间
                       备注
                       客户名称 -- 用户管理表,通过订单表的用户id,与此表关联,可以得到客户名称和身份证号码
                       身份证号码
                       账户名称
                      
                       支付方式 --付款信息,通过订单表的付款id与此表关联,可以得到此
                       收货人
                       联系号码
                       手机号码
                       物流公司   --不知源于哪个表
                       物流编号  --源于哪个表啊,订单表的
                       送货人 --不知是哪个表
                       送货人联系电话 --同上
                      
                       订单明细ID  --订单明细表
                       销售品ID
                       销售品名称
                       销售品类型
                       价格
                       数量
                      
                       选择项ID  --订单用户选择记录表 ,通过订明明细id与订明明细表关联
                       选择项类型
                       选择项名称>集合
    *  源表:         DEAL_ORDER 订单表
    *  目标表:
    *  备注:
                        ①字符类型入参为空时,不做为查询条件。
                          数值类型入参为-1时,不做为查询条件。
                        ②订单ID、地区提供模糊查询功能。
    *------------------------------------------------------------
    *  修改历史
    *  序号    日期              修改人      修改原因
    *  1       2012-10-26        abc      创建
    *------------------------------------------------------------
  */
  v_sql      varchar2(5000);
  V_PAR_DATE VARCHAR2(30); -- 操作日期
  V_PRO_NAME VARCHAR2(40); -- 存储过程名
  V_ERR_CODE VARCHAR2(50); -- 错误代码
  V_ERR_MSG  VARCHAR2(3000); -- 错误信息
begin
  V_ERR_MSG  := '游标初始化失败';
  V_PRO_NAME := 'p_deal_order_complete_info';
  V_PAR_DATE := TO_CHAR(SYSDATE, 'YYYY-MM-DD HH:MM:SS');
  PLOG.INFO(V_PRO_NAME, '开始运行,日期: ' || V_PAR_DATE);
  --主体逻辑
     --若无任何参数
    if V_ORDER_ID is null and V_ORDER_TYPE is null and
       V_prov_code is null and V_city_code is null and V_order_status is null and
       V_channel_id is null and V_begin_date is null and V_end_date is null then
              open v_syscursor for 'select d.order_id,d.order_type,
                                           d.Prov_Code,d.city_code,
                                           d.order_status,d.ORDER_PRICE,
                                           d.channel_id,d.CREATE_DATE,
                                           d.ORDER_REMARK,uinfo.REALNAME,
                                           uinfo.CARDNUM,uinfo.username,
                                           dpay.PAY_TYPE,dpay.SEND_CUSNAME,
                                           dpay.SEND_CUSTELNUM,dpay.SEND_CUSMOBILE,
                                           de.ORDER_DETAIL_ID,
                                           de.OFFER_ID,de.OFFER_TITLE,
                                           de.OFFER_TYPE,de.PRICE,
                                           de.QTY,dc.CHOOSE_ID,
                                           dc.CHOOSE_TYPE,dc.CHOOSE_NAME
                                          
                                          
                                    from DEAL_ORDER d,
                                         DEAL_ORDER_DETAIL de,
                                         DEAL_ORDER_USER_CHOOSE dc
                                         DEAL_PAY_INFO dpay,
                                         USER_INFO uinfo
                                    where d.order_id=de.order_id               and
                                          de.ORDER_DETAIL_ID=dc.ORDER_DETAILID and 
                                          d.PAY_ID=dpay.PAY_ID                 and
                                          d.USER_ID=uinfo.USERID';
 else
        --如下的sql刚开始一直编译不通过,后来把此sql单拿出为到ue,然后再复制回来即可,我想可能是什么特殊字符导致不能编译通过,还有一法,就是把如下的sql慢慢接着步步测试,直到完成测试成功
     v_sql :='select                       d.order_id,d.order_type,
                                           d.Prov_Code,d.city_code,
                                           d.order_status,d.ORDER_PRICE,
                                           d.channel_id,d.CREATE_DATE,
                                           d.ORDER_REMARK,uinfo.REALNAME,
                                           uinfo.CARDNUM,uinfo.username,
                                           dpay.PAY_TYPE,dpay.SEND_CUSNAME,
                                           dpay.SEND_CUSTELNUM,dpay.SEND_CUSMOBILE,
                                           de.ORDER_DETAIL_ID,
                                           de.OFFER_ID,de.OFFER_TITLE,
                                           de.OFFER_TYPE,de.PRICE,
                                           de.QTY,dc.CHOOSE_ID,
                                           dc.CHOOSE_TYPE,dc.CHOOSE_NAME
                                    from DEAL_ORDER d,
                                         DEAL_ORDER_DETAIL de,
                                         DEAL_ORDER_USER_CHOOSE dc
                                         DEAL_PAY_INFO dpay,
                                         USER_INFO uinfo
                                    where d.order_id=de.order_id               and
                                          de.ORDER_DETAIL_ID=dc.ORDER_DETAILID and 
                                          d.PAY_ID=dpay.PAY_ID                 and
                                          d.USER_ID=uinfo.USERID and ';
                               
    
  --判断是否输入店铺ID
      --判断是否输入订单ID
      if V_ORDER_ID is not null then
        v_sql := v_sql || ' d.ORDER_ID like '||chr(39)||'%'|| V_ORDER_ID ||'%'||chr(39)||' and ';
      end if;
      --判断是否输入订单类型
      if V_ORDER_TYPE is not null then
        v_sql := v_sql || 'd.ORDER_TYPE=' || V_ORDER_TYPE || ' and ';
      end if;
      --判断是否输入省编码
      if V_prov_code is not null then
        v_sql := v_sql || 'd.Prov_Code=' ||chr(39)||V_prov_code ||chr(39)|| ' and ';
      end if;
      --判断是否输入市编码
      if V_city_code is not null then
        v_sql := v_sql || 'd.city_code=' || chr(39)||V_city_code ||chr(39)|| ' and ';
      end if;
      --判断是否输入订单状态
      if V_order_status is not null then
        v_sql := v_sql || 'd.order_status=' ||chr(39)|| V_order_status||chr(39)||' and ';
      end if;
      --判断是否输入渠道
      if V_channel_id is not null then
        v_sql := v_sql || 'd.channel_id=' ||chr(39)||V_channel_id||chr(39)|| ' and ';
      end if;
      --判断是否输入创建时间From
      if V_begin_date is not null then
        v_sql := v_sql || 'd.Create_Date >=  ' || V_begin_date || ' and ';
      end if;
      --判断是否输入创建时间To
      if V_end_date is not null then
        v_sql := v_sql || 'd.Create_Date <= ' || V_end_date || ' and ';
      end if;
     --and 1=1非常好,我之前是没有想到,我哪个招还要把最后的and用substr截掉,这个就不用了,很好,以为备记
      v_sql    := v_sql || 'and 1=1';
  open v_syscursor for v_sql;
 end if;
 
  V_ERR_MSG := V_PRO_NAME || '游标打开失败 ';
  PLOG.INFO(V_PRO_NAME, '过程结束,结束日期: ' || V_PAR_DATE);
  /*数据异常记录信息后回滚*/
EXCEPTION
  WHEN OTHERS THEN
    ROLLBACK;
    V_ERR_CODE := SQLCODE;
    PLOG.ERROR(V_PRO_NAME, V_ERR_CODE, V_ERR_MSG || '  ' || SQLERRM);
end p_deal_order_complete_info;
 

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/9240380/viewspace-747282/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: oracle exp_imp小记
请登录后发表评论 登录
全部评论
提供针对oracle初学者及进阶的数据库培训,欢迎大家咨询: 微信: wisdomone 微信公众号: lovedb 工作经历: 中国普天 北京科蓝 北京云和恩墨 北京神州新桥

注册时间:2008-04-04

  • 博文量
    2189
  • 访问量
    12690141