- 浏览: 221899 次
- 性别:
- 来自: 大连
最新评论
-
曾老师:
怎么调用呢 传递的参数是什么格式?
通过一个实际的例子学习Oracle存储过程 -
QQ371496669:
Thank You !有点瑕疵:--参数IN表示输入参数,OU ...
通过一个实际的例子学习Oracle存储过程 -
cheeruplc:
...
为学日益 为道日损 -
cheeruplc:
这里有个问题请教一下,帮我解答一下啊,先谢谢了哈, 我使用 ...
Ajax的思考 -
yanyuening:
不错,学习了
通过一个实际的例子学习Oracle存储过程
无疑在大数据量的情况下使用临时表版本的效率会远远高于使用游标版本。
使用游标版本:
sql 代码
- cursor cur_swcode is
- select code as swcode, name as swname from swcode where flag = 3;
- begin
- for rec_swcode in cur_swcode loop
- --DBMS_OUTPUT.put_line(rec_swcode.swcode||rec_swcode.swname);
- --本期累计批准的核实调查条数
- select count(*)
- into vn_bqljpzdchsts
- from sh_unpass_sub
- left outer join sh_unpass on sh_unpass.MS_ID = sh_unpass_sub.MS_ID
- left outer join cpcode on cpcode.CODE = sh_unpass.CPCODE
- where pz_date >= to_date(vs_start_day, 'yyyymmdd')
- and pz_date <= to_date(vs_end_day, 'yyyymmdd')
- and pz_flag = 'R'
- and cpcode.swcode = rec_swcode.swcode;
- --上期批准上期未办结的调查核实条数
- select count(*)
- into vn_sqpzsqwbjdchsts
- from sh_unpass_sub
- left outer join sh_unpass on sh_unpass.MS_ID = sh_unpass_sub.MS_ID
- left outer join cpcode on cpcode.CODE = sh_unpass.CPCODE
- where pz_date >= to_date(vs_ln_start_day, 'yyyymmdd')
- and pz_date <= to_date(vs_ln_end_day, 'yyyymmdd')
- and pz_flag = 'R'
- and jzhs_flag <> 'R'
- and cpcode.swcode = rec_swcode.swcode;
- --期末未到期的调查核实数
- select count(*) into vn_qmwdqdchsts
- from sh_unpass_sub
- left outer join sh_unpass on sh_unpass.ms_id = sh_unpass_sub.ms_id
- left outer join cpcode on cpcode.CODE = sh_unpass.CPCODE
- where pz_date >= to_date(vs_start_day, 'yyyymmdd')
- and pz_date <= to_date(vs_end_day, 'yyyymmdd')
- and pz_flag = 'R'
- and cpcode.swcode = rec_swcode.swcode
- and FLOOR(to_date(vs_end_day, 'yyyymmdd')-pz_date)
- <
- case sh_unpass_sub.hsjg
- when '3' then 69
- else
- case sh_unpass_sub.hsfs
- when '1' then 7
- when '2' then 36
- when '3' then 72
- end
- end;
- --到期已审核无信息的调查核实条数
- select count(*) into vn_dqyshwxxdchsts
- from sh_unpass_sub
- left outer join sh_unpass on sh_unpass.ms_id = sh_unpass_sub.ms_id
- left outer join cpcode on cpcode.CODE = sh_unpass.CPCODE
- where pz_date>=to_date(vs_start_day,'yyyymmdd')
- and pz_date<=to_date(vs_end_day,'yyyymmdd')
- and up_reason = '3'
- and pz_flag = 'R'
- and cpcode.swcode = rec_swcode.swcode ;
- --到期未核实完结条数
- select count(*) into vn_dqwwjhsts
- from sh_unpass_sub
- left outer join sh_unpass on sh_unpass.ms_id = sh_unpass_sub.ms_id
- left outer join cpcode on cpcode.CODE = sh_unpass.CPCODE
- where pz_date>=to_date(vs_start_day,'yyyymmdd')
- and pz_date<=to_date(vs_end_day,'yyyymmdd')
- and pz_flag = 'R'
- and jzhs_flag<>'R'
- and cpcode.swcode = rec_swcode.swcode
- and FLOOR(to_date(vs_end_day, 'yyyymmdd')-pz_date)
- >
- case sh_unpass_sub.hsjg
- when '3' then 69
- else
- case sh_unpass_sub.hsfs
- when '1' then 7
- when '2' then 36
- when '3' then 72
- else 7
- end
- end;
- --到期超时核实完结条数
- select
- sum(
- floor
- (
- case sh_unpass_sub.hsjg
- when '3' then
- case
- when jzhs_date-pz_date>69
- then (jzhs_date-pz_date-69)/10+1
- else 0
- end
- else
- case sh_unpass_sub.hsfs
- when '1' then
- case
- when jzhs_date-pz_date>7
- then (jzhs_date-pz_date-7)/7+1
- else 0
- end
- when '2' then
- case
- when jzhs_date-pz_date>36
- then (jzhs_date-pz_date-36)/10+1
- else 0
- end
- when '3' then
- case
- when jzhs_date-pz_date>72
- then (jzhs_date-pz_date-72)/10+1
- else 0
- end
- else 0
- end
- end
- )
- ) into vn_dqcshswjts
- from sh_unpass_sub
- left outer join sh_unpass on sh_unpass.ms_id = sh_unpass_sub.ms_id
- left outer join cpcode on cpcode.CODE = sh_unpass.CPCODE
- where pz_date>=to_date(vs_start_day,'yyyymmdd')
- and pz_date<=to_date(vs_end_day,'yyyymmdd')
- and pz_flag = 'R'
- and jzhs_flag = 'R'
- and cpcode.swcode = rec_swcode.swcode;
- end loop;
不使用游标版本:
sql 代码
- insert into dchsjsltjb_tmp(swcode,swname,num1,num2,num3,num4,num5,num6)
- select code,name,v1,v2,v3,v4,v5,v6 from swcode
- left outer join
- --本期累计批准的核实调查条数
- --insert into dchsjsltjb_tmp(swcode,num1)
- (
- select cpcode.swcode as swcode ,count(*) as v1
- --into vn_bqljpzdchsts
- from sh_unpass_sub
- left outer join sh_unpass on sh_unpass.MS_ID = sh_unpass_sub.MS_ID
- left outer join cpcode on cpcode.CODE = sh_unpass.CPCODE
- --left outer join swcode on swcode.code = cpcode.swcode
- where pz_date >= to_date(vs_start_day, 'yyyymmdd')
- and pz_date <= to_date(vs_end_day, 'yyyymmdd')
- and pz_flag = 'R'
- group by swcode
- --and cpcode.swcode = rec_swcode.swcode;
- ) sel1 on sel1.swcode = swcode.code
- left outer join
- (
- --上期批准上期未办结的调查核实条数
- --insert into dchsjsltjb_tmp(swcode,num2)
- select cpcode.swcode as swcode ,count(*) as v2
- --into vn_sqpzsqwbjdchsts
- from sh_unpass_sub
- left outer join sh_unpass on sh_unpass.MS_ID = sh_unpass_sub.MS_ID
- left outer join cpcode on cpcode.CODE = sh_unpass.CPCODE
- --left outer join swcode on swcode.code = cpcode.swcode
- where pz_date >= to_date(vs_ln_start_day, 'yyyymmdd')
- and pz_date <= to_date(vs_ln_end_day, 'yyyymmdd')
- and pz_flag = 'R'
- and jzhs_flag <> 'R'
- group by swcode
- --and cpcode.swcode = rec_swcode.swcode;
- ) sel2 on sel2.swcode = swcode.code
- --期末未到期的调查核实数
- left outer join
- (
- --insert into dchsjsltjb_tmp(swcode,num3)
- select cpcode.swcode as swcode ,count(*) as v3
- --into vn_qmwdqdchsts
- from sh_unpass_sub
- left outer join sh_unpass on sh_unpass.ms_id = sh_unpass_sub.ms_id
- left outer join cpcode on cpcode.CODE = sh_unpass.CPCODE
- --left outer join swcode on swcode.code = cpcode.swcode
- where pz_date >= to_date(vs_start_day, 'yyyymmdd')
- and pz_date <= to_date(vs_end_day, 'yyyymmdd')
- and pz_flag = 'R'
- --and cpcode.swcode = rec_swcode.swcode
- and FLOOR(to_date(vs_end_day, 'yyyymmdd')-pz_date)
- <
- case sh_unpass_sub.hsjg
- when '3' then 69
- else
- case sh_unpass_sub.hsfs
- when '1' then 7
- when '2' then 36
- when '3' then 72
- else 7
- end
- end
- group by swcode
- ) sel3 on sel3.swcode = swcode.code
- --到期已审核无信息的调查核实条数
- left outer join
- (
- --insert into dchsjsltjb_tmp(swcode,num4)
- select cpcode.swcode as swcode ,count(*) as v4
- --into vn_dqyshwxxdchsts
- from sh_unpass_sub
- left outer join sh_unpass on sh_unpass.ms_id = sh_unpass_sub.ms_id
- left outer join cpcode on cpcode.CODE = sh_unpass.CPCODE
- --left outer join swcode on swcode.code = cpcode.swcode
- where pz_date>=to_date(vs_start_day,'yyyymmdd')
- and pz_date<=to_date(vs_end_day,'yyyymmdd')
- and up_reason = '3'
- and pz_flag = 'R'
- --and cpcode.swcode = rec_swcode.swcode ;
- group by swcode
- ) sel4 on sel4.swcode = swcode.code
- --到期未核实完结条数
- left outer join
- (
- --insert into dchsjsltjb_tmp(swcode,num5)
- select cpcode.swcode as swcode ,count(*) as v5
- --into vn_dqwwjhsts
- from sh_unpass_sub
- left outer join sh_unpass on sh_unpass.ms_id = sh_unpass_sub.ms_id
- left outer join cpcode on cpcode.CODE = sh_unpass.CPCODE
- --left outer join swcode on swcode.code = cpcode.swcode
- where pz_date>=to_date(vs_start_day,'yyyymmdd')
- and pz_date<=to_date(vs_end_day,'yyyymmdd')
- and pz_flag = 'R'
- and jzhs_flag<>'R'
- --and cpcode.swcode = rec_swcode.swcode
- and FLOOR(to_date(vs_end_day, 'yyyymmdd')-pz_date)
- >
- case sh_unpass_sub.hsjg
- when '3' then 69
- else
- case sh_unpass_sub.hsfs
- when '1' then 7
- when '2' then 36
- when '3' then 72
- else 7
- end
- end
- group by swcode
- ) sel5 on sel5.swcode = swcode.code
- --到期超时核实完结条数
- left outer join
- (
- --insert into dchsjsltjb_tmp(swcode,num6)
- select cpcode.swcode as swcode ,
- sum(
- floor
- (
- case sh_unpass_sub.hsjg
- when '3' then
- case
- when jzhs_date-pz_date>69
- then (jzhs_date-pz_date-69)/10+1
- else 0
- end
- else
- case sh_unpass_sub.hsfs
- when '1' then
- case
- when jzhs_date-pz_date>7
- then (jzhs_date-pz_date-7)/7+1
- else 0
- end
- when '2' then
- case
- when jzhs_date-pz_date>36
- then (jzhs_date-pz_date-36)/10+1
- else 0
- end
- when '3' then
- case
- when jzhs_date-pz_date>72
- then (jzhs_date-pz_date-72)/10+1
- else 0
- end
- else 0
- end
- end
- )
- ) as v6
- --into vn_dqcshswjts
- from sh_unpass_sub
- left outer join sh_unpass on sh_unpass.ms_id = sh_unpass_sub.ms_id
- left outer join cpcode on cpcode.CODE = sh_unpass.CPCODE
- --left outer join swcode on swcode.code = cpcode.swcode
- where pz_date>=to_date(vs_start_day,'yyyymmdd')
- and pz_date<=to_date(vs_end_day,'yyyymmdd')
- and pz_flag = 'R'
- and jzhs_flag = 'R'
- --and cpcode.swcode = rec_swcode.swcode;
- group by swcode
- ) sel6 on sel6.swcode = swcode.code
- where swcode.flag='3'
- ;
发表评论
-
通过一个实际的例子学习SQLServer存储过程
2007-03-30 09:50 4575前面写过一篇 通过一个实际的例子学习Oracle存储过程,现在 ... -
SQLServer你都用哪些函数
2007-03-28 18:02 2305下面是我在SQLServer中用的比较多的函数,你还用些什么函 ... -
Oracle 临时表的用法
2007-03-14 17:11 2228在Oracle中的临时表和SqlServer有些区别。 在Sq ... -
主流数据库分页的SQL语句
2007-03-13 10:04 4082主流数据库对分页查询都有不同程度的支持,下面分别是SQLSer ... -
通过一个实际的例子学习Oracle存储过程
2007-03-08 14:04 58167--创建存储过程 CREATE OR ... -
SQLServer和Oracle常用函数对比
2007-03-07 08:53 1227数学函数 1.绝对值 S:select abs( ... -
DTS增量导出方案汇总
2007-03-06 19:00 29991.触发器 这是一个 ...
相关推荐
在实现多级菜单树的过程中,我们首先将所有节点ID收集到一个临时表中。然后,根据菜单的层级创建相应数量的临时表,每个表存储一个层级的节点信息。接着,通过LEFT JOIN将这些临时表按层级连接起来,形成一个结果集...
SQL中的触发器是一种特殊...总的来说,这个PPT学习教案涵盖了SQL中的关键概念,包括触发器、存储过程、临时表和游标,这些都是数据库管理和开发的重要组成部分,对于理解SQL的高级功能和实现复杂的业务逻辑至关重要。
接下来,我们来看一个更实际的应用场景,其中涉及到两个表:`className` 和 `productInfo`。`className` 表包含班级信息,`productInfo` 表包含产品信息。我们的目标是从每个班级的产品中选取点击量最高的一个产品。...
临时表分为两种:本地临时表(以单个#开头)仅对当前会话可见,而全局临时表(以两个##开头)在整个系统中可见,直到所有引用它的会话都结束。在存储过程中,你可以创建临时表来存储查询结果,然后进行进一步的处理...
游标可以被视为一个临时存储区域,其中包含了由SELECT语句返回的数据行。 #### 创建与使用游标 创建游标的基本语法如下: ```sql DECLARE cursor_name CURSOR FOR SELECT column1, column2, ..., columnN FROM ...
除了基本的游标使用,例子中还展示了一个更复杂的场景,创建了两个临时表`#Temp1`和`#Temp2`,然后通过游标来合并数据。在游标操作中,如果`#Temp2`已经存在与当前`#Temp1`中`deptid`相同的记录,那么就在`#Temp2`的...
根据提供的文件信息,本文将详细解释一个MySQL存储过程的例子,其中包含了游标的使用。这个存储过程主要用于处理一批数据,涉及到日期范围内的数据处理、异常处理等。下面将逐一解析存储过程中涉及的重要知识点。 #...
《公交线路查询算法与实现》的学习教案主要涵盖了公交线路查询系统的开发流程和技术要点,包括数据实体层、表示层、业务逻辑层以及数据访问层的实现。在这个系统中,查询算法的构建是核心部分,涉及到Oracle数据库中...
此外,游标有两种定义方式:一种是传统的声明和处理方式,允许使用`WITH HOLD`,但较为复杂;另一种是使用`FOR`循环,简化了代码,但不支持`WITH HOLD`。根据具体需求,可以选择适合的方式来处理游标。 修改游标...
在Oracle数据库系统中,"pkg_XXX.rar_oracle_oracle record cursor" 提供了一个学习和参考的案例,涉及到了存储过程、游标(cursor)、记录(record)以及动态SQL和临时表的使用。这些概念是Oracle数据库编程的核心...
本篇文章将深入探讨两个关键的MySQL优化技术:存储过程优化和索引优化,具体为使用临时表代替游标以及巧建SUM索引来提升效率。 首先,我们来谈谈MySQL存储过程中的优化策略——使用临时表代替游标。游标在处理复杂...
然后,打开`cur`游标遍历临时表,对于每一行数据,再打开`cur2`游标检查正式表。如果正式表中没有匹配的记录,则将数据插入正式表并删除临时表中的对应记录。同时,使用计数器`counts`控制每处理1000条数据提交一次...
存储过程和函数都是数据库中的一种程序单元,但是存储过程可以执行某些特定的业务逻辑,而函数只能返回一个值。 7. 什么是视图? 视图是一种虚拟的表,它是根据其他表或视图计算生成的。视图可以用来简化数据访问...
`EXISTS` 和 `IN` 子查询是两种常用的方式,其中 `EXISTS` 更适合于仅检查记录的存在性而不关心其值的情况。 - **聚合函数与分组:** `WHERE` 子句用于过滤行,而 `HAVING` 子句则用于过滤分组后的结果集,通常与...
本文将探讨两个重要的优化策略:使用临时表代替游标以及巧建SUM索引来提升查询效率。 首先,我们来讨论“使用临时表代替游标”。在MySQL存储过程中,游标通常用于逐行处理结果集,但这种方式在处理大数据量时可能会...
在 findLChild 存储过程中,我们首先创建了一个临时表 tmp_table,以便于存储树形结构的数据。然后,我们设置了递归深度为 99,以便于控制查询的深度。接着,我们调用了 iterative 存储过程以实现树形结构的查询。...
这是一个需要使用SQL Server的窗口函数(如LAG)来实现的功能,通过在SELECT语句中应用窗口函数,可以访问当前行的前一行数据,然后用该数据来填充NULL值。 ### SQL Server的调优工具和性能优化工具及执行计划详解 ...
4. **使用窗口函数**:窗口函数如ROW_NUMBER(), RANK(), DENSE_RANK()等可以在不使用子查询或临时表的情况下实现复杂的业务逻辑。 5. **避免游标**:游标是一种强大的工具,但它对性能的影响往往被低估。尽可能使用...
- **优点**:触发器可以实现复杂的业务规则和数据约束,提供了一种维护数据库完整性的有效手段。 - **缺点**:过度使用触发器可能会导致性能下降,因为它们增加了数据库的复杂性并可能在不明显的地方引入副作用。...
下面是一个使用 Oracle 存储过程实现字段值查询的示例: 首先,创建一个临时表 TMPTABLE,用于存储查询结果: ```sql create table TMPTABLE( NAME VARCHAR2(500) ); ``` 接下来,创建一个存储过程 QUERY_KEY,...