PLSQL 批量插入更新

zjf_1103 2012-09-26 10:20:19
SQL比较弱,请教大家一个问题
现在有临时表PRE_TAIL_FORM_TMP和普通表PRE_TAIL_FORM,表结构一致,
PRE_TAIL_FORM中存储着全部的业务数据,PRE_TAIL_FORM_TMP存放着该次业务处理的数据,
现需求如下,如果PRE_TAIL_FORM_TMP中的BILL_NO在PRE_TAIL_FORM存在,则更新PRE_TAIL_FORM的数据,
如果不存在则新增数据至PRE_TAIL_FORM。

请问下怎么写SQL比较好。
...全文
293 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjf_1103 2012-09-26
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
6000条不算少,不过也不算很多,根据经验来说,性能上应该没啥大风险。
[/Quote]

嗯,应该问题不大。
zjf_1103 2012-09-26
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
引用 6 楼 的回复:

引用 5 楼 的回复:
引用 3 楼 的回复:
谢谢关注,考虑到PRE_TAIL_FORM表中的数据比较多,大概有每天都有10万条,有什么其它的方案吗,oracle MERGE我还是第一次知道,去学习一下,多谢。

用MERGE是比较好的做法。


每天10万条,那你这个PRE_TAIL_FORM总容量怕是够呛。

不过如果你都是根据主键匹配来更新的……
[/Quote]

就是前面几位大拿说的方法,给你个帖子你去看下吧
http://www.cnblogs.com/highriver/archive/2011/08/02/2125043.html

好了,结贴了,多谢帮忙。
墙角在唱歌 2012-09-26
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用 5 楼 的回复:
引用 3 楼 的回复:
谢谢关注,考虑到PRE_TAIL_FORM表中的数据比较多,大概有每天都有10万条,有什么其它的方案吗,oracle MERGE我还是第一次知道,去学习一下,多谢。

用MERGE是比较好的做法。


每天10万条,那你这个PRE_TAIL_FORM总容量怕是够呛。

不过如果你都是根据主键匹配来更新的话,性能倒也不会太差。
……
[/Quote]

楼主有了很好地解法 分享下吧 小妹学习了! 求具体解法
MiceRice 2012-09-26
  • 打赏
  • 举报
回复
6000条不算少,不过也不算很多,根据经验来说,性能上应该没啥大风险。
zjf_1103 2012-09-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
引用 3 楼 的回复:
谢谢关注,考虑到PRE_TAIL_FORM表中的数据比较多,大概有每天都有10万条,有什么其它的方案吗,oracle MERGE我还是第一次知道,去学习一下,多谢。

用MERGE是比较好的做法。


每天10万条,那你这个PRE_TAIL_FORM总容量怕是够呛。

不过如果你都是根据主键匹配来更新的话,性能倒也不会太差。

关键是PRE_TAIL_F……
[/Quote]

临时表一次差不多6000条,PRE_TAIL_FORM做了按天分区,我刚才试了下MERGE的做法,
满足我的需求了,谢谢。
MiceRice 2012-09-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
谢谢关注,考虑到PRE_TAIL_FORM表中的数据比较多,大概有每天都有10万条,有什么其它的方案吗,oracle MERGE我还是第一次知道,去学习一下,多谢。
[/Quote]
用MERGE是比较好的做法。


每天10万条,那你这个PRE_TAIL_FORM总容量怕是够呛。

不过如果你都是根据主键匹配来更新的话,性能倒也不会太差。

关键是PRE_TAIL_FORM_TMP每次要处理的数据行数有多少。
zjf_1103 2012-09-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
最好分两步,先查询,再做更新或插入,如果用的是oracle,建议用更新时用rowid,这样速度比较快
[/Quote]

是Oracle,具体的我再看下,我的想法是一步搞定。
zjf_1103 2012-09-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
1,使用存储过程,写逻辑,两条sql。。。
2,搜索 oracle MERGE,一条sql。。。

参考

SQL code


SQL> MERGE INTO products p
2 USING newproducts np
3 ON (p.product_id = np.product_id)
4 WHEN MATCHED THEN
5……
[/Quote]

谢谢关注,考虑到PRE_TAIL_FORM表中的数据比较多,大概有每天都有10万条,有什么其它的方案吗,oracle MERGE我还是第一次知道,去学习一下,多谢。
hexg1 2012-09-26
  • 打赏
  • 举报
回复
最好分两步,先查询,再做更新或插入,如果用的是oracle,建议用更新时用rowid,这样速度比较快
菖蒲老先生 2012-09-26
  • 打赏
  • 举报
回复
1,使用存储过程,写逻辑,两条sql。。。
2,搜索 oracle MERGE,一条sql。。。

参考

SQL> MERGE INTO products p
2 USING newproducts np
3 ON (p.product_id = np.product_id)
4 WHEN MATCHED THEN
5 UPDATE
6 SET p.product_name = np.product_name,
7 p.category = np.category
8 WHERE p.category = 'DVD'
9 WHEN NOT MATCHED THEN
10 INSERT
11 VALUES (np.product_id, np.product_name, np.category)
12 WHERE np.category != 'BOOKS'
SQL> /
1. 前言 5 1.1 目的 5 1.2 文档说明 5 1.3 词汇表 5 1.4 参考资料 5 2. PLSQL程序优化原则 6 2.1 导致性能问题的内在原因 6 2.2 PLSQL优化的核心思想 6 2.3 ORACLE优化器 6 2.4 PLSQL优化 7 2.4.1 选择最有效率的表名顺序 7 2.4.2 WHERE子句中的连接顺序 8 2.4.3 SELECT子句中避免使用 ‘ * ‘ 8 2.4.4 用EXISTS替代IN 8 2.4.5 用NOT EXISTS替代NOT IN 9 2.4.6 用表连接替换EXISTS 9 2.4.7 用EXISTS替换DISTINCT 10 2.4.8 减少对表的查询 10 2.4.9 避免循环(游标)里面嵌查询 11 2.4.10 尽量用union all替换union 13 2.4.11 使用DECODE函数来减少处理时间 13 2.4.12 group by优化 13 2.4.13 尽量避免用order by 14 2.4.14 用Where子句替换HAVING子句 14 2.4.15 使用表的别名(Alias) 14 2.4.16 删除重复记录 14 2.4.17 COMMIT使用 15 2.4.18 减少多表关联 15 2.4.19 批量数据插入 15 2.5 索引使用优化 16 2.5.1 避免在索引列上使用函数或运算 16 2.5.2 避免改变索引列的类型. 17 2.5.3 避免在索引列上使用NOT 17 2.5.4 用>=替代> 18 2.5.5 避免在索引列上使用IS NULL和IS NOT NULL 18 2.5.6 带通配符(%)的like语句 18 2.5.7 总是使用索引的第一个列 19 2.5.8 多个平等的索引 19 2.5.9 不明确的索引等级 19 2.5.10 自动选择索引 19 2.5.11 使用提示(Hints) 19 2.5.12 表上存在过旧的分析 20 2.5.13 表上存在并行 21 2.5.14 关于索引建立 21 3. PLSQL程序性能问题测试方法 21 3.1 性能问题分析 21 3.2 EXPAIN PLAN分析索引使用 22 3.3 TOPSQL分析 24 3.4 针对性语句搜索 28 3.5 后台存储过程跟踪 29 3.6 性能监控 30 4. 性能测试工具设计思想 31
br>精通Oracle 10g PL/SQL编程


【作 者】王海亮 林立新 于三禄 郑建茹
【丛 书 名】 万水Oracle技术丛书

http://images.china-pub.com/ebook20001-25000/21975/shupi.jpg

PL/SQL是Oracle特有的编程语言,它不仅具有过程编程语言的基本特征(循环、条件分支等),而且还具有对象编程语言的高级特征(重载、继承等)。 本书是专门为Oracle应用开发人员提供的编程指南。通过学习本书,读者不仅可以掌握PL/SQL的基础编程知识(嵌入SQL语句和编写子程序),而且还可以掌握PL/SQL的所有高级开发特征(使用记录类型、集合类型、对象类型和大对象类型)。另外,本书还为应用开发人员提供了大量Oracle9i和Oracle 10g新增加的PL/SQL特征。 本书不仅适合于PL/SQL初学者,而且也适合于有经验的PL/SQL编程人员,本书还可以作为Oracle培训班的教材或者辅助材料。


前言
第1章 PL/SQL综述
1.1 SQL简介
1.2 PL/SQL简介
1.3 Oracle 10g PL/SQL新特征
第2章 PL/SQL开发工具
2.1 SQL*Plus
2.2 PL/SQL Developer
2.3 Procedure Builder
2.4 习题
第3章 PUSQL基础
3.1 PL/SQL块简介
3.1.1 PL/SQL块结构
3.1.2 PL/SQL块分类
3.2 定义并使用变量
3.2.1 标量变量
3.2.2 复合变量
3.2.3 参照变量
3.2.4 LOB变量
3.2.5 非PL/SQL变量
3.3 编写PL/SQL代码
3.3.1 PL/SQL词汇单元
3.3.2 PL/SQL代码编写规则
3.4 习题
第4章 使用SQL语句
4.1 使用基本查询
4.1.1 简单查询语句
4.1.2 使用WHERE子句
4.1.3 使用ORDERBY子句
4.2 使用DML语句
4.2.1 插入数据
4.2.2 更新数据
4.2.3 删除数据
4.3 使用事务控制语句
4.3.1 事务和锁
4.3.2 提交事务
4.3.3 回退事务
4.3.4 只读事务
4.3.5 顺序事务
4.4 数据分组
4.4.1 分组函数
4.4.2 GROUPBY和HAVING
4.4.3 ROLLUP和CUBE
4.4.4 GROUPINGSETS
4.5 连接查询
4.5.1 相等连接
4.5.2 不等连接
4.5.3 自连接
4.5.4 内连接和外连接
4.6 子查询
4.6.1 单行子查询
4.6.2 多行子查询
4.6.3 多列子查询
4.6.4 其他子查询
4.7 合并查询
4.8 其他复杂查询
4.9 习题
第5章 SQL函数
5.1 数字函数
5.2 字符函数
5.3 日期时间函数
5.4 转换函数
5.5 集合函数
5.6 其他单行函数
5.7 分组函数
5.8 对象函数
5.9 习题第
6章 访问Oracle
6.1 检索单行数据
6.2 操纵数据
6.2.1 插入数据
6.2.2 更新数据
6.2.3 删除数据
6.2.4 SQL游标
6.3 事务控制语句
6.4 习题
第7章 编写控制结构
7.1 条件分支语句
7.2 CASE语句
7.3 循环语句
7.4 顺序控制语句
7.5 习题
第8章 使用复合数据类型
8.1 PL/SQL记录
8.1.1 定义PL/SQL记录
8.1.2 使用PL/SQL记录
8.2 PL/SQL集合
8.2.1 索引表
8.2.2 嵌套表
8.2.3 变长数组(VARRAY)
8.2.4 PL/SQL记录表
8.2.5 多级集合
8.2.6 集合方法
8.2.7 集合赋值
8.2.8 比较集合
8.3 批量绑定
8.3.1 FORALL语句
8.3.2 BULKCOLLECT子句
8.4 习题
第9章 使用游标
9.1 显式游标
9.2 参数游标
9.3 使用游标更新或删除数据
9.4 游标FOR循环
9.5 使用游标变量
9.6 使用CURSOR表达式
9.7 习题
第10章 处理例外
10.1 例外简介
10.2 处理预定义例外
10.3 处理非预定义例外
10.4 处理自定义例外
10.5 使用例外函数
10.6 PL/SQL编译警告
10.7 习题
第11章 开发子程序
11.1 开发过程
11.2 开发函数
11.3 管理子程序
11.4 习题
第12章 开发包
12.1 建立包
12.2 使用包重载
12.3 使用包构造过程
12.4 使用纯度级别
12.5 习题
第13章 开发触发器
13.1 触发器简介
13.2 建立DML触发器
13.2.1 语句触发器
13.2.2 行触发器
13.2.3 使用DML触发器
13.3 建立INSTEADOF触发器
13.4 建立系统事件触发器
13.5 管理触发器
13.6 习题
第14章 开发动态SQL
14. 1 动态SQL简介
14.2 处理非查询语句
14.3 处理多行查询语句
14.4 在动态SQL中使用BULK子句
14.5 习题第15章 使用对象类型
15.1 对象类型简介
15.2 建立和使用简单对象类型
15.3 建立和使用复杂对象类型
15.3.1 对象类型嵌套
15.3.2 参照对象类型
15.3.3 对象类型继承
15.4 维护对象类型
15.5 习题
第16章 使用LOB对象
16.1 LOB简介
16.2 DBMS LOB包
16.3 访问LOB
16.3.1 访问CLOB
16.3.2 访问BLOB
16.3.3 访问BFILE
16.4 习题
第17章 使用Oracle系统包
17.1 DBMS_OUTPUT
17.2 DBMS JOB
17.3 DBMS PIPE
17.4 DBMSAIERT
17.5 DBMS TRANSACTION
17.6 DBMS SESSION
17.7 DBMS ROWID
17.8 DBMSRLS
17.9 DBMS DDL
17.10 DBMS SHARED POOL
17.11 DBMSRANDOM
17.12 DBMS LOGMNR
17.13 DBMS FLASHBACK
17.14 DBMS OBFUSCATION TOOLKIT
17.15 DBMS SPACE
17.16 DBMS SPACE ADMIN
17.17 DBMSTTS
17.18 DBMSREPAIR
17.19 DBMSRESOURCE MANAGER
17.20 DBMS STATS
17.21 UTL FIIE
17.22 UTL INADDR
附录A 习题参考答案
附录B 使用SQL*Plus

http://www.china-pub.com/21975

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧