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

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

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

准备阶段

创建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. How to run a VBA macro when new mail is received in Outlook

    It can be very useful to run a VBA macro when new mail is received in Outlook. A customer asked me t ...

  2. pandas之数据处理操作

    1.pandas对缺失数据的处理 我们的数据缺失通常有两种情况: 1.一种就是空,None等,在pandas是NaN(和np.nan一样) 解决方法: 判断数据是否为NaN:pd.isnull(df) ...

  3. mybatis如何遍历Map的key和value【增删改查】

    转: mybatis如何遍历Map的key和value 2017年11月28日 10:07:57 Joker_Ye 阅读数:4158   1.sql.xml <?xml version=&quo ...

  4. 我非要捅穿这 Neutron(四)Open vSwitch in Neutron

    目录 文章目录 目录 前文列表 OvS In Neutron 网络拓扑 OvS In Neutron 网络实现模型 双节点混合平面网络 双节点网络拓扑 OvS Bridges 与初始流表项 OvS b ...

  5. Mysqlfunc.c

    int rc;int db_connection;char *server = "192.168.139.207"; // 数据库的ip地址char *user = "c ...

  6. 【Linux】【二】linux 压缩文件(txt)、查看压缩文件内容、解压缩文件、

    通过Xshell 压缩文件.解压缩文件 gzip tools.txt 压缩[tools.txt]文件 zcat tools.txt.gz   查看压缩文件[tools.txt.gz]内容 gunzip ...

  7. python学习之数据类型(int,bool,str)

    第三章 数据类型 3.1 Python基本数据类型 类型 含义 描述 int 整数 主要用来进⾏数学运算 str 字符串 可以保存少量数据并进⾏相应的操作 bool 布尔值 判断真假,True,Fal ...

  8. PJzhang:ping命令的基本用法

    猫宁!!! 参考链接:https://www.cnblogs.com/diantong/p/9626751.html http://aiezu.com/article/linux_ping_comma ...

  9. 华为HCNA乱学Round 8:生成树

  10. Python globals()和locals()比较

    Python的两个内置函数,globals()和locals() ,它们提供了基于字典的访问局部和全局变量的方式. globals()是可写的,即,可修改该字典中的键值,可新增和删除键值对. 而loc ...