先查询再插入数据库的函数

CREATE OR REPLACE FUNCTION F_REVENUE_SI(l_p_cd             in Varchar2,
l_c_cd in Varchar2,
l_prod_type in Varchar2,
l_identity_type in Varchar2,
l_industry_type_id in Varchar2, l_p_id in Varchar2,
l_c_id in Varchar2,
l_region_name in Varchar2,
l_industry_code in Varchar2,
l_industry_name in Varchar2,
l_par_industry_id in Varchar2,
l_industry_grade in Varchar2 ) return varchar2 IS
/*
DECLARE
l_p_cd Varchar2(1000) := 8350000;
l_c_cd Varchar2(1000) := 8350102;
l_prod_type Varchar2(1000) := 10;
l_identity_type Varchar2(1000) := 2;
l_industry_type_id Varchar2(1000) := 2; l_p_id Varchar2(1000) := 1;
l_c_id Varchar2(1000) := 1;
l_region_name Varchar2(1000) := 1;
l_industry_code Varchar2(1000) := 1;
l_industry_name Varchar2(1000) := 1;
l_par_industry_id Varchar2(1000) := 1;
l_industry_grade Varchar2(1000) := 1;
*/
--定义变量接收参数,以便对参数进行修改
ll_identity_type varchar2(1000) := l_identity_type;
ll_industry_type_id varchar2(1000) := l_industry_type_id; --函数返回值
return_val varchar2(8000) := '开始';
--通用游标
cv SYS_REFCURSOR;
--创建记录用于封装部分查询结果
TYPE revenue_type IS RECORD(
r1 REVENUE_STATISTICS_RES.Audit_Cust_Num%TYPE,
r2 REVENUE_STATISTICS_RES.AUDIT_CUST_PARTY_NUM%TYPE, t1 REVENUE_STATISTICS_RES.TY_1%TYPE,
t2 REVENUE_STATISTICS_RES.TY_1%TYPE,
t3 REVENUE_STATISTICS_RES.TY_1%TYPE,
t4 REVENUE_STATISTICS_RES.TY_1%TYPE,
t5 REVENUE_STATISTICS_RES.TY_1%TYPE,
t6 REVENUE_STATISTICS_RES.TY_1%TYPE,
t7 REVENUE_STATISTICS_RES.TY_1%TYPE,
t8 REVENUE_STATISTICS_RES.TY_1%TYPE,
t9 REVENUE_STATISTICS_RES.TY_1%TYPE,
t10 REVENUE_STATISTICS_RES.TY_1%TYPE,
t11 REVENUE_STATISTICS_RES.TY_1%TYPE,
t12 REVENUE_STATISTICS_RES.TY_1%TYPE, y1 REVENUE_STATISTICS_RES.TY_1%TYPE,
y2 REVENUE_STATISTICS_RES.TY_1%TYPE,
y3 REVENUE_STATISTICS_RES.TY_1%TYPE,
y4 REVENUE_STATISTICS_RES.TY_1%TYPE,
y5 REVENUE_STATISTICS_RES.TY_1%TYPE,
y6 REVENUE_STATISTICS_RES.TY_1%TYPE,
y7 REVENUE_STATISTICS_RES.TY_1%TYPE,
y8 REVENUE_STATISTICS_RES.TY_1%TYPE,
y9 REVENUE_STATISTICS_RES.TY_1%TYPE,
y10 REVENUE_STATISTICS_RES.TY_1%TYPE,
y11 REVENUE_STATISTICS_RES.TY_1%TYPE,
y12 REVENUE_STATISTICS_RES.TY_1%TYPE);
--声明变量为自定义记录类型
revenue_rec revenue_type;
--最终查询sql
s_all varchar2(3000) := ''; --基本SQL(注意 UPPER(m.PARTY_ID) != ''NULL'' 中字符串NULL要用4个单引号,否则执行不报错但查询结果是错的)
s1 varchar2(1000) := 'SELECT /*+PARALLEL(12)*/
COUNT(e.CUST_ID) AUDIT_CUST_NUM, COUNT(DISTINCT(m.PARTY_ID)) AUDIT_CUST_PARTY_NUM,
SUM(TY_1) TY1 ,SUM(TY_2) TY2,SUM(TY_3) TY3,SUM(TY_4) TY4,SUM(TY_5) TY5,SUM(TY_6) TY6,SUM(TY_7) TY7,SUM(TY_8) TY8,SUM(TY_9) TY9,SUM(TY_10) TY10,SUM(TY_11) TY11,SUM(TY_12) TY12,
SUM(LY_1) LY1 ,SUM(LY_2) LY2,SUM(LY_3) LY3,SUM(LY_4) LY4,SUM(LY_5) LY5,SUM(LY_6) LY6,SUM(LY_7) LY7,SUM(LY_8) LY8,SUM(LY_9) LY9,SUM(LY_10) LY10,SUM(LY_11) LY11,SUM(LY_12) LY12
FROM EDA_CUST_INC e, CUST_CP_MERGE m
WHERE
e.CUST_ID = m.CUST_ID
AND e.STD_LATN_CD = m.STD_LATN_CD
and m.PARTY_ID IS NOT NULL
AND UPPER(m.PARTY_ID) != ''NULL''
AND e.STD_PRVNCE_CD = ' || l_p_cd ||
' AND e.STD_LATN_CD = ' || l_c_cd; --产品类型
s_prod_type varchar2(1000) := ' AND e.PROD_TYPE =' || l_prod_type; --身份证类型
s_identity varchar2(1000) := ' AND EXISTS (SELECT 1
FROM PARTY P
WHERE m.PARTY_ID = p.PARTY_ID
AND p.IDENTITY_TYPE = ' ||
l_identity_type || ')'; --行业类型
s_industry varchar2(1000) := ' and exists (select 1
from party_org po
where m.party_id = po.party_id
and po.INDUSTRY_TYPE_ID = ' ||
l_industry_type_id || ')'; BEGIN
--处理产品类型参数
/*
IF l_prod_type is null
THEN
s_prod_type := ' AND e.PROD_TYPE is null';
END IF;
*/
--处理身份证类型参数
IF l_identity_type = '-1' THEN
s_identity := ' AND not EXISTS (SELECT 1
FROM PARTY P
WHERE m.PARTY_ID = p.PARTY_ID)';
ELSIF l_identity_type = '-2' THEN
s_identity := ' AND EXISTS (SELECT 1
FROM PARTY P
WHERE m.PARTY_ID = p.PARTY_ID
AND p.IDENTITY_TYPE is null)';
END IF; --处理行业类型参数
IF l_identity_type = '-1' THEN
s_industry := ' and not exists (select 1
from party_org po
where m.party_id = po.party_id)';
ELSIF l_identity_type = '-2' THEN
s_industry := ' and exists (select 1
from party_org po
where m.party_id = po.party_id
and po.INDUSTRY_TYPE_ID is null)';
END IF; --拼接最终查询sql
s_all := s1 || s_prod_type || s_identity || s_industry;
DBMS_OUTPUT.PUT_LINE(s_all);
return_val := '查询sql:' || s_all;
--打开通用游标
OPEN cv FOR s_all;
--将游标赋值给变量
FETCH cv
INTO revenue_rec;
--关闭游标
CLOSE cv; --给本地变量赋值以便后面插入时使用(适用于对传入参数转换后使用)
IF l_identity_type != '' and l_identity_type != '' THEN
ll_identity_type := null;
END IF; IF l_industry_type_id = '-1' or l_industry_type_id = '-2' THEN
ll_industry_type_id := null;
END IF; --执行插入
insert into REVENUE_STATISTICS_RES
(ID,
AUDIT_CUST_NUM,
AUDIT_CUST_PARTY_NUM,
TY_1,
TY_2,
TY_3,
TY_4,
TY_5,
TY_6,
TY_7,
TY_8,
TY_9,
TY_10,
TY_11,
TY_12,
LY_1,
LY_2,
LY_3,
LY_4,
LY_5,
LY_6,
LY_7,
LY_8,
LY_9,
LY_10,
LY_11,
LY_12, PROVINCE_REGION_ID,
CITY_REGION_ID,
REGION_NAME, IDENTITY_TYPE,
PROD_TYPE, INDUSTRY_TYPE_ID,
INDUSTRY_TYPE_CODE,
INDUSTRY_TYPE_NAME,
PAR_INDUSTRY_TYPE_ID,
INDUSTRY_TYPE_GRADE, IN_DATE)
select SEQ_REVENUE_STATISTICS_RES.NEXTVAL, f.*
from (SELECT revenue_rec.r1,
revenue_rec.r2, revenue_rec.t1,
revenue_rec.t2,
revenue_rec.t3,
revenue_rec.t4,
revenue_rec.t5,
revenue_rec.t6,
revenue_rec.t7,
revenue_rec.t8,
revenue_rec.t9,
revenue_rec.t10,
revenue_rec.t11,
revenue_rec.t12, revenue_rec.y1,
revenue_rec.y2,
revenue_rec.y3,
revenue_rec.y4,
revenue_rec.y5,
revenue_rec.y6,
revenue_rec.y7,
revenue_rec.y8,
revenue_rec.y9,
revenue_rec.y10,
revenue_rec.y11,
revenue_rec.y12, l_p_id,
l_c_id,
l_region_name, ll_identity_type,
l_prod_type, ll_industry_type_id,
l_industry_code,
l_industry_name,
l_par_industry_id,
l_industry_grade, sysdate
from dual) f;
COMMIT;
return_val := '插入完成';
return return_val; EXCEPTION
WHEN OTHERS THEN
return_val := return_val || '异常编码:' || SQLCODE || ' 异常信息:' || SQLERRM;
--return return_val;
DBMS_OUTPUT.PUT_LINE(return_val);
--抛出异常
RAISE;
END;

测试时,建议去掉 异常处理,避免出现异常不提示。

我的一个PLSQL函数 先查询再插入数据库的函数 动态SQL拼接查询条件、通用游标、记录定义(封装部分查询字段并赋值给游标)、insert select 序列、常量【我】的更多相关文章

  1. 先查询再插入,改为存储过程,java部分入参出参、mybatisxml【我】

    先查询再插入,改为存储过程 create or replace procedure PRO_REVENUE_SI(l_p_cd in Varchar2, l_c_cd in Varchar2, l_p ...

  2. Mybatis.net与MVC入门配置及联合查询动态SQL拼接和简单事务

    第一次学习Mybatis.net,在博客园也找到好多资料,但是在配置成功之后也遇到了一些问题,尤其是在动态SQl拼接时候,这里把遇到的问题还有自己写的一个Demo贴出来,希望能帮到新手,有不适合的地方 ...

  3. 我的一个PLSQL【我】 循环嵌套、游标使用、变量定义、查询插入表、批量提交事务、字符串截取、动态sql拼接执行

    代码块: --CREATE OR REPLACE PROCEDURE PRO_REVENUE_STATISTICS --IS DECLARE --计数器 ins_counter PLS_INTEGER ...

  4. Sql语句,先查询再插入一条语句完成。

    if ( (select COUNT(*) from Hr where 考勤号码 = '149' and 日期时间 = '2015/7/3 12:00:26') = 0 )INSERT  INTO [ ...

  5. 动态SQL中 实现条件参数 varchar类型的参数名称 以及模糊查询实现

    set @strSQL='select * from testtable AS P WHERE P.Type='+@PType+' and P.PName ='''+@PName+''' and P. ...

  6. Mybatis 动态sql if 判读条件等于一个数字

    在Mybatis中 mapper中 boolean updateRegisterCompanyFlag(@Param(value = "companyId") String com ...

  7. CASE函数 sql server——分组查询(方法和思想) ref和out 一般处理程序结合反射技术统一执行客户端请求 遍历查询结果集,update数据 HBuilder设置APP状态栏

    CASE函数   作用: 可以将查询结果集的某一列的字段值进行替换 它可以生成一个新列 相当于switch...case和 if..else 使用语法: case 表达式/字段 when 值 then ...

  8. T-SQL动态查询(4)——动态SQL

    接上文:T-SQL动态查询(3)--静态SQL 前言: 前面说了很多关于动态查询的内容,本文将介绍使用动态SQL解决动态查询的一些方法. 为什么使用动态SQL: 在很多项目中,动态SQL被广泛使用甚至 ...

  9. mybatis 动态SQL查询总结

    背景 ××项目需要提供系统部分函数第三方调用接口,基于安全性和避免暴露数据库表信息的基础上进行函数接口的设计,根据第三方调用身份的权限提供某张表的自定义集合.本项目基于mybatis的持久层框架,支持 ...

随机推荐

  1. P2756 飞行员配对方案问题[二分图最大匹配]

    题目描述 英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2 名飞行员,其中1 名是英国飞行员,另1名是外籍飞行员.在众多的飞行员中,每一名 ...

  2. Alpha冲刺随笔六:第六天

    课程名称:软件工程1916|W(福州大学) 作业要求:项目Alpha冲刺(十天冲刺) 团队名称:葫芦娃队 作业目标:在十天冲刺里对每天的任务进行总结. 随笔汇总:https://www.cnblogs ...

  3. python开发笔记-python-numpy

    一.Numpy概念 Numpy(Numerical Python的简称)是Python科学计算的基础包.它提供了以下功能:  除了为Python提供快速的数组处理能力,Numpy在数据分析方面还有另外 ...

  4. CH6401 创世纪

    6401 创世纪 0x60「图论」例题 描述 上帝手中有 N(N≤10^6) 种世界元素,每种元素可以限制另外1种元素,把第 i 种世界元素能够限制的那种世界元素记为 A[i].现在,上帝要把它们中的 ...

  5. 解决Antimalware Service Executable CPU占用高的问题

    windows8/8.1,WIN10自带的安全软件Windows defender还不错,基本可以不用装其他杀毒软件了. 但是其进程Antimalware Service Executable 出现C ...

  6. oracle数据库创建表且主键自增

    唠叨几句:几年前的知识忘却了,整理一下笔记,提供一下方便 1.创建数据库表 设置主键 create table users( userid number(10) primary key, /*主键,自 ...

  7. Win32 Error Code COM Error Code NTSTATUS的区别、转换

    这三种码其实都是Windows系统错误码,只是对应不同API和使用场景.它们既有区别,又相互有联系. 一.区别和联系 都是32位值 Win32 Error Code和NTSTATUS位域组成相同,但W ...

  8. DEV C++的使用

    1.点击dev图标: 2.左上角点击:文件——新建——源代码(快捷键ctrl+N): 3. 然后开始写代码: 4.点击运行: 右边的那个编译加运行(点这个),左边编译,中间运行. 5.保存(可以修改保 ...

  9. 2017.10.6 国庆清北 D6T2 同余方程组

    题目描述 求关于x 的同余方程组 x%a1 = b1 x%a2 = b2 x%a3 = b3 x%a4 = b4 的大于等于0 的最小整数解. 输入输出格式 输入格式: 一行8 个整数,表示a1; b ...

  10. 【CSP模拟赛】避难向导(倍增lca&树的直径)

    耐力OIer,一天7篇博客 题目描述 “特大新闻,特大新闻!全国爆发了一种极其可怕的病毒,已经开始在各个城市 中传播开来!全国陷入了巨大的危机!大量居民陷入恐慌,想要逃到其它城市以 避难!经调查显示, ...