接到一个以前领导的需求,说的大概意思是:

如果能关联上就取关联上的最大值更新到表里,没有关联上的就取原来的值。

写一个存储过程,这正好用到了临时表,上网查询,用的太乱了,特别记录。

准备阶段

创建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存储过程临时表的更多相关文章

  1. Oracle 存储过程,临时表,动态SQL测试

    --创建事务级别的结果临时表 create global temporary table tmp_yshy( c1 ), c2 ) )on commit delete rows; --创建事务级别的存 ...

  2. Oracle存储过程动态创建临时表/存储过程执行权限问题--AUTHID CURRENT_USER

    关于Oracle存储过程执行权限问题的解决 http://blog.sina.com.cn/s/blog_6ceed3280101hvlo.html (2014-04-02 04:06:28) 转载▼ ...

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

    注:本文来源于 <  Java调用oracle存储过程通过游标返回临时表数据   > Java调用oracle存储过程通过游标返回临时表数据 项目开发过程中,不可避免的会用到存储过程返回结 ...

  4. 在ORACLE存储过程中创建临时表

    在ORACLE存储过程中创建临时表 存储过程里不能直接使用DDL语句,所以只能使用动态SQL语句来执行 --ON COMMIT DELETE ROWS 说明临时表是事务指定,每次提交后ORACLE将截 ...

  5. oracle 存储过程

    来自:http://www.jb51.net/article/31805.htm Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 I ...

  6. Oracle存储过程语法

    原文链接:http://www.jb51.net/article/31805.htm Oracle存储过程基本语法 存储过程  1 CREATE OR REPLACE PROCEDURE 存储过程名  ...

  7. Oracle存储过程基本语法介绍

    Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR RE ...

  8. Oracle存储过程(转)

    Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR RE ...

  9. Oracle存储过程中异常Exception的捕捉和处理

    Oracle存储过程中异常的捕捉和处理 CREATE OR REPLACE Procedure Proc_error_process ( v_IN in Varchar2, v_OUT Out Var ...

随机推荐

  1. 有关命令行的vue操作

    1.安装node.js ,通过node -v  和  npm -v  来查看node 和 npm 版本. 2. 安装bower,bower 可以说是(前端)包管理器 npm install bower ...

  2. 使用 joblib 对 Pandas 数据进行并行处理

    使用 joblib 对 Pandas 数据进行并行处理 如果需要对一个很大的数据集进行操作,而基于一列数据生成新的一列数据可能都需要耗费很长时间. 于是可以使用 joblib 进行并行处理. 假设我们 ...

  3. Oracle数据库提高sql查询效率总结

    我们要做到不但会写SQL,还要做到写出性能优良的SQL语句. (1)选择最有效率的表名顺序(只在基于规则的优化器中有效): Oracle的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句 ...

  4. shell中命令作为变量使用

    说明:必须要带上$ ,否则报错 ENCRYPTION_KEY=$( /dev/urandom | od -An -t x | tr -d ' ') echo ${ENCRYPTION_KEY}

  5. MySQL 查看约束,添加约束,删除约束 添加列,修改列,删除列

    查看表的字段信息:desc 表名; 查看表的所有信息:show create table 表名; 添加主键约束:alter table 表名 add constraint 主键 (形如:PK_表名) ...

  6. python 连接SQL SERVER 并读取其数据

    1.没什么难的操作 安装  pip install pymssql import pymssql #引入pymssql模块 import pandas as pd def conn(): connec ...

  7. 【计算机视觉】背景建模--Vibe 算法优缺点分析

    一.Vibe 算法的优点 Vibe背景建模为运动目标检测研究邻域开拓了新思路,是一种新颖.快速及有效的运动目标检测算法.其优点有以下两点: 1.思想简单,易于实现.Vibe通常随机选取邻域20个样本为 ...

  8. linux运维、架构之路-Lnmp架构部署

    一.Lnmp架构原理 二. Lnmp架构软件安装 1.Nginx安装脚本 #!/bin/bash useradd -s /sbin/nologin -M www mkdir -p /server/to ...

  9. BUUOJ reverse 不一样的flag

    不一样的flag 是不是做习惯了常规的逆向题目?试试这道题,看你在能不能在程序中找到真正的flag!注意:flag并非是flag{XXX}形式,就是一个’字符串‘,考验眼力的时候到了! 注意:得到的 ...

  10. Springboot---后台导出功能,easyExcel

    Sprintboot+vuejs+easyExcel实现excel导出功能 一.背景 前段时间,有个需求,想要做一个excel导出功能,用来把查询到的数据进行导出.第一次做,所以搜了大量的资料,分为两 ...