业务说明:

  主要用于计算采购加权平均价。入参为年份和月份,首先判断输入的年月是否已经结账,如果已经结账就将所有物料和供应商的采购加权平均价返回。

要点说明:

  1.如何在存储过程中定义临时表

  答:oracle正常是不允许直接在存储过程中直接创建临时表的,所以只能使用动态SQL的方式。创建之前,请先确认执行存储过程的用户拥有create any table 的权限。否则会报错。

  2.如何在存储过程定义动态SQL,并且包含转义符

  答:有2种方式:

    1) 可以在SQL中定义参数,然后执行的时候在传进去。例如:

sql := 'select * from tableA where colA = :1 and colB = 1';
execute immediate sql using 'colA_value'

    2) 使用转义符,2个单引号,例如:

execute immediate 'select * from tableA where colA = ''a'' and colB = 1';

  3. 如何将结果集返回出去。

  答:在存储过程定义中声明一个出参out_return out sys_refcursor,然后在最后open out_return for 'select * from base_data';

全部代码:

create or replace PROCEDURE KD_Po_Weight_Avg_Price(
fyear number,
fmonth number,
out_return out sys_refcursor
)
AS
--定义局部变量
month_diff NUMBER(6,2);
input_date date;
current_period date;
input_year_month number(6);
temp_sql varchar2(1000);
insert_sql varchar2(2000);
result_sql varchar2(200);
table_count number(3);--开始业务处理
BEGIN
--入参日期
input_date := to_date(fyear||'-'||fmonth,'yyyy-mm');
--入参日期(数字)
input_year_month := fyear * 100 + fmonth;--查询当前账期和当前时间相差的月份
select TO_DATE(sy.FVALUE || '-' || sp.FVALUE, 'YYYY-MM') into current_period
from T_BD_ACCOUNTBOOK b
inner join T_BAS_SYSTEMPROFILE sy on  b.fbookid = sy.FACCOUNTBOOKID and sy.FKEY = 'CurrentYear' and sy.FCATEGORY = 'GL'
inner join T_BAS_SYSTEMPROFILE sp on  b.fbookid = sp.FACCOUNTBOOKID and sp.FKEY = 'CurrentPeriod' and sp.FCATEGORY = 'GL'
where b.fnumber = '001';if months_between(input_date,current_period) >= 1 then--如果差值小于1证明,当前月份已经结账了.再查询当前表里是否已经有数据了,DBMS_OUTPUT.PUT_LINE('继续处理,要求的日期已结账,当前账期'||current_period);
elseDBMS_OUTPUT.PUT_LINE('当前账期还未结账'); --如果未结账直接抛异常,程序终止RAISE_APPLICATION_ERROR(-20001, '当前账期还未结账.请结账后再试');
end if;select count(1) into table_count from user_tables t where upper(t.TABLE_NAME) = upper('base_data');
if table_count >= 1 thenexecute immediate 'drop table base_data';
end if;temp_sql := 'create global temporary table base_data(year_month number(6),FYear number(4),FMonth number(4),KdYear number(4),FQuarter number(1),item_number varchar2(50),supplier_number varchar2(50),FAmount number(28,10),FQty number(28,10)
) ON COMMIT PRESERVE ROWS';
execute immediate temp_sql;insert_sql := 'insert into base_data
select t.* from (select extract(year from i.fdate)*100+extract(month from i.fdate) as year_month,extract(year from i.fdate) as year, extract(month from i.fdate) as month,decode(sign(extract(month from i.fdate) - 3), -1, extract(year from i.fdate) - 1, extract(year from i.fdate)) as kdyear,case when (extract(month from i.fdate) in (1,2,3)) then 4when (extract(month from i.fdate) in (4,5,6)) then 1when (extract(month from i.fdate) in (7,8,9)) then 2when (extract(month from i.fdate) in (10,11,12)) then 3end as kdquarter,m.fnumber as itemNumber, s.fnumber as supplierNumber,nvl(if.FALLAMOUNT,0) as famount,nvl(ie.FREALQTY,0) as fqtyfrom T_STK_INSTOCK iinner join T_BAS_BILLTYPE b on i.fbilltypeid = b.fbilltypeid and b.fnumber = ''RKD01_SYS''inner join T_STK_INSTOCKEntry ie on i.fid = ie.fidleft join T_STK_INSTOCKENTRY_F if on IE.FENTRYID = if.FENTRYIDleft join T_BD_SUPPLIER s on i.fsupplierid = s.fsupplieridinner join T_BD_SUPPLIER_L sl on s.fsupplierid = sl.fsupplieridleft join T_BD_MATERIAL m on ie.FMATERIALID = m.FMATERIALIDinner join T_BD_MATERIAL_L ml on m.FMATERIALID = ml.FMATERIALIDwhere I.FCANCELSTATUS = ''A''
) t where t.year_month <= :1 ';
execute immediate insert_sql using input_year_month;open out_return for 'select * from base_data';
/*
exceptionwhen too_many_rows then  DBMS_OUTPUT.PUT_LINE('返回值多于1行');  when others then  DBMS_OUTPUT.PUT_LINE('未知异常!'); */
--结束业务处理
END KD_Po_Weight_Avg_Price;

转载于:https://www.cnblogs.com/namelessmyth/p/10301621.html

Oracle 存储过程笔记.相关推荐

  1. C#中使用Oracle 存储过程笔记

      C#中使用Oracle 存储过程笔记 1. 调用包含out/ in out类型参数的存储过程 存储过程: CREATE OR REPLACE PROCEDURE "SITE_EDITSI ...

  2. ORACLE存储过程批量建表-笔记

    目录 一.存储过程简介及基础语法 二.建表语句分析 三.编写存储过程并测试 四.本次所遇到问题记录 五.附录 一.存储过程简介及基础语法 (一)定义 存储过程是一组为了完成特定功能的SQL语句,经编译 ...

  3. oracle复制另一个字段,【学习笔记】Oracle存储过程 表中列不同时动态复制表中数据到另一个表中...

    天萃荷净 分享一篇关于Oracle存储过程实现表之间数据复制功能.两表中列不同,动态的将一表中的数据复制到另一个表中案例 因为要用到回收站功能,删除一条记录,要先放到一个delete表中,以便以后恢复 ...

  4. Oracle数据库笔记(基于oracle数据库的PLSQL编程以及存储过程的创建和使用)

    PLSQL编程 概念和目的 程序结构 Hello World 变量普通变量 引用型变量 记录型变量 流程控制 条件分支 循环 游标 什么是游标 语法 游标的属性 创建和使用 带参数的游标 存储过程 概 ...

  5. Oracle 存储过程学习笔记

    商业规则和业务逻辑可以通过程序存储在Oracle中,这个程序就是存储过程. 存储过程是SQL, PL/SQL, Java 语句的组合,它使你能将执行商业规则的代码从你的应用程序中移动到数据库.这样的结 ...

  6. oracle中创建游标,oracle 存储过程创建游标

    Oracle与Sql Server差异点详解 1.create函数或存储过程异同点 Oracle 创建函数或存储过程一般是 create or replace -- SQL SERVER 则是在创建之 ...

  7. oracle存储过程循环输入数据,oracle 存储过程循环插入数据

    Database 物理文件 控制文件(Control File) 1.一个数据库至少需要一个控制文件 2.控制文件(二进制文件)是一个很小的(通常是数据库中最小的)文件,大小一般在1-5M左右. 3. ...

  8. oracle常用笔记(二)

    文章目录 oracle常用笔记(二) 1. 视图 2. 索引 3. pl/sql 基本语法 1. 变量声明 2. if分支 3. LOOP 循环 4. 游标Cursor 4. 存储过程 5. 存储函数 ...

  9. oracle 权限问题9017,[数据库]oracle学习笔记(一)用户管理_星空网

    oracle学习笔记(一)用户管理 2014-04-13 0 1 --oracle学习第一天 2 --连接 @后面连接数据库实例,具体连接到那个数据库 3 conn scott/tiger@MYORA ...

  10. oracle存储过程游标写法,Oracle存储过程,游标使用

    语法: CREATE [OR REPLACE] PROCEDURE procedure_name (arg1 [mode1] datatype1,arg2 [mode2] datatype2,...) ...

最新文章

  1. php实现socket
  2. JavaScript(数据类型、字符串操作)
  3. 使用Nomad构建弹性基础架构: 作业生命周期
  4. 1. Visio Web 形状 - 无法与 Web 服务器建立连接。请稍后重新进行搜索。处理方式...
  5. 操作系统与数据库知识点
  6. java 回滚异常_Spring事务管理只对出现运行期异常进行回滚
  7. Default process group has not been initialized, please make sure to call init_process_group
  8. 关于【结合测试票】写法的总结。
  9. Photoshop设计精讲精练笔记(一)
  10. 学一点django基础
  11. 腹板拼接宽度_钢结构工程部件拼接一般规定
  12. MySQL备库复制延迟的原因及解决办法
  13. 李子柒——成功的网络视频制作人及其营销分析
  14. python爬取歌曲_python爬取网易云音乐热歌榜实例代码
  15. 怎么搜集家谱资料?四个内容两个方法,打造传世的精神财富
  16. 【Python】Python进程池multiprocessing.Pool八个函数对比:apply、apply_async、map、map_async、imap、starmap...
  17. 【愚公系列】2022年10月 微信小程序-电商项目-确认订单功能实现
  18. 什么软件去视频水印 拍抖音技巧视频教程
  19. Java Comparator使用指南 ---- 看这一篇就够了
  20. 网吧局域网里的设置外网IP地址、设置内网IP地址、限制内网速度和路由器共享...

热门文章

  1. char强制类型转换为int_数据类型专题之三: char类型和类型转换
  2. C++:vector二维数组初始化
  3. 又见回文数 NYOJ781
  4. linux java 多线程_Java多线程:Linux多路复用,Java NIO与Netty简述
  5. asp绑定gridview属性_《ASP.ENT Core与RESTful API开发实战》(第3章)中
  6. 【HDU4691】Front compression(求给定两个子串/后缀的最长公共前缀---后缀数组+st表+一点思维)
  7. pycharm看php文件是乱码,Jetbrains-PhpStorm2019.2中文乱码问题
  8. fetch oracle 1007,Oracle 教程 Fetch子句 - 闪电教程JSRUN
  9. SLAM--单目尺度漂移(相似变换群Sim3)
  10. 翻译: 2.2 Pandas Pytorch 数据预处理 深入神经网络