`
21841625a
  • 浏览: 9634 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Oracle 存储过程:游标与动态SQL

阅读更多
特此记录下,备以后查阅。
1.创建包+游标
CREATE OR REPLACE PACKAGE RefCursor
IS type t_RefCursor
IS
  ref  CURSOR;
END RefCursor;


2.创建存储过程,定义in,out参数。
create or replace 
PROCEDURE prc_stock_HistoryDetail(
    -- 功能: 查询仓库的进出库记录与每笔结存数量。
    --定义参数
    p_stockcode IN VARCHAR2, -- 仓库编号
    p_stockId   IN VARCHAR2, -- 仓库Id
    p_fbegdate  IN VARCHAR2, -- 开始日期
    p_fenddate  IN VARCHAR2, -- 截止日期
    p_fitemcode IN VARCHAR2, -- 品种
    cur_result out sys_refcursor -- 输出游标
    )
IS
  -- 定义变量
  
  v_stockid   VARCHAR2(32); -- 仓库编号
  v_stockName VARCHAR2(32); -- 仓库名称
  v_stockCode VARCHAR2(32); -- 仓库名称
  v_itemcode  VARCHAR2(32); -- 物资编码
  v_instockDate DATE;       -- 出入库日期
  v_in_store     NUMBER;        -- 入库数量
  v_out_store    NUMBER;        -- 出库数量
  v_lost_store   NUMBER;        -- 损耗数量
  v_qc_store     NUMBER;        -- 期初数量
  v_last_store   NUMBER;        -- 结存数量
  v_last_qc_date VARCHAR(32);   -- 最后一次期初日期
  -- 临时变量
  v_temp_stockid varchar2(32); -- 仓库Id
  v_temp_itemcode varchar2(32);-- 物资编码
  v_temp_last_store number;    -- 结存
  
  
  --定义游标
  cur_query RefCursor.t_Refcursor;
  v_sqlStmt string(10000);
  v_sql VARCHAR2(2000);
BEGIN

  v_sql :='select t.pk_id from yy_bd_stock t where t.fend =1 order by t.fcode asc';
  -- 查询仓库指定日期的 进出库明细记录
  v_sqlStmt := '  select tt.fstockid,tt.fcode,tt.fname,tt.fitemcode,tt.finstockdate,sum(tt.in_store) as in_store,sum(tt.out_store) as out_store,sum(tt.lost_store) as lost_store,sum(tt.last_store) as last_store
from (select t.fstockid,a.fcode,a.fname,t.fitemcode,t.finstockdate,decode(t.fiostatus,1,t.fqty,0) as in_store,
decode(t.fiostatus,2,t.fqty,0) as out_store,
decode(t.fiostatus,3,t.fqty,0) as lost_store ,
decode(t.fiostatus,1,t.fqty,0)-decode(t.fiostatus,2,t.fqty,0)-decode(t.fiostatus,3,t.fqty,0)) as last_store
from yy_store_storage t                            
left join yy_bd_stock a on t.fstockid = a.pk_id 
where t.fisreset = 0 and t.fitemcode is not null ' ;
  -- 仓库编号
  if p_stockId is not null then
     v_sqlStmt := v_sqlStmt || ' and t.fstockid='''||p_stockId||'''';
  end if;
  -- 品种
  if p_fitemcode is not null then
     v_sqlStmt := v_sqlStmt || ' and t.fitemcode='''||p_fitemcode||'''';
  end if;  
  -- 起始日期
  if p_fbegdate is not null then
     v_sqlStmt := v_sqlStmt || ' and t.finstockdate >=to_date('''||p_fbegdate||''',''yyyy-MM-dd'')';
  end if; 
  -- 截止日期
   if p_fenddate is not null then
     v_sqlStmt := v_sqlStmt || ' and t.finstockdate < to_date('''||p_fenddate||''',''yyyy-MM-dd'')';
  end if; 
  v_sqlStmt := v_sqlStmt || ' order by a.fcode asc,t.fitemcode, t.finstockdate asc  
        ) tt
      group by tt.fstockid,tt.fcode,tt.fname,tt.fitemcode,tt.finstockdate
      order by tt.fcode asc,tt.fitemcode, tt.finstockdate asc  ';
  dbms_output.put_line('=====sqlStmt:'||v_sqlStmt);
  -- 打开游标 遍历仓库表。
  OPEN cur_query FOR v_sqlStmt;
  
  -- 初始化临时变量
  v_temp_stockId := '';
  v_temp_itemcode := '';
  v_temp_last_store := 0;
  LOOP
    -- 查询库存表中的进出库记录。获取每笔记录的 进库数量、出库数量、损耗数量、结存数量。然后存入临时表中。
    FETCH cur_query
    INTO v_stockid,v_stockCode, v_stockName, v_itemcode, v_instockDate, v_in_store, v_out_store, v_lost_store,v_last_store;
    dbms_output.put_line('v_stockid:'||v_stockName||',fitemcode:'||v_itemcode||',instockdate:'||v_instockDate);
    EXIT WHEN cur_query%notfound;
    if (v_stockid is not null ) and  (v_itemcode is not null) then     
      -- 遍历记录,如果不是同一仓库与品种.则从新获取对应仓库品种中的期初库存或上日结存数量
      if (v_temp_stockid is null or v_temp_stockid!= v_stockid) and (v_temp_itemcode is null or  v_temp_itemcode!= v_itemcode) then 
          v_temp_stockid := v_stockid;
          v_temp_itemcode := v_itemcode; 
          v_temp_last_store := 0;
          -- 调用存储过程,获取结存数量
          prc_stock_historystore(v_temp_stockid,p_fbegdate,v_temp_itemcode,v_qc_store);
          dbms_output.put_line('期初数量:'||v_qc_store); 
          v_temp_last_store := nvl(v_qc_store,0)+ nvl(v_last_store,0);
      else 
          v_temp_last_store := v_temp_last_store + nvl(v_last_store,0); 
      end if;       
      -- 通过结存数量,计算每笔的期初数量 -- 结存=期初+入库-出库-损耗      
      insert into yy_temp_store_detail (fstockid, fstockcode, finstorkdate, fitemcode, in_store, out_store, lost_store, last_store)
      values (v_stockid, '', v_instockDate, v_itemcode, v_in_store, v_out_store, v_lost_store, v_temp_last_store);
      
    end if;    
    --dbms_output.put_line('name:'||v_stockName||',itemcode:'||v_itemcode||',date:'||v_instockDate||',in_store:'||v_in_store||',out_store:'||v_out_store);
  END LOOP;
  CLOSE cur_query;
    
  -- 返回集合
  open cur_result for select a.fname,t.finstorkdate,t.fitemcode,t.in_store,t.out_store,t.lost_store,t.last_store 
    from yy_temp_store_detail t
    left join yy_bd_stock a on t.fstockid = a.pk_id
    order by a.fcode asc,t.fitemcode, t.finstorkdate asc ;   
  
END;

分享到:
评论

相关推荐

    Oracle存储过程、游标、函数的详解

    ### Oracle存储过程、游标、函数的详解 #### 一、概述 在Oracle数据库中,存储过程、游标和函数是非常重要的组成部分,它们为数据库管理提供了强大的编程能力。通过学习这些概念,我们可以更加灵活地管理和操作...

    整理:oracle pl/sql 入门+ 数组使用+游标+动态SQL

    - 游标FOR LOOP:与动态SQL结合,可以方便地遍历和处理动态查询结果。 在实际开发中,掌握这些基本概念和技巧,可以有效提升Oracle数据库应用程序的效率和质量。通过阅读这个文档,你将获得关于Oracle PL/SQL的...

    静态、动态sql及各种游标

    静态、动态SQL及各种游标 静态SQL和动态SQL是两种不同的SQL语句执行方式,分别应用于不同的场景中。静态SQL是指在PL/SQL中直接运行的SQL语句,没有什么特别之处。动态SQL则是指利用EXECUTE IMMEDIATE语句执行的SQL...

    Java调用oracle存储过程通过游标返回临时表

    本篇文章将深入探讨如何使用Java调用Oracle存储过程,并通过游标获取存储过程中返回的临时表数据。 首先,Oracle存储过程是一种在数据库端执行的预编译SQL语句和PL/SQL代码集合。它可以接收参数、执行业务逻辑并...

    Oracle存储过程out游标

    在这个场景中,我们有三个文件:TESTPACKAGE.txt,CURSOR_TEST2.txt和OracleProcedure.java,分别涉及Oracle存储过程的创建、游标的使用以及Java代码如何与Oracle存储过程交互。 首先,`TESTPACKAGE.txt`很可能包含...

    Oracle存储过程游标详解

    "Oracle存储过程游标详解" Oracle 存储过程游标是指在 Oracle 数据库中使用游标来实现对结果集的处理和操作。游标可以分为静态游标和REF游标两种类型。静态游标是指结果集已经确实(静态定义)的游标,可以进一步...

    oracle存储过程游标

    ### Oracle 存储过程与游标使用...通过以上分析,我们可以看到Oracle存储过程与游标的应用十分广泛,不仅能够提升开发效率,还能增强系统的稳定性和安全性。熟练掌握这些技术对于数据库管理员和开发人员来说至关重要。

    java调用oracle存储过程(游标)相关

    本文将深入探讨如何使用Java来调用Oracle存储过程,特别是涉及游标的场景。 首先,Oracle存储过程是一种预编译的SQL和PL/SQL代码块,可以在数据库服务器端执行,提供了一种封装业务逻辑的方式。而游标(Cursor)在...

    oracle存储过程使用游标对多表操作例子

    本文将深入探讨如何在Oracle存储过程中使用游标进行多表操作,具体通过一个示例来展示这一过程。 ### 标题与描述分析 标题:“oracle存储过程使用游标对多表操作例子”直接指出了文章的主题是关于在Oracle环境下,...

    Oracle教案 Oracle 存储过程 游标 SQL语句 PL/SQL

    Oracle 教案:深入理解 Oracle 存储过程、游标与 SQL 语句及 PL/SQL Oracle 是全球领先的数据库管理系统提供商,不仅提供数据库产品,还包括中间件、云计算服务等全面的企业级解决方案。"Oracle"一词源于古希腊神话...

    Oracle存储过程实例使用显示游标

    在本例中,“Oracle存储过程实例使用显示游标”着重展示了如何在存储过程中调用函数,并通过游标来处理和更新数据。 首先,我们需要了解存储过程的基本结构。一个存储过程通常包含以下部分: 1. **声明部分**:在...

    sql server和oracle的存储过程、游标示例

    在数据库管理领域,SQL Server和Oracle都是广泛应用的关系型数据库管理系统,它们都支持存储过程和游标的使用,这两种特性极大地增强了数据库的功能性和效率。存储过程是预编译的SQL语句集合,而游标则用于逐行处理...

    oracle 的函数、存储过程、游标、简单实例

    本主题将深入探讨Oracle中的几个核心概念:函数、存储过程、游标以及简单的实例,这些都是数据库管理员和开发人员日常工作中不可或缺的部分。 首先,我们来了解**Oracle函数**。函数是预定义的代码块,接受零个或多...

    oracle存储过程、游标、函数

    **一、Oracle存储过程** 存储过程是预编译的SQL语句集合,它们被存储在数据库中并可以按需调用。存储过程有以下几个优点: 1. **性能提升**:由于存储过程在首次创建时就被编译,因此后续调用时执行速度快。 2. **...

    用callabledStatement调用oracle存储过程实用例子(IN OUT 传游标)

    Oracle 存储过程调用 CallabledStatement 实用例子(IN OUT 传游标) 一、Oracle 存储过程简介 Oracle 存储过程是一种可以在 Oracle 数据库中存储和执行的程序单元。存储过程可以由多种语言编写,例如 PL/SQL、...

    多个ORACLE 游标+SQL 游标 小例子+帮助文档

    SQL中的游标与Oracle类似,但语法稍有不同。在SQL Server或MySQL中,我们可以使用DECLARE、OPEN、FETCH和CLOSE语句来管理游标。以下是一个SQL Server的例子: ```sql DECLARE @var1 datatype1, @var2 datatype2; ...

    ORACLE 游标 异常 存储过程

    在Oracle数据库中,游标(Cursor)是一种非常重要的概念,特别是在编写存储过程和函数时。游标允许我们处理单行或多行数据集,一次处理一行,这样可以进行精细化的数据操作。在本篇讨论中,我们将深入理解Oracle游标...

    oracle到sqlserver存储过程语法转换

    ### Oracle到SQL Server存储过程...在进行数据库迁移时,开发者需要仔细分析现有的Oracle存储过程,然后根据SQL Server的语法特点进行相应的转换。此外,还应考虑到性能优化等问题,确保迁移后的应用程序能够高效运行。

    oracle存储过程、游标、函数、PL/SQL块

    包含oracle存储过程的增、删、查、改 %type、%rowtype的使用 自定义函数 PL/SQL块

    JAVA调用ORACLE存储过程游标使用

    Oracle存储过程可以封装复杂的业务逻辑,而游标则用于在结果集上进行迭代,特别是当结果集太大,不适合一次性加载到内存时。下面将详细介绍如何在Java中实现这一功能。 首先,确保你已经在Oracle数据库中创建了包含...

Global site tag (gtag.js) - Google Analytics