oracle存储过程临时表
接到一个以前领导的需求,说的大概意思是:
如果能关联上就取关联上的最大值更新到表里,没有关联上的就取原来的值。

写一个存储过程,这正好用到了临时表,上网查询,用的太乱了,特别记录。
准备阶段
创建PD_INFO
create table PD_INFO
(
id INTEGER,
pd NUMBER,
pd_f NUMBER,
data_date DATE
);
insert into pd_info (ID, PD, PD_F, DATA_DATE) values (1, 0.7, 0.9, to_date('28-12-2018', 'dd-mm-yyyy'));
insert into pd_info (ID, PD, PD_F, DATA_DATE) values (2, 0.8, 0.1, to_date('28-12-2018', 'dd-mm-yyyy'));
insert into pd_info (ID, PD, PD_F, DATA_DATE) values (3, 0.9, 0.3, to_date('28-12-2018', 'dd-mm-yyyy'));
insert into pd_info (ID, PD, PD_F, DATA_DATE) values (4, 0.5, 0.5, to_date('28-12-2018', 'dd-mm-yyyy'));
创建CUST_INFO
create table CUST_INFO
(
cust_id VARCHAR2(12),
id INTEGER
);
insert into CUST_INFO (CUST_ID, ID) values ('A', 1);
insert into CUST_INFO (CUST_ID, ID) values ('A', 2);
insert into CUST_INFO (CUST_ID, ID) values ('A', 3);
创建过程
CREATE OR REPLACE PROCEDURE PROC_PD_INFO_TEST(P_DATE IN VARCHAR2,RFLAG OUT NUMBER) AUTHID CURRENT_USER
IS
str1 VARCHAR(2000);
str2 VARCHAR(2000);
str_sql VARCHAR(2000);
str3 varchar(2000);
str4 varchar(2000);
V_DATA date;
BEGIN
str1 := 'CREATE GLOBAL TEMPORARY TABLE PD_TMP(ID INTEGER,PD NUMBER,PD_F NUMBER) ON COMMIT PRESERVE ROWS';
EXECUTE IMMEDIATE str1;
SELECT to_date(P_DATE,'YYYYMMDD') INTO V_DATA from dual; str_sql := 'INSERT INTO PD_TMP
SELECT A.ID,A.PD,B.PD_F FROM
( SELECT PD.ID, PD.PD, CASE WHEN CUST.ID IS NOT NULL THEN ''FLAG'' ELSE ''NO_FLAG'' END AS FLAG
FROM PD_INFO PD LEFT JOIN CUST_INFO CUST ON PD.ID = CUST.ID where pd.data_date = '''||V_DATA||''' ) A
LEFT JOIN
(SELECT MAX(PD) PD_F, FLAG FROM (SELECT PD.ID, PD.PD,
CASE WHEN CUST.ID IS NOT NULL THEN ''FLAG'' ELSE ''NO_FLAG'' END AS FLAG
FROM PD_INFO PD LEFT JOIN CUST_INFO CUST ON PD.ID = CUST.ID where pd.data_date = '''||V_DATA||''' ) GROUP BY FLAG) B
ON A.FLAG=B.FLAG';
EXECUTE immediate str_sql; str2:='MERGE INTO PD_INFO TAB1
USING (SELECT ID,PD,PD_F FROM PD_TMP T )TAB2
ON (TAB1.ID = TAB2.ID)
WHEN MATCHED THEN
UPDATE SET TAB1.PD_F = TAB2.PD_F';
EXECUTE IMMEDIATE str2; str3:='truncate table pd_tmp';
execute immediate str3;
str4:='drop table pd_tmp';
execute immediate str4;
commit;
END PROC_PD_INFO_TEST;
用到了临时表,动态SQL创建的,执行的时候,用EXECUTE IMMEDIATE 。
在用到临时表的时候,需要删除,首先到truncate table 后,才能dorp table 。
调用过程
declare
RFLAG number;
begin
-- Call the procedure
proc_pd_info_test('',RFLAG);
end;
oracle存储过程临时表的更多相关文章
- Oracle 存储过程,临时表,动态SQL测试
--创建事务级别的结果临时表 create global temporary table tmp_yshy( c1 ), c2 ) )on commit delete rows; --创建事务级别的存 ...
- Oracle存储过程动态创建临时表/存储过程执行权限问题--AUTHID CURRENT_USER
关于Oracle存储过程执行权限问题的解决 http://blog.sina.com.cn/s/blog_6ceed3280101hvlo.html (2014-04-02 04:06:28) 转载▼ ...
- Java调用oracle存储过程通过游标返回临时表数据
注:本文来源于 < Java调用oracle存储过程通过游标返回临时表数据 > Java调用oracle存储过程通过游标返回临时表数据 项目开发过程中,不可避免的会用到存储过程返回结 ...
- 在ORACLE存储过程中创建临时表
在ORACLE存储过程中创建临时表 存储过程里不能直接使用DDL语句,所以只能使用动态SQL语句来执行 --ON COMMIT DELETE ROWS 说明临时表是事务指定,每次提交后ORACLE将截 ...
- oracle 存储过程
来自:http://www.jb51.net/article/31805.htm Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 I ...
- Oracle存储过程语法
原文链接:http://www.jb51.net/article/31805.htm Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 ...
- Oracle存储过程基本语法介绍
Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR RE ...
- Oracle存储过程(转)
Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR RE ...
- Oracle存储过程中异常Exception的捕捉和处理
Oracle存储过程中异常的捕捉和处理 CREATE OR REPLACE Procedure Proc_error_process ( v_IN in Varchar2, v_OUT Out Var ...
随机推荐
- 在oracle中使用基表建立月表的存储过程
某些系统需要按月分表来保存数据.下面的存储过程演示了如何使用基表来建立每个月的月表. 处理思路是: 1:首先,为基表建立好表和对应的索引. 2:将基表保存到一个存储过程需要的表中. ...
- [log4j]log4j简单配置
步骤: 1.导入jar包:log4j-1.2.17.jar 2.编写log4j配置文件:log4j.properties ### set log levels - for more verbose l ...
- 小D课堂 - 新版本微服务springcloud+Docker教程_2_03常见的微服务框架
笔记 3.常见的微服务框架 简介:讲解常用的微服务框架 consumer: 调用方 provider: 被调用方 一个接口一般都会充当两个角色(不是同时充当) ...
- 点击其他区域关闭dialog
1.在打开dialog处阻止冒泡,在body click事件中关闭dialog2.不阻止冒泡,在body click事件中判断target是否为diallog或其子节点 在Safari浏览器中,在默认 ...
- kvm热迁移(4)
一.迁移简介 迁移分为热迁移和冷迁移,冷迁移是在机器关机的状态下进行迁移,具体操作在之前的博客有体现.热迁移是在机器处于开机状态进行迁移,本次博客主要讲解热迁移. 系统的迁移是指把源主机上的操作系统和 ...
- Xib中设置控件的圆角、边框效果
设置控件的圆角和边框效果有两种方式: 1.代码实现: self.myView.layer.masksToBounds = YES; self.myView.layer.cornerRadius = ; ...
- python解压压缩包
默认解压到当前目录 import shutil shutil.unpack_archive('/root/redis-3.2.3.tar.gz') 解压到home目录下 import shutil s ...
- Hadoop_Hbase集群完全离线安装[CDH 5.13.1]
here 一.环境准备:(这儿准备了三台虚拟机:内存6-3-3) JDK: -openjdk rpm -e java--openjdk-headless rpm -e java--openjdk-he ...
- Office之什么是高内聚低耦合
---恢复内容开始--- 高内聚低耦合,是软件工程中的概念,是判断设计好坏的标准,主要是面向对象的设计,主要是看类的内聚性是否高,耦合度是否低. 粗劣的说就指的是:单独模块间有着强大的凝聚力,不同的模 ...
- DFS(深度优先搜索)和BFS(广度优先搜索)
深度优先搜索算法(Depth-First-Search) 深度优先搜索算法(Depth-First-Search),是搜索算法的一种. 它沿着树的深度遍历树的节点,尽可能深的搜索树的分支. 当节点v的 ...