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

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. 《你说对就队》第九次团队作业:【Beta】Scrum meeting 3

    <你说对就队>第九次团队作业:[Beta]Scrum meeting 3 项目 内容 这个作业属于哪个课程 [教师博客主页链接] 这个作业的要求在哪里 [作业链接地址] 团队名称 < ...

  2. PHP——汉字完美转为ASCII码

    前言 对接联通的接口,让我学会了不少PHP偏门函数....,主要对方用的py,我这用的PHP,人家一个函数解决了, 我这还要自己写方法,也是比较蛋疼,但是学到东西还是很开心的~ 代码 字符串转为ASC ...

  3. 08 node.js 的使用

    创建包 目录结构 cmd   cd 到当前目录:  \ 执行 npm init //创建一个包 1 2. 3. 4.包的安装 npm install jquery --save npm install ...

  4. Tensorflow细节-P42张量的概念及使用

    1.运行以下代码 import tensorflow as tf a = tf.constant([1.0, 2.0], name="a") b = tf.constant([2. ...

  5. MySQL 必会知识

    一.为什么用自增列作为主键 1.如果我们定义了主键(PRIMARY KEY),那么InnoDB会选择主键作为聚集索引. 如果没有显式定义主键,则InnoDB会选择第一个不包含有NULL值的唯一索引作为 ...

  6. Kubernetes 学习20调度器,预选策略及优选函数

    一.概述 1.k8s集群中能运行pod资源的其实就是我们所谓的节点,也称为工作节点.master从本质上来讲,他其实是运行整个集群的控制平面组件的比如apiserver,scheal,controlm ...

  7. (Python) SOAP Web Service (HTTP POST)

    功能很强大,可惜只有试用 https://www.example-code.com/python/soap_web_service.asp

  8. loj #6191. 「美团 CodeM 复赛」配对游戏 期望dp

    题意:有一个栈,随机插入 $n$ 次 $0$/$1$ 如果栈顶是 $1$,然后插入 $0$,则将这两个元素都弹出,否则,插入栈顶. 求:$n$ 次操作后栈中期望的元素个数. 我们发现,按照上述弹栈方式 ...

  9. 在运维中的shell经验总结

    来自良许Linux公众号 编写 脚本开头部分应有脚本功能说明.参数使用说明.作者姓名.创建/修改日期.版本信息,格式为: 脚本编写时,注意格式对齐,如所有的循环或者判断语句前后的语句进行对齐,以及ca ...

  10. Angular动态组件

    一.主页面: app.component.html: <button (click)="load();">动态</button> 2<div #dom ...