`
qq1988627
  • 浏览: 107275 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

创建存储过程

 
阅读更多
CREATE OR REPLACE PROCEDURE METERIAL.MATE_SCRAP_ACTION(
MESAGE  OUT TCURSOR.curvar_type,
VAR_FEEDNUM      IN VARCHAR2,
VAR_ITEMNAME     IN VARCHAR2,
VAR_FOLDADDRESS  IN VARCHAR2,
VAR_TOLOCATION   IN VARCHAR2,
VAR_SCRAPCOUNT   IN INTEGER,
VAR_UNIT         IN VARCHAR2,
VAR_ITEMMOMENT   IN VARCHAR2,
VAR_USERID       IN VARCHAR2,
VAR_USERNAME     IN VARCHAR2,
VAR_SCRAPREASON  IN VARCHAR2,
VAR_CREDENCENUM  IN VARCHAR2,
VAR_REAMRK       IN VARCHAR2,
VAR_STATE        IN VARCHAR2,
VAR_CLEARER      IN VARCHAR2,
VAR_ACTION       IN VARCHAR2
)
AS
VAE_REDATA     INTEGER;
VAR_COUNT      INTEGER;
VAR_EXIT       INTEGER;
VAR_ID1        INTEGER;
VAR_SQL        VARCHAR2(500);
ERROR_MESAGE   VARCHAR2(100);
VAR_TABLE      VARCHAR2(50);
VAR_OPACTION   VARCHAR2(50);
VAR_MOVECOUNT       MATE_LOCATION_INFO.MOVECOUNT%TYPE;
VAR_TEMPLOCKCOUNT   MATE_SUB_LOCATION_INFO.LOCKCOUNT%TYPE;
VAR_TEMPSTATE       MATE_LOCATION_SCRAP_INFO.STATE%TYPE;
VAR_TEMPSCRAPCOUNT  MATE_LOCATION_SCRAP_INFO.SCRAPCOUNT%TYPE;
VAR_MATERIAL_DESC   MATE_LOCATION_INFO.DEPICT%TYPE;
VAR_TEMPCREDENCENUM MATE_LOCATION_SCRAP_INFO.CREDENCENUM%TYPE;
VAR_TEMPFEEDNUM     MATE_LOCATION_SCRAP_INFO.FEEDNUM%TYPE;
VAR_QUALITYSTATE    VARCHAR2(50);
ERAISE         EXCEPTION;
BEGIN

/*
   state 状态 ‘1’ : 代表建立报废申请
              ‘2’ : 代表报废申请退回
              ‘0’ : 代表报废申请核准
*/

/* 申请报废 */
IF VAR_ACTION='0010' THEN
       VAR_TABLE:='MATE_LOCATION_SCRAP_INFO';
        VAR_OPACTION:='报废处理';
        VAE_REDATA:=DATACHECK(VAR_FEEDNUM,VAR_UNIT,VAR_ITEMNAME,VAR_TOLOCATION,VAR_ITEMMOMENT,VAR_TABLE,VAR_USERNAME,VAR_OPACTION);
        IF VAE_REDATA<=0 THEN
           ERROR_MESAGE:=VAR_FEEDNUM||' 相关数据核实有误';
           VAE_REDATA:=GETLOG(ERROR_MESAGE,VAR_USERID,VAR_OPACTION,VAR_TABLE);
           goto re_point;
        END IF;

   select COUNT(*) INTO VAR_COUNT from MATE_LOCATION_SCRAP_INFO WHERE CREDENCENUM=VAR_CREDENCENUM;
    IF VAR_COUNT>0 THEN
       ERROR_MESAGE:=VAR_FEEDNUM||' 操作失败,凭证号已存在,请重新生成';
       VAE_REDATA:=GETLOG(ERROR_MESAGE,VAR_USERNAME,VAR_OPACTION,VAR_TABLE);
       goto re_point;
    END IF;
    SELECT COUNT(*) INTO VAR_COUNT FROM MATE_LOCATION_INFO
       WHERE FEEDNUM=VAR_FEEDNUM
         AND ITEMNAME=VAR_ITEMNAME
         AND FOLDADDRESS=VAR_FOLDADDRESS
         --AND (instr(TOLOCATION,'报废品')>0 or TOLOCATION='报废品库')
         AND TOLOCATION=VAR_TOLOCATION
         AND STATE='0';
    begin
        select sum(to_number(lockcount)) into VAR_TEMPLOCKCOUNT from MATE_SUB_LOCATION_INFO
           WHERE FEEDNUM=VAR_FEEDNUM
             AND ITEMNAME=VAR_ITEMNAME
             AND FOLDADDRESS=VAR_FOLDADDRESS
             AND TOLOCATION=VAR_TOLOCATION
             group by FEEDNUM,ITEMNAME,FOLDADDRESS,TOLOCATION ;
    exception
        when others then
            VAR_TEMPLOCKCOUNT:='0';
    end;


    IF VAR_COUNT<=0 THEN
       ERROR_MESAGE:=VAR_FEEDNUM||' 操作失败,没有对应库存,';
       VAE_REDATA:=GETLOG(ERROR_MESAGE,VAR_USERNAME,VAR_OPACTION,VAR_TABLE);
       goto re_point;
    END IF;

    ERROR_MESAGE:=VAR_FEEDNUM||' 操作失败,没有得到报废库存';
    SELECT MOVECOUNT,DEPICT  INTO VAR_MOVECOUNT ,VAR_MATERIAL_DESC FROM MATE_LOCATION_INFO
       WHERE FEEDNUM=VAR_FEEDNUM
         AND ITEMNAME=VAR_ITEMNAME
         AND FOLDADDRESS=VAR_FOLDADDRESS
         --AND (instr(TOLOCATION,'报废品')>0 or TOLOCATION='报废品库')
         AND TOLOCATION=VAR_TOLOCATION
         AND STATE='0';

    VAR_EXIT:=TO_NUMBER(VAR_MOVECOUNT)-VAR_SCRAPCOUNT-TO_NUMBER(VAR_TEMPLOCKCOUNT);

    IF VAR_EXIT<0 THEN
       ERROR_MESAGE:=VAR_FEEDNUM||' 操作失败,报废数量不能超过库存数量,';
       VAE_REDATA:=GETLOG(ERROR_MESAGE,VAR_USERNAME,VAR_OPACTION,VAR_TABLE);
       goto re_point;
    END IF;

   select count(*) into VAR_COUNT from mate_sub_location_info
    where FEEDNUM=VAR_FEEDNUM
    AND ITEMNAME=VAR_ITEMNAME
    AND FOLDADDRESS=VAR_FOLDADDRESS
    AND CREDENCENUM=VAR_CREDENCENUM;

    SELECT MATE_LOCATION_SCRAP_INFO_S.nextval INTO VAR_ID1 FROM DUAL;

    IF VAR_COUNT>0 THEN
       ERROR_MESAGE:=VAR_FEEDNUM||' 更新表mate_sub_location_info失败';
       UPDATE mate_sub_location_info SET MOVECOUNT=TO_NUMBER(MOVECOUNT)+VAR_SCRAPCOUNT,LOCKCOUNT=TO_NUMBER(LOCKCOUNT)+VAR_SCRAPCOUNT
            where FEEDNUM=VAR_FEEDNUM
            AND ITEMNAME=VAR_ITEMNAME
            AND FOLDADDRESS=VAR_FOLDADDRESS
            AND CREDENCENUM=VAR_CREDENCENUM;
    ELSE
        IF INSTR(VAR_TOLOCATION,'报废品')>0 THEN
           VAR_QUALITYSTATE:='报废品';
        ELSIF  INSTR(VAR_TOLOCATION,'不良品')>0 THEN
           VAR_QUALITYSTATE:='不良品';
        ELSE
           VAR_QUALITYSTATE:='良品';
        END IF;
        ERROR_MESAGE:=VAR_FEEDNUM||' 插入表mate_sub_location_info失败';
        INSERT INTO mate_sub_location_info
        SELECT VAR_ID1,LTRIM(RTRIM(VAR_FEEDNUM)),LTRIM(RTRIM(VAR_ITEMNAME)),LTRIM(RTRIM(VAR_FOLDADDRESS)),'',LTRIM(RTRIM(VAR_TOLOCATION)),
                            VAR_SCRAPCOUNT,VAR_SCRAPCOUNT,VAR_UNIT,VAR_USERID,VAR_USERNAME,
                            sysdate,VAR_CREDENCENUM,
                            VAR_QUALITYSTATE,'','',''
                            FROM DUAL;
    END IF;

    ERROR_MESAGE:=VAR_FEEDNUM||' 插入表MATE_LOCATION_SCRAP_INFO失败';
    INSERT INTO MATE_LOCATION_SCRAP_INFO
    SELECT VAR_ID1,
           LTRIM(RTRIM(VAR_FEEDNUM)),LTRIM(RTRIM(VAR_ITEMNAME)),LTRIM(RTRIM(VAR_FOLDADDRESS)),LTRIM(RTRIM(VAR_TOLOCATION)),
           VAR_SCRAPCOUNT,VAR_UNIT,VAR_ITEMMOMENT,VAR_USERID,
          VAR_USERNAME,VAR_SCRAPREASON,SYSDATE,VAR_CREDENCENUM,
         VAR_REAMRK,VAR_STATE,VAR_MATERIAL_DESC,VAR_CLEARER FROM DUAL;

     ERROR_MESAGE:=VAR_FEEDNUM||' 操作,申请报废成功';
     VAE_REDATA:=GETLOG(ERROR_MESAGE,VAR_USERNAME,VAR_OPACTION,VAR_TABLE);
END IF;

/* 报废处理 核准*/
IF VAR_ACTION='0020' THEN
   VAR_TABLE:='MATE_LOCATION_SCRAP_INFO';
   VAR_OPACTION:='报废处理核准';

   ERROR_MESAGE:=VAR_CREDENCENUM||' 操作失败,该凭证号已有申请';
   select STATE,FEEDNUM INTO VAR_TEMPSTATE,VAR_TEMPFEEDNUM from MATE_LOCATION_SCRAP_INFO where CREDENCENUM=VAR_CREDENCENUM;

   IF VAR_TEMPSTATE='0' THEN
       ERROR_MESAGE:=VAR_TEMPFEEDNUM||' 操作失败,已经退回或核准';
       VAE_REDATA:=GETLOG(ERROR_MESAGE,VAR_USERNAME,VAR_OPACTION,VAR_TABLE);
       goto re_point;
   else
      select SCRAPCOUNT INTO VAR_TEMPSCRAPCOUNT from MATE_LOCATION_SCRAP_INFO where CREDENCENUM=VAR_CREDENCENUM and rownum<=1;
   END IF;

   select count(*) into VAR_COUNT from mate_location_info a
    where STATE='0'
      and exists(
             select * from MATE_LOCATION_SCRAP_INFO b
             where b.CREDENCENUM=VAR_CREDENCENUM
             and a.FEEDNUM=b.FEEDNUM
             and a.ITEMNAME=b.ITEMNAME
             and a.FOLDADDRESS=b.FOLDADDRESS
             and a.TOLOCATION=B.TOLOCATION
    );
    IF VAR_COUNT<=0 THEN
       ERROR_MESAGE:=VAR_TEMPFEEDNUM||'对应凭证号:'||VAR_CREDENCENUM||' 操作失败,没有库存无法核准';
       VAE_REDATA:=GETLOG(ERROR_MESAGE,VAR_USERNAME,VAR_OPACTION,VAR_TABLE);
       goto re_point;
    ELSE
      select MOVECOUNT into VAR_MOVECOUNT from mate_location_info a
            where STATE='0'
              and exists(
                     select * from MATE_LOCATION_SCRAP_INFO b
                     where b.CREDENCENUM=VAR_CREDENCENUM
                     and a.FEEDNUM=b.FEEDNUM
                     and a.ITEMNAME=b.ITEMNAME
                     and a.FOLDADDRESS=b.FOLDADDRESS
                     and a.TOLOCATION=B.TOLOCATION
            )AND ROWNUM<=1;
    END IF;

    ERROR_MESAGE:=VAR_TEMPFEEDNUM||'对应凭证号:'||VAR_CREDENCENUM||' 操作失败,得不到冻结数量';
    select lockcount into VAR_TEMPLOCKCOUNT from MATE_SUB_LOCATION_INFO where credencenum=VAR_CREDENCENUM;

    VAR_EXIT:=to_number(VAR_MOVECOUNT)-VAR_TEMPSCRAPCOUNT;

    ERROR_MESAGE:=VAR_TEMPFEEDNUM||'对应凭证号:'||VAR_CREDENCENUM||' 更新表mate_location_info失败';
    update mate_location_info a set a.MOVECOUNT=VAR_EXIT,a.STATE=DECODE(VAR_EXIT,0,'1','0')
    where a.STATE='0'
      and exists(
             select * from MATE_LOCATION_SCRAP_INFO b
             where b.CREDENCENUM=VAR_CREDENCENUM
             and a.FEEDNUM=b.FEEDNUM
             and a.ITEMNAME=b.ITEMNAME
             and a.FOLDADDRESS=b.FOLDADDRESS
             and a.TOLOCATION=B.TOLOCATION);
   IF (TO_NUMBER(VAR_TEMPLOCKCOUNT)-VAR_TEMPSCRAPCOUNT)<=0 THEN

        ERROR_MESAGE:=VAR_TEMPFEEDNUM||'对应凭证号:'||VAR_CREDENCENUM||' 删除表mate_sub_location_info失败';
          DELETE MATE_SUB_LOCATION_INFO
              where credencenum=VAR_CREDENCENUM;

   ELSE

        ERROR_MESAGE:=VAR_TEMPFEEDNUM||'对应凭证号:'||VAR_CREDENCENUM||' 更新表mate_sub_location_info失败';
        update mate_sub_location_info set MOVECOUNT=to_number(MOVECOUNT)-VAR_TEMPSCRAPCOUNT,LOCKCOUNT=TO_NUMBER(LOCKCOUNT)-VAR_TEMPSCRAPCOUNT
        where credencenum=VAR_CREDENCENUM;

   END IF;

     ERROR_MESAGE:=VAR_TEMPFEEDNUM||'对应凭证号:'||VAR_CREDENCENUM||' 更新表MATE_LOCATION_SCRAP_INFO失败';
    UPDATE MATE_LOCATION_SCRAP_INFO SET STATE='0',REAMRK=TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS')
             where CREDENCENUM=VAR_CREDENCENUM;

   ERROR_MESAGE:=VAR_CREDENCENUM||' 凭证号操作,核实报废成功';
   VAE_REDATA:=GETLOG(ERROR_MESAGE,VAR_USERNAME,VAR_OPACTION,VAR_TABLE);
END IF;

/* 报废处理 退回*/
IF VAR_ACTION='0030' THEN
   VAR_TABLE:='MATE_LOCATION_SCRAP_INFO';
   VAR_OPACTION:='报废处理退回';
   ERROR_MESAGE:=VAR_CREDENCENUM||' 操作失败,该凭证号已经存在多笔';
   select STATE,FEEDNUM INTO VAR_TEMPSTATE,VAR_TEMPFEEDNUM from MATE_LOCATION_SCRAP_INFO where CREDENCENUM=VAR_CREDENCENUM;

   IF VAR_TEMPSTATE='2' THEN
       ERROR_MESAGE:=VAR_TEMPFEEDNUM||'对应凭证号:'||VAR_CREDENCENUM||' 操作失败,已经退回';
       VAE_REDATA:=GETLOG(ERROR_MESAGE,VAR_USERNAME,VAR_OPACTION,VAR_TABLE);
       goto re_point;
   else
      select SCRAPCOUNT INTO VAR_TEMPSCRAPCOUNT from MATE_LOCATION_SCRAP_INFO where CREDENCENUM=VAR_CREDENCENUM and rownum<=1;
   END IF;

       ERROR_MESAGE:=VAR_TEMPFEEDNUM||'对应凭证号:'||VAR_CREDENCENUM||' 操作失败,得不到冻结数量';
    select lockcount into VAR_TEMPLOCKCOUNT from MATE_SUB_LOCATION_INFO where credencenum=VAR_CREDENCENUM;

  IF (TO_NUMBER(VAR_TEMPLOCKCOUNT)-VAR_TEMPSCRAPCOUNT)<=0 THEN

        ERROR_MESAGE:=VAR_TEMPFEEDNUM||'对应凭证号:'||VAR_CREDENCENUM||' 删除表mate_sub_location_info失败';
          DELETE MATE_SUB_LOCATION_INFO
              where credencenum=VAR_CREDENCENUM;
  ELSE
       ERROR_MESAGE:=VAR_TEMPFEEDNUM||'对应凭证号:'||VAR_CREDENCENUM||' 更新表mate_sub_location_info失败';
        update mate_sub_location_info a set MOVECOUNT=to_number(MOVECOUNT)-VAR_TEMPSCRAPCOUNT,LOCKCOUNT=TO_NUMBER(LOCKCOUNT)-VAR_TEMPSCRAPCOUNT
        where credencenum=VAR_CREDENCENUM;
  END IF;

     ERROR_MESAGE:=VAR_TEMPFEEDNUM||'对应凭证号:'||VAR_CREDENCENUM||' 更新表MATE_LOCATION_SCRAP_INFO失败';
    UPDATE MATE_LOCATION_SCRAP_INFO SET STATE='2',REAMRK=TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS')
             where CREDENCENUM=VAR_CREDENCENUM;
     ERROR_MESAGE:=VAR_TEMPFEEDNUM||'对应凭证号:'||VAR_CREDENCENUM||' 凭证号操作,撤销报废成功';
   VAE_REDATA:=GETLOG(ERROR_MESAGE,VAR_USERNAME,VAR_OPACTION,VAR_TABLE);
END IF;

ERROR_MESAGE:='OK';
<<re_point>>
COMMIT;
    VAR_SQL:='SELECT '''||ERROR_MESAGE||''' remesage FROM DUAL';
    OPEN MESAGE FOR VAR_SQL;
EXCEPTION
WHEN ERAISE THEN
    ROLLBACK;
    VAE_REDATA:=GETLOG(ERROR_MESAGE,VAR_USERNAME,VAR_OPACTION,VAR_TABLE);
    VAR_SQL:='SELECT '''||ERROR_MESAGE||''' remesage FROM DUAL';
    OPEN MESAGE FOR VAR_SQL;
WHEN OTHERS THEN
    ROLLBACK;
    VAE_REDATA:=GETLOG(ERROR_MESAGE,VAR_USERNAME,VAR_OPACTION,VAR_TABLE);
    VAR_SQL:='SELECT '''||ERROR_MESAGE||''' remesage FROM DUAL';
    OPEN MESAGE FOR VAR_SQL;
END MATE_SCRAP_ACTION;
/
分享到:
评论

相关推荐

    创建存储过程.rar

    本压缩包文件"创建存储过程.rar"主要关注如何在不同的数据库系统中创建和使用存储过程。 一、存储过程的概念与优势 存储过程是数据库中的一个重要组件,它允许开发人员将一系列复杂的SQL语句、控制流程语句以及事务...

    DB2数据库创建存储过程时遇到的错误

    "DB2数据库创建存储过程时遇到的错误" DB2数据库创建存储过程时遇到的错误是指在Unix操作系统下,使用db2命令创建存储过程失败的情况。这种情况下,查看db2diag.log文件会发现类似于errno: 0x0FFFFFFFFFFF7AF0 : 0x...

    plsql创建存储过程并创建job定时任务执行-详细笔记文档总结

    plsql创建存储过程并创建job定时任务执行详细笔记文档总结 在 Oracle 中,plsql 是一种强大的编程语言,可以用来创建存储过程和定时任务执行。在本文中,我们将详细介绍如何使用 plsql 创建存储过程并创建 job 定时...

    SQL语句创建存储过程

    以下将详细解释如何创建存储过程,以及如何实现增、删、查、改(CRUD)操作。 一、创建存储过程 创建存储过程的基本语法如下: ```sql CREATE PROCEDURE 存储过程名 @参数1 参数类型, @参数2 参数类型, ... AS...

    MySQL实现创建存储过程并循环添加记录的方法

    创建存储过程并循环添加记录是数据库管理中的常见任务,尤其是在需要批量插入数据时。以下将详细解释如何在MySQL中实现这一功能。 首先,我们需要了解存储过程的基本创建方法。在MySQL中,我们使用`CREATE ...

    存储过程 存储过程概述 创建存储过程 执行存储过程

    存储过程概述 创建存储过程 执行存储过程 查看、重命名和删除存储过程 创建带有参数的存储过程

    .net创建存储过程函数

    .NET 创建存储过程函数允许开发人员使用 C# 或 VB.NET 等 .NET 语言来编写 SQL Server 的存储过程、函数和触发器,而非传统的 T-SQL。SQL Server 2005 及更高版本支持与 .NET CLR(Common Language Runtime)的集成...

    C#创建存储过程代码.doc

    首先,创建存储过程通常是通过Visual Studio(如VS2005)进行的。你可以利用"存储过程"模板来快速生成一个新的存储过程。这通常涉及到在数据库项目中添加新的项,选择"存储过程"模板,然后编写SQL语句定义存储过程的...

    实验六:创建存储过程和触发器1

    实验报告中,你需要详细记录每个存储过程的创建SQL语句,以及执行存储过程后的结果截图。此外,实验报告应包括实验设计思路、遇到的技术问题及解决方法、实验过程的详细描述,以及个人的分析、建议和体会。 确保...

    创建存储过程,触发器

    首先,可以通过创建存储过程向导,这是一个图形化界面,引导用户逐步完成存储过程的定义,包括输入参数、执行的SQL语句和返回值。其次,可以在SQL Server企业管理器中手动创建,通过右键菜单选择新建存储过程,然后...

    Oracle数据库创建存储过程和触发器

    Oracle 数据库创建存储过程和触发器 Oracle 数据库创建存储过程和触发器是高级数据库开发设计的重要组成部分。存储过程和触发器是一种特殊类型的数据库对象,它们可以实现复杂的业务逻辑和数据处理操作。 存储过程...

    MySQL创建存储过程批量插入10万条数据

    MySQL创建存储过程批量插入10万条数据 存储过程 1、首先防止主键冲突,我们清空表。 TRUNCATE table A_student; 2、编写存储过程 delimiter ‘$’; CREATE PROCEDURE batchInsert(in args int) BEGIN declare i int ...

    CLR创建存储过程.docx

    ### CLR 创建存储过程详解 #### 一、简介与背景 SQL Server 2005引入了一项重大功能——CLR(Common Language Runtime)集成,这项功能允许开发者使用.NET框架中的语言,如C#、VB.NET等,来编写存储过程、用户定义...

    access数据库创建存储过程

    本文将详细介绍如何在Access中创建存储过程,并通过查询分析器来实现这一过程。 首先,我们需要了解Access数据库中的两种主要类型存储过程:模块化宏(Module-Based Macro)和SQL存储过程(SQL Stored Procedure)...

    mysql创建存储过程

    ### MySQL 创建存储过程详解 #### 一、存储程序概述 **存储程序**是可以在MySQL服务器中定义并存储的一组SQL语句。它们的功能类似于过程化的编程语言中的函数或过程,可以封装复杂的逻辑,并且能够在数据库层面...

    使用MYSQL5创建存储过程procedure

    在本主题中,我们将深入探讨如何使用MySQL5创建存储过程,并结合PL/SQL语言来实现分表功能。 首先,让我们了解存储过程的基本语法。在MySQL中,创建存储过程通常包含以下部分: 1. `CREATE PROCEDURE` 关键字,...

    dwb创建存储过程(1)

    【标题】: "掌握DB2 Developer Workbench:创建存储过程基础" 【描述】: "本教程将引导你了解如何在DB2 Developer Workbench (DWB)环境中创建存储过程,从理解DWB的基本概念开始,逐步深入到实际操作的步骤。" ...

    使用SQL语句创建存储过程

    以下将详细解释如何使用SQL语句创建存储过程及其不同类型的示例。 1. 创建简单存储过程 在示例中,我们创建了一个名为`stu_pr`的存储过程,用于查询班级`051`的所有学生信息,包括基本信息和选课信息。在创建之前,...

Global site tag (gtag.js) - Google Analytics