游标

oracle游标的使用

大憨熊 提交于 2019-12-19 11:52:18
游标的概念 游标相当于一个内存工作区,由系统或用户以变量的形式定义。 游标的作用就是用于临时存储从数据库中提取的数据块。 使用游标时,系统把数据从存放在磁盘的表中调到计算机内存中进行处理,最后将处理结果显示出来或最终写回数据库,达到数据处理的速度提高的目的(频繁的磁盘数据交换会降低效率)。 游标的分类 隐式游标: select ordid into lordid 这种单行操作,一次只能从数据库中提取一行数据时,系统都会使用一个隐式游标。 隐式游标属性: SQL%ROWCOUNT 整型 代表DML语句成功执行的数据行数 SQL%FOUND 布尔型 值为 TRUE代表插入、删除、更新或单行查询操作成功 SQL%NOTFOUND 布尔型 与SQL%FOUND属性返回值相反 SQL%ISOPEN 布尔型 DML执行过程中为真,结束后为假 用法举例: create or replace function zf_test return varchar is error varchar(100); lempname varchar(10); pragma AUTONOMOUS_TRANSACTION; begin update tablename e set e.empname = 'hahh' where e.empid like '888888%'; DBMS_output.put_line

处理超出打开游标的最大数异常(ORA-01000: maximum open cursors exceeded)

风流意气都作罢 提交于 2019-12-19 09:59:44
在执行如下代码时,经常会出现ora-01000: maximum open cursors exceeded异常 for(int i=0;i<balancelist.size();i++) { prepstmt = conn.prepareStatement(sql[i]); prepstmt.setBigDecimal(1,nb.getRealCost()); prepstmt.setString(2, adclient_id); prepstmt.setString(3, daystr); prepstmt.setInt(4, ComStatic.portalId); prepstmt.executeUpdate(); } 1. 检查数据库中的 OPEN_CURSORS 参数值。 Oracle 使用 init.ora 中的初始化参数 OPEN_CURSORS 指定一个会话一次最多可以拥有的游标数。缺省值为 50。要获得数据库中 OPEN_CURSORS 参数的值,可以使用以下查询: SQL> show parameter open_cursors; NAME TYPE VALUE ------------------------------------ ----------- --------------- open_cursors integer 1000 重要的是将

大数据量数据库优化

血红的双手。 提交于 2019-12-19 06:31:06
大数据量数据库优化 一、数据库结构的设计 如果不能设计一个合理的数据库模型,不仅会增加客户端和服务器段程序的编程和维护的难度,而且将会影响系统实际运行的性能。所以,在一个系统开始实施之前,完备的数据库模型的设计是必须的。 在一个系统分析、设计阶段,因为数据量较小,负荷较低。我们往往只注意到功能的实现,而很难注意到性能的薄弱之处,等到系统投入实际运行一段时间后,才发现系统的性能在降低,这时再来考虑提高系统性能则要花费更多的人力物力,而整个系统也不可避免的形成了一个打补丁工程。 所以在考虑整个系统的流程的时候,我们必须要考虑,在高并发大数据量的访问情况下,我们的系统会不会出现极端的情况。(例如:对外统计系统在7月16日出现的数据异常的情况,并发大数据量的的访问造成,数据库的响应时间不能跟上数据刷新的速度造成。具体情况是:在日期临界时(00:00:00),判断数据库中是否有当前日期的记录,没有则插入一条当前日期的记录。在低并发访问的情况下,不会发生问题,但是当日期临界时的访问量相当大的时候,在做这一判断的时候,会出现多次条件成立,则数据库里会被插入多条当前日期的记录,从而造成数据错误。),数据库的模型确定下来之后,我们有必要做一个系统内数据流向图,分析可能出现的瓶颈。 为了保证数据库的一致性和完整性,在逻辑设计的时候往往会设计过多的表间关联,尽可能的降低数据的冗余。(例如用户表的地区

SQL 游标

人走茶凉 提交于 2019-12-19 04:10:38
DECLARE My_Cursor CURSOR --定义游标 FOR (SELECT * FROM dbo.MemberAccount) --查出需要的集合放到游标中 OPEN My_Cursor; --打开游标 FETCH NEXT FROM My_Cursor ; --读取第一行数据 WHILE @@FETCH_STATUS = 0 BEGIN --UPDATE dbo.MemberAccount SET UserName = UserName + 'A' WHERE CURRENT OF My_Cursor; --更新 --DELETE FROM dbo.MemberAccount WHERE CURRENT OF My_Cursor; --删除 FETCH NEXT FROM My_Cursor; --读取下一行数据 END CLOSE My_Cursor; --关闭游标 DEALLOCATE My_Cursor; --释放游标 GO DECLARE @UserId varchar(50) DECLARE My_Cursor CURSOR --定义游标 FOR (SELECT UserId FROM dbo.MemberAccount) --查出需要的集合放到游标中 OPEN My_Cursor; --打开游标 FETCH NEXT FROM My_Cursor INTO

vim使用

▼魔方 西西 提交于 2019-12-19 03:26:46
vim练习 光标移动 n+空格键 在行内向右跳转n个位置 0 或功能键[Home]:移动到这一行的最前面字符处 $ 或功能键[End]:移动到这一行的最后面字符处(常用) H:光标移动到这个屏幕的最上方那一行的第一个字符 M:光标移动到这个屏幕的中央那一行的第一个字符 L:光标移动到这个屏幕的最下方那一行的第一个字符 G:动到这个档案的最后一行(常用) gg:移动到这个档案的第一行,相当于 1G (常用) nG/ngg:移动到这个档案的第 n 行 n+Enter: 光标向下移动 n 行(常用) 搜索替换 /word:向光标之下寻找一个名称为 word 的字符串。 ?word:向光标之上寻找一个字符串名称为 word 的字符串。 n:这个 n 是英文按键。代表重复前一个搜寻的动作。 N:这个 N 是英文按键。与 n 刚好相反,为『反向』进行前一个搜寻动作。 :n1,n2s/word1/word2/g:n1 与 n2 为数字。在第 n1 与 n2 行之间寻找 word1 这个字符串,并将该字符串取代为 word2 ! 1,$s/word1/word2/g:从第一行到最后一行寻找 word1 字符串,并将该字符串取代为word2 !(常用) :1,$s/word1/word2/gc:从第一行到最后一行寻找 word1 字符串,并将该字符串取代为word2,且在取代前显示提示字符给用户确认

软件架构阅读笔记11

只愿长相守 提交于 2019-12-18 15:07:01
网上关于 SQL优化的教程很多,但是比较杂乱。近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请大家纠正补充。 1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 最好不要给数据库留 NULL,尽可能的使用 NOT NULL填充数据库。备注、描述、评论之类的可以设置为 NULL,其他的,最好不要使用NULL。 不要以为 NULL 不需要空间,比如:char(100) 型,在字段建立时,空间就固定了, 不管是否插入值(NULL也包含在内),都是占用 100个字符的空间的,如果是varchar这样的变长字段, null 不占用空间。 可以在 num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num = 0 3.应尽量避免在 where 子句中使用 != 或 <> 操作符,否则将引擎放弃使用索引而进行全表扫描。 4.应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描,如: select

实现报表数据预先计算

假装没事ソ 提交于 2019-12-18 11:44:11
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 报表应用中,如果数据量较大或计算过程较复杂,往往会导致报表数据源准备过慢,从而影响报表性能。这种情况下可以预先计算报表需要的数据,在呈现时直接引用,使得用户在访问报表时可以迅速地获得响应。 一、当前的手段及弊端 由于报表在访问时常常需要参数,因此显然不可能把所有参数组合对应的报表数据源都准备好,所以预先计算通常只生成中间数据,在呈现时仍然要再进行一些后续的简单计算(如过滤、分组汇总、排序等)。不过即便如此,也不太可能完全由报表工具在中间数据基础上完成所有后续运算,因此报表工具通常只能完成一些小数据量的运算。也就是说,存储的中间数据还需要有有再次计算的能力,所以一般情况下会将中间数据以中间表的形式存储在数据库中,以便在呈现时再借用数据库的计算能力。 采用中间表进行预先计算会存在以下弊端:首先,将过多的计算工作交给数据库做,无疑会加大数据库的压力,甚至反而造成性能不升反降;其次,中间表太多容易导致管理混乱,由于数据库采用非层次结构(与文件系统的树形结构不同),因此大量存在的中间表往往会增加数据库管理难度。此外,从数据库中读取较大的中间表还会出现 I/O 瓶颈,同样会导致报表性能不佳。 二、润乾报表的解决方案 润乾报表的预先计算方案(结合集算器实现)不需要使用数据库中间表,从而可以避免上述弊端

Python3中获取mysql的结果集

不想你离开。 提交于 2019-12-18 06:24:55
目录 起步 查 获取结果 fetchone 情况一 情况二 情况三 fetchmany 情况一 情况二 情况三 fetchall 情况一 情况二 情况三 scroll移动 相对移动 绝对移动 示例代码 起步 #!/usr/bin/python3 # -*- coding: utf-8 -*- """pymysql查询 """ import pymysql conn = pymysql . connect ( user = 'root' , password = '' , host = 'localhost' , port = 3306 , charset = 'utf8mb4' , database = 'hardy2_db' , ) # 游标类型 cursor = conn . cursor ( cursor = None ) # cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) 查 sql = 'select id, age, name as nickname from pymysql_tb;' affected = cursor . execute ( query = sql ) # 拿到查询到的记录数 # print(affected) # int, 返回受影响的行数数目 获取结果 fetchone cursor

python之pymysql模块(mysql数据库操作)

半世苍凉 提交于 2019-12-18 04:30:25
import pymysql # 连接数据库 conn = pymysql.connect(host='localhost', port=3306, user='root', passwd='12345678', db='test') # 游标默认返回元组 # cursor = conn.cursor() # 游标设置为字典,fetch返回字典格式 cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 执行sql cursor.execute("insert into account (username,password) values ('a','a')") # 让改动更新到数据库 conn.commit() # 获取数据 cursor.execute("select * from account") data = cursor.fetchall() print('移动前',data) # 移动游标 cursor.scroll(0,'absolute') # 绝对位置 # cursor.scroll(1,'relative') 相对位置 data2 = cursor.fetchall() print('移动后',data2) # 获取自增id cursor.execute("insert into account

存储过程及游标使用

与世无争的帅哥 提交于 2019-12-17 03:01:30
存储过程及游标使用 实现test2表向test1表同步 create or replace procedure procedure_test as v_id armcp.test2.id%Type; v_c1 armcp.test2.c1%Type; cursor cursor_test2 is( select t2.id, t2.c1 from test2 t2); begin open cursor_test2; loop fetch cursor_test2 into v_id, v_c1; update test1 t1 set t1.c1 = v_c1 where t1.id = v_id; exit when cursor_test2%notfound; end loop; commit; close cursor_test2; end; 来源: https://www.cnblogs.com/BonnieWss/p/10910944.html