oracle如何写包

一:如何使用FOR循环二:如何使用拼接语句 EXECUTE IMMEDIATE v_sql INTO v_WORK_ORDERID;三:如何定义记录类型做为变量,用于存储及查询
CREATE OR REPLACE PACKAGE pkg_GenerateReport_biz IS
  /*===============================================
  *   PROGRAM NAME: pkg_CSS_CUSTOMER_DELETE_SYNC_biz
  *
  *   DESCRIPTION: ??????????????????
  *
  *   HISTORY:
  *     1.00   2016-07-28  chenli Creation
  * ==============================================*/

  PROCEDURE main(P_INV_ORGID decimal);

END pkg_GenerateReport_biz;
/
CREATE OR REPLACE PACKAGE BODY pkg_GenerateReport_biz IS

  /* =============================================
  *   FUNCTION / PROCEDURE
  *   NAME :main
  *   DESCRIPTION:
                ??????????????
  *   ARGUMENT:
  *   RETURN:
  *
  *   HISTORY:
  *     1.00   2016-07-28  chenli   Creation
  * =============================================*/

  PROCEDURE main(P_INV_ORGID decimal) IS

    v_SQL                VARCHAR2(4000); --获取相关工单
    v_SQL_UPDATE_OFFLINE VARCHAR2(4000); --更新下线完数

    v_SYS_ROLES_CONFIG_row       SYS_ROLES_CONFIG%ROWTYPE; --系统配置项
    v_OQC_INSP_SAMPLE_RPT_row    OQC_INSP_SAMPLE_RPT%ROWTYPE; --抽检报告
    v_OQC_INSP_SAMPLE_RPT_SN_row OQC_INSP_SAMPLE_RPT_SN%rowtype;
    v_WORK_ORDERID               VARCHAR2(5000); --相关工单
    str_production_date_from     varchar2(50); --生产开始时间
    str_production_date_to       varchar2(50); --生产结束时间
  begin
    for v_rlt in (select *
                    from (select *
                            from oqc_inspection_sample s
                           where s.state = ‘A‘
                             AND S.status = ‘已检验‘
                             and s.is_v2 = ‘1‘
                             AND s.org_id = P_INV_ORGID
                           order by s.inspection_time desc)
                   where rownum <= 10) loop

      str_production_date_from := to_char(v_rlt.production_start_time,
                                          ‘yyyy-mm-dd hh24:mi:ss‘);
      str_production_date_to   := to_char(v_rlt.production_end_time,
                                          ‘yyyy-mm-dd hh24:mi:ss‘);

      select *
        INTO v_SYS_ROLES_CONFIG_row
        FROM SYS_ROLES_CONFIG c
       WHERE c.org_id = v_rlt.org_id
         AND c.state = ‘A‘;

      v_WORK_ORDERID := ‘‘;
      v_SQL          := ‘‘;
      v_SQL          := v_SQL ||
                        ‘SELECT wm_concat( DISTINCT(O.MO_NAME)) FROM OQC_MES_INF_UL_QMS_OFFLINE O WHERE O.ORG_ID = ‘ ||
                        P_INV_ORGID ||
                        ‘ AND O.DATETIME_OFFLINE>= to_date(‘‘‘ ||
                        str_production_date_from ||
                        ‘‘‘,‘‘yyyy-mm-dd hh24:mi:ss‘‘) AND O.DATETIME_OFFLINE<=to_date(‘‘‘ ||
                        str_production_date_to ||
                        ‘‘‘,‘‘yyyy-mm-dd hh24:mi:ss‘‘)‘;

      IF v_SYS_ROLES_CONFIG_row.Sys_Parms1 = ‘同生产工单‘ THEN

        v_SQL := v_SQL || ‘ and O.MO_NAME=‘‘‘ || v_rlt.WORK_ORDER_ID || ‘‘‘‘;

      elsif v_SYS_ROLES_CONFIG_row.Sys_Parms2 = ‘同物料编码‘ THEN

        v_SQL := v_SQL || ‘ and O.PRODUCT_CODE=‘‘‘ || v_rlt.PROD_ID || ‘‘‘‘;

      elsif v_SYS_ROLES_CONFIG_row.Sys_Parms3 = ‘同产品型号‘ THEN

        v_SQL := v_SQL || ‘ and O.PRODUCT_TYPE=‘‘‘ || v_rlt.PROD_MODEL_ID || ‘‘‘‘;

      elsif v_SYS_ROLES_CONFIG_row.Sys_Parms4 = ‘同产线‘ THEN
        v_SQL := v_SQL || ‘ and O.LINE_DESC=‘‘‘ || v_rlt.PRODUCTION_LINE || ‘‘‘‘;

      END IF;

      EXECUTE IMMEDIATE v_sql
        INTO v_WORK_ORDERID;

      v_OQC_INSP_SAMPLE_RPT_row.User_Created      := v_rlt.user_created;
      v_OQC_INSP_SAMPLE_RPT_row.Datetime_Created  := sysdate;
      v_OQC_INSP_SAMPLE_RPT_row.Inspection_No     := v_rlt.inspection_no;
      v_OQC_INSP_SAMPLE_RPT_row.Org_Id            := v_rlt.org_id;
      v_OQC_INSP_SAMPLE_RPT_row.Inspection_Result := v_rlt.inspection_result;
      v_OQC_INSP_SAMPLE_RPT_row.Workorderno       := v_WORK_ORDERID;
      v_OQC_INSP_SAMPLE_RPT_row.Ref_Sample_Id     := v_rlt.id;
      v_OQC_INSP_SAMPLE_RPT_row.Inspection_Type   := ‘抽检‘;
      v_OQC_INSP_SAMPLE_RPT_row.Id                := SYS_GUID();
      v_OQC_INSP_SAMPLE_RPT_row.State             := ‘A‘;

      if v_rlt.inspection_result = ‘合格‘ then
        v_OQC_INSP_SAMPLE_RPT_row.IS_UPDATE_MES := ‘Y‘;
      elsif v_rlt.inspection_result = ‘不合格‘ then
        v_OQC_INSP_SAMPLE_RPT_row.IS_UPDATE_MES := ‘N‘;
      END IF;
      --1、增加抽检报告表
      INSERT INTO OQC_INSP_SAMPLE_RPT VALUES v_OQC_INSP_SAMPLE_RPT_row; --插入抽检报告
      --2、插入抽检的条码
      for v_title in (select *
                        from oqc_base_standrad_title t
                       where t.baseamine_id = v_rlt.Id
                         and t.is_insepection_result = ‘1‘
                         and t.state = ‘A‘) loop
        v_OQC_INSP_SAMPLE_RPT_SN_row.Id               := sys_guid();
        v_OQC_INSP_SAMPLE_RPT_SN_row.Sn               := v_title.barcode;
        v_OQC_INSP_SAMPLE_RPT_SN_row.State            := ‘A‘;
        v_OQC_INSP_SAMPLE_RPT_SN_row.Datetime_Created := SYSDATE;
        v_OQC_INSP_SAMPLE_RPT_SN_row.Rpt_Id           := v_OQC_INSP_SAMPLE_RPT_row.Id;
        v_OQC_INSP_SAMPLE_RPT_SN_row.User_Created     := v_rlt.User_Created;
        INSERT INTO OQC_INSP_SAMPLE_RPT_SN
        VALUES v_OQC_INSP_SAMPLE_RPT_SN_row; --插入抽检报告

      end loop;
      --3、更新下线完工表
      v_SQL_UPDATE_OFFLINE := ‘‘;
      if v_rlt.inspection_result = ‘合格‘ then
        v_SQL_UPDATE_OFFLINE := v_SQL_UPDATE_OFFLINE ||
                                ‘update OQC_MES_INF_UL_QMS_OFFLINE O set
INSPECTION_RESULT=‘‘‘ ||
                                v_rlt.INSPECTION_RESULT ||
                                ‘‘‘,O.BATCH_INSPECTION_RESULT=‘‘‘ ||
                                v_rlt.INSPECTION_RESULT ||
                                ‘‘‘,O.BATCH_NO=‘‘‘ || v_rlt.INSPECTION_NO ||
                                ‘‘‘,O.BATCH_DATETIME_CREATED=sysdate where ORG_ID=‘ ||
                                v_rlt.ORG_ID;
      elsif v_rlt.inspection_result = ‘不合格‘ then
        v_SQL_UPDATE_OFFLINE := v_SQL_UPDATE_OFFLINE ||
                                ‘update OQC_MES_INF_UL_QMS_OFFLINE O set
O.BATCH_DATETIME_CREATED=sysdate where O.ORG_ID=‘ ||
                                v_rlt.ORG_ID;
      end if;

      v_SQL_UPDATE_OFFLINE := v_SQL_UPDATE_OFFLINE ||
                              ‘ AND O.DATETIME_OFFLINE>= to_date(‘‘‘ ||
                              str_production_date_from ||
                              ‘‘‘,‘‘yyyy-mm-dd hh24:mi:ss‘‘) AND O.DATETIME_OFFLINE<=to_date(‘‘‘ ||
                              str_production_date_to ||
                              ‘‘‘,‘‘yyyy-mm-dd hh24:mi:ss‘‘)‘;

      IF v_SYS_ROLES_CONFIG_row.Sys_Parms1 = ‘同生产工单‘ THEN

        v_SQL_UPDATE_OFFLINE := v_SQL_UPDATE_OFFLINE || ‘ and O.MO_NAME=‘‘‘ ||
                                v_rlt.WORK_ORDER_ID || ‘‘‘‘;

      elsif v_SYS_ROLES_CONFIG_row.Sys_Parms2 = ‘同物料编码‘ THEN

        v_SQL_UPDATE_OFFLINE := v_SQL_UPDATE_OFFLINE ||
                                ‘ and O.PRODUCT_CODE=‘‘‘ || v_rlt.PROD_ID || ‘‘‘‘;

      elsif v_SYS_ROLES_CONFIG_row.Sys_Parms3 = ‘同产品型号‘ THEN

        v_SQL_UPDATE_OFFLINE := v_SQL_UPDATE_OFFLINE ||
                                ‘ and O.PRODUCT_TYPE=‘‘‘ ||
                                v_rlt.PROD_MODEL_ID || ‘‘‘‘;

      elsif v_SYS_ROLES_CONFIG_row.Sys_Parms4 = ‘同产线‘ THEN
        v_SQL_UPDATE_OFFLINE := v_SQL_UPDATE_OFFLINE ||
                                ‘ and O.LINE_DESC=‘‘‘ ||
                                v_rlt.PRODUCTION_LINE || ‘‘‘‘;

      end if;
      EXECUTE IMMEDIATE v_SQL_UPDATE_OFFLINE;

      --4、更新抽检表 

      update oqc_inspection_sample s
         set s.is_inspector              = ‘1‘,
             s.status                    = ‘已生成报告‘,
             s.datetime_report_generated = sysdate,
             s.batch_no                  = v_rlt.inspection_no
       where s.id = v_rlt.id
         and s.org_id = v_rlt.org_id;
      commit; --最后提交
    end loop;

  end;

END pkg_GenerateReport_biz;
/

  

时间: 2024-09-05 06:58:45

oracle如何写包的相关文章

足球与oracle系列(5):fifa14游戏缺失的directX库类比于oracle的rpm包

***********************************************声明**********************************************  原创作品,出自 "深蓝的blog" 博客,欢迎转载,转载时请务必注明出处,否则追究版权法律责任. 表述有错误之处,请您留言或邮件([email protected])指明,不胜感激. 本文转载必须保留此处:http://blog.csdn.net/huangyanlong/article/det

ORACLE之UTL_FILE包详解

1 Utl_File包简介Oracle的UTL_FILE包用来实现对磁盘文件的I/O操作.(1)Oracle10g之前的版本需要指定utl_file包可以操作的目录.      方法:        1.alter system set utl_file_dir='e:/utl' scope=spfile;        2.在init.ora文件中,配置如下:UTL_FILE=E:/utl或者UTL_FILE_DIR=E:/utl;(2)Oracle10g之后的版本,只需要先创建一个路径即可.

Oracle 如何写出高效的 SQL

转自:Oracle 如何写出高效的 SQL 要想写出高效的SQL 语句需要掌握一些基本原则,如果你违反了这些原则,一般情况下SQL 的性能将会很差. 1. 减少数据库访问次数连接数据库是非常耗时的,虽然应用程序会采用连接池技术,但与数据库交互依然很耗时,这就要求我们尽量用一条语句干完所有的事,尤其要避免把SQL 语句写在循环中,如果你遇到这样的人,应该毫不犹豫给他两个耳光. 2. 避免在有索引的字段上使用函数在索引字段上使用函数会使索引失效,我们可以通过其他方式避免使用函数,如:尽量 避免在 S

oracle中utl_file包读写文件操作实例学习

在oracle中utl_file包提供了一些操作文本文件的函数和过程,学习了一下他的基本操作 1.创建directory,并给用户授权 复制代码 代码如下: --创建directory create or replace directory TESTFILE as '/home/oracle/zxx/test'; --给用户授权 grant read, write on directory TESTFILE to zxx; 详细介绍 http://download.oracle.com/docs

ORACLE的程序包不该忽视的东西

1.程序包就相当于JAVA中的类 2.程序包效率高的原因是:当程序首次调用包内函数或过程时,ORACLE将整个包调入内存,当再次访问包内元素时,ORACLE直接从内存中读取,而不需要进行磁盘I/O操作,从而使程序执行效率得到提高. 3.包有两部分组成 (1).包说明(规范)(PACKAGE SPECIFICATION):包说明部分声明包内数据类型.变量.常量.游标.子程序和异常错误处理等元素,这些元素为包的公有元素. (2).包体(PACKAGE BODY):包主体则是包定义部分的具体实现,它定

Oracle DBA管理包脚本系列(二)

该系列脚本结合日常工作,方便DBA做数据管理.迁移.同步等功能,以下为该系列的脚本,按照功能划分不同的包.功能有如下: 1)数据库对象管理(添加.修改.删除.禁用/启用.编译.去重复.闪回.文件读写.会话管理.表空用.用户/权限管理): 2)数据库分析: 3)数据库备份: 4)数据库同步: 5)数据库数据导出: 6)获取数据库对象源码: 7)数据库对比智能升级: ...... 更多功能请自行体验. 本系列包依赖于Oracle DBA管理包脚本系列系列(一)的脚本. EXEC PKG_DBMANA

Oracle数据库程序包全局变量的应用

1 前言  在程序实现过程中,经常用遇到一些全局变量或常数.在程序开发过程中,往往会将该变量或常数存储于临时表或前台程序的全局变量中,由此带来运行效率降低<频繁读取临时表>或安全隐患<存于前台程序变量,可跟踪内存变量获得>.  本文主要论述将全局变量或常数存取程序包的优点和实现方法.   2 优点  2.1 执行效率比存储于临时表高,不需要频率存取临时表  2.2 将全局变量藏于最后防线<数据库>,安全性较高  2.3 在视图中可以调用程序包的变量,实现动态视图   3

使用Oracle的DBMS_SQL包执行动态SQL语句

使用Oracle的DBMS_SQL包执行动态SQL语句 引用自:http://blog.csdn.net/ggjjzhzz/archive/2005/10/17/507880.aspx 引用自:http://www.cnblogs.com/simonhaninmelbourne/archive/2013/01/23/2872438.html 在某些场合下,存储过程或触发器里的SQL语句需要动态生成.Oracle的DBMS_SQL包可以用来执行动态SQL语句.本文通过一个简单的例子来展示如何利用D

将Oracle驱动jar包安装到本地Maven库

1.配置Maven环境变量: 变量名:MAVEN_HOME 变量值:E:\apache-maven-3.5.3(此处可根据maven位置而变化) 2.配置path:%MAVEN_HOME%\bin 3.在cmd中验证配置是否正确:mvn –version(若出现版本号则配置成功) 4.oracle自带有驱动jar包,以管理员身份打开cmd ,进入oracle驱动jar包所在的文件夹: 例如: C:\Oracle\product\11.2.0\dbhome_1\jdbc\lib 5.执行以下操作: