
数据库
luocm
生命是一段旅程,要珍惜当下
展开
-
SQL注入攻击尝试
SQL注入是在web开发中,不得不考虑的一个问题,近些年已经得到了较充分的重视。一般新手不注意的话,写出的程序容易被SQL注入攻击。比如笔者试了下面这样一个用户登录的页面(代码见附录)数据库为mysql,用户表为userinfo,通过sql注入,就可以随意登录。登录方式1用户名: or 1=1 or 1=1密码:任意select count(*) from userinfo where use原创 2007-06-17 21:59:00 · 9311 阅读 · 1 评论 -
大表插入关闭日志,提高效率
若大批量插入数据,每插入一条记录,都会生成一条日志记录,可能速度会很慢。这时我们在插入时不生成日志。修改表为NOLOGGING,再在插入语句中嵌入/*+append*/提示ALTER TABLE LCM_TASHARECURRENTS NOLOGGING; INSERT /*+append*/INTO LCM_TASHARECURRENTSSELECT * FROM tasharecurr原创 2007-05-14 18:44:00 · 1237 阅读 · 0 评论 -
磁盘空间不足,表空间扩展失败
windows平台上的Oracle9i,安装在D:/oracle目录下,剩余空间800k左右,执行了一条插入语句,记录数约450万行。结果报错,说表空间无法扩展。先将D盘腾出13G左右的空间,再登录OEM后,将UNDOTBS1表空间的数据文件大小从570M,扩大到1,680M。之后重复执行插入语句,顺利执行。修改一下系统参数alter system set undo_retention=0;(原创 2007-05-14 18:59:00 · 1614 阅读 · 0 评论 -
SQLServer附加数据库报错
EXEC sp_attach_db @dbname = NAdventureWorks, @filename1 = NC:/Program Files/Microsoft SQL Server/MSSQL.1/MSSQL/Data/AdventureWorks_Data.mdf, @filename2 = NC:/Program Files/Microsoft SQL Ser原创 2007-05-17 09:04:00 · 936 阅读 · 0 评论 -
oracle自定义函数的执行时间
oracle中的pl/sql代码会涉及到两个执行引擎,一个专门处理标准的SQL语句,另外一个处理pl/sql的过程代码,一般在引擎切换上会带来cpu额外的开销。比如foreach循环语句和普通for循环的区别,就是foreach消除了引擎切换,一直驻留在执行标准SQL的引擎中,从而缩短了执行时间。现在有一个客户信息表tacustomer, 包含了birthday, certificatetype,原创 2007-05-24 09:32:00 · 1302 阅读 · 0 评论 -
mysql的jdbc驱动程序bug
在windows2003机器上,服务器端版本为5.1.14-beta-community-nt-log MySQL Community Server (GPL),原先用的驱动程序版本为 mysql-connector-java-5.0.5-bin.jar,java代码为: conn = DriverManager.getConnection(url, user, pass原创 2007-05-30 23:11:00 · 1413 阅读 · 0 评论 -
初试oracle的imp/exp工具
imp/exp专门用来进行联机热备份(逻辑备份),dump一个文件,具体命令帮助可通过imp help=y或exp help=y命令来查看。笔者需要将生产系统上的某个用户下的所有对象都复制到测试库上,所以决定采用exp/imp来实施。首先编写导入导出的参数文件:-------------D:/Harvest/data/exp_vm.txtUSERID=vm/jsvm@jsdcbakOWNER=原创 2007-06-05 13:33:00 · 1464 阅读 · 0 评论 -
DBF文件导入到oracle尝试
DBF文件可能是Visual Foxpro格式的,用excel也能打开,但由于excel行数有65536的上限,所以当dbf文件很大,记录数超过65536时,excel文件会截断超过65536的哪些记录。1. 采用SQLServer的导入导出向导首先,采用SQLServer的导入导出向导,结果发现不管数据源采用何种dbf驱动程序(dBase III / IV / 5,Driver do Mi原创 2007-06-05 10:54:00 · 18611 阅读 · 0 评论 -
PL/SQL变量定义规则
学习了一下Introduction to Oracle9i(PLSQL 1),发现变量定义这块还颇有些讲究。比如标识符的非法字符、大小写是否敏感、嵌套定义、变量常量、初始值等等。看了培训材料中的介绍,写了如下的代码进行试验,加深理解。>DECLARE -- 变量声明格式:identifier [CONSTANT] datatype [NOT NULL] [:= | DEFAULT ex原创 2007-06-12 13:42:00 · 3693 阅读 · 0 评论 -
sql语句的case-end语句的疑似bug经历
给客服部做客户分级服务的客户信息设置。要求根据客户历史积分、客户投资成本两个指标对客户进行评级。客户级别分为4级: 级别1-integral介于[0, 8188]或者investcost介于[ 0, 50000] 级别2-integral介于[8188, 15888]或者investcost介于[ 50000, 500000] 级别3-integral介于[15888, 9888原创 2007-10-15 16:46:00 · 1048 阅读 · 0 评论 -
批量更新与逐条更新分块提交的一次实例:修改客户信息表700万条中50万条记录
批量修改tacustomer表(5万-几十万不等),耗时几个小时,导致tacustomer锁表时间过长,引起ccentric,网站无法登录。由于该表上有3个触发器,11个索引,更新效率很低,同时该表是客户信息表,访问频度非常高。 现执行语句为: /* Formatted on 2008/04/28 12:50 (Formatter Plus v4.8.7) */ UPDATE ta.t原创 2008-04-28 13:59:00 · 3068 阅读 · 0 评论 -
使用PL/SQL简化后台数据录入的一个小尝试
每次基金发分红公告,都需要将分红信息录入到后台的一张数据表中,该表用于计算周/月/半年等周期的涨跌幅。涉及5个日期字段,其中一个还要判断T-1(工作日)。若手工编写sql语句,很容易弄昏头(已经被折磨快半年了)。为了缩减工作量,都快打算写个前台处理程序啥的,不过转念一想,这样工作量会比较大比较耗时,此外,也只是偶尔使用一下,意义不大。后来就想用到用PL/SQL的变量来解决,试了一下还支持中文变量名原创 2008-05-06 12:27:00 · 1267 阅读 · 0 评论 -
oracle的asciistr函数惹祸了(在9i和10g上运行输出结果不一致)
从oracle9i升级到10g之后,意外地发现ascii函数在9i和10g上输出结果不一致,两个库的字符集设置完全相同,难道跟操作系统平台(9i:9.2.0.7.0安装在solaris操作系统上,10g:10.2.0.3.0安装在AIX操作系统上)有关?是否跟底层的C语言类库有关系?到metalink、google上搜了一圈没有找到解决方案,在itpub的“oracle高级管理”论坛里发了个贴原创 2008-07-11 11:21:00 · 2605 阅读 · 0 评论 -
oracle中如何判断字符串是否全为数字,以及从任意字符串中提取数字
本文介绍了判断字符串是否全为数字的4种办法,另外还介绍了一个translate函数的小技巧,从任意字符串中提取数字(调用2次translate函数)。这个办法是一个公司同事发现的,用起来很方便,但理解起来稍有点困难。1、通过ASCII码判断是否数字,介于[48, 57]之间,(ascii(0) = 48, ascii(9) = 57)2、调用cast函数尝试强制转换成NUMERIC原创 2008-07-14 14:05:00 · 24359 阅读 · 0 评论 -
oracle高水位线的一次模拟测试
经常会遇到一个表,其中只有几条数据,结果查询一下表记录总数,发现特别的慢。这通常是由于oracle高水位线的问题引起的,见[1]。这样的表在实际应用中也不枚胜举,比如短信发送表,一次大批量发送了500万条短信,发完后表的记录全被删除(是delete,而不是truncate掉),之后查询该表会非常慢。原因在于delete操作并不会回收表被删除的空间,导致全表扫描时仍旧需要扫描那些记录已经全部被删除的原创 2008-08-01 14:45:00 · 1559 阅读 · 0 评论 -
sqlplus中的autotrace使用简介
1、为什么要启用autotrace通常,SQL语句调优时,最常用的办法是审视语句的执行计划(execution plan),oracle中优化器可以采用基于成本和基于规则的方式。对于表访问(table full scan, index unique scan, index range scan, index full scan, index fast full scan等)、2表连接(nest l原创 2008-05-30 11:01:00 · 1775 阅读 · 0 评论 -
Oracle的并行查询尝试
分析表,重新估算统计信息ANALYZE TABLE tasharecurrents ESTIMATE statistics;打开或关闭表的并行选项ALTER TABLE tasharecurrents PARALLEL;--ALTER TABLE tasharecurrents NOPARALLEL;启用oracle hint,强制执行计划,分别记录有并行和无并行的执行时间select -原创 2007-05-16 09:49:00 · 1278 阅读 · 0 评论 -
pl/sql developer将结果集输出到excel
每个月的月初要给公司市场体系部门出一些月度统计报表,虽然用asp.net 2.0做了一个前端工具,操作也尽可能的简化,在推广使用中遇到2个问题: 1、业务部门主观上不太接收,以往都是用excel包装好发到他们油箱,现在要改为他们自己上网站上取,有个别同事不愿意。 2、月度统计的数据量比较大,查询耗时过长(个别要5分钟或10分钟)。所以即使将这些查询功能放到asp.net的网站上,也是无法使用,半天原创 2007-08-03 16:08:00 · 5387 阅读 · 0 评论 -
尝试oracle表的rebuild操作
生产系统中有个短信发送表,平均每个月会大批量发送一次群体短信(30~90万条记录),日常应用是一些即时短信,每天发送量在1000条~10000条左右。前几天突然发现查询很慢(在PL/SQL Developer工具中查出第一页要1秒左右,select * from tox.sm_send_sm_list,而一般的表只需0.01秒左右)。经检查,发现表上没有收集统计信息。查看表统计信息的查询语句如原创 2007-06-21 10:15:00 · 6497 阅读 · 0 评论 -
greatest/least vs. max/min内建oracle函数
使用Oracle9i数据库已经快2年了, sql语句编写及查询优化均有所涉及。对于oracle的内建函数也基本都用过。比如针对字符型、数值型、日期型的单行处理函数(substr / length / instr..., sin / cos /..., to_date / to_char / month_between / ...) ;聚合运算(max / min / avg / sum / ...原创 2007-06-21 23:24:00 · 5969 阅读 · 0 评论 -
使用oracle的表、字段注释
随着表数目的增加,数据库应用系统的开发及维护难度也增大了。最常见的是表、字段的含义,光凭记忆来做比较费劲,不但容易出错,而且不利于知识传播。假设换了个DBA或开发人员,那又得从头开始熟悉一遍库表结构。所以,文档(或叫数据字典)的编写是非常必要的,文档的内容也要尽可能与库表一致,及时更新。笔者在实际项目中,就遇到这样的问题。常用表有5个左右,但每个表上的字段很多,二三十个或以上。操作久了,也只能原创 2007-06-25 22:39:00 · 2212 阅读 · 0 评论 -
oracle分析函数lag/lead不能计算日期型数据?
一个表中包含日期型字段,使用lag或lead函数时,若lag/lead的第一个参数为日期型字段,会报错“ORA-00932:不一致的数据类型:要求DATE 得到的却是 NUMBER”。百思不得其解,将日期型字段用to_char换成字符串后,再调用没有问题(若要得到日期再用to_date转化,代码上稍微麻烦一点)测试用例:SELECT seq ,t.mydate --,原创 2007-06-27 21:06:00 · 2800 阅读 · 1 评论 -
初试oracle中synonym的使用
数据中心有TA和VM两个用户,原来TA底下有一个Package,名叫pckg_dw_cust_query,在asp.net应用程序中都是通过ta.pckg_dw_cust_query来调用的,现在由于程序的改动,将这个包移到vm用户下面去了。此时,网站程序中原来调用ta.pckg_dw_cust_query查询数据的页面报错。对于这个问题,通过创建一个synonym可以完美的解决(即asp.n原创 2007-06-28 09:35:00 · 3754 阅读 · 2 评论 -
Connection.close()的实现解析
在写JDBC代码时,一般都会用如下的“八股文”的形式:Connection conn = null;PreparedStatement pstmt = null;ResultSet rs = null;try { conn = getConnection(); pstmt = conn.prepareStatement("select * from booktab"); rs = ps原创 2007-07-02 23:51:00 · 13871 阅读 · 0 评论 -
表连接的乘数放大效应bug
经常要给业务部门提数据,其中要统计一个管理费,按照客户经理、基金帐号的顺序进行汇总。要关联好几个表tasharecurrents(基金份额流水),t_cus_manager_associate(客户经理与客户对应关系表),tafundtype(基金基本信息),taaccoinfo(基金帐号信息),tafundday_add(基金365日每日净值)。在t_cus_manager_associate.原创 2007-07-10 16:26:00 · 1277 阅读 · 0 评论 -
rownum和order by的组合妙用
业务部门要求计算基金交易的手续费,包括申购/赎回/转换等操作,要考虑基金公司和代销机构的分成比例。大致业务规则如下:--交易手续费计算,区分转换和非转换两种情形,关注手续费分割比例表t_mafee_divide_ratio--分割指的是代销机构(如银行、券商)和基金公司之间的分成(比例在[0, 1]之间,表示代销机构的提成比例)--交易费用=commission + agencyfee + sta原创 2007-07-10 17:47:00 · 1067 阅读 · 0 评论 -
oracle9i的rowid的解析
oracle的rowid是记录行的唯一标识,一般会包含相对文件号、块号、槽号(块内序号)的信息。其值的含义可参见官方文档。在一些技术blog上也有详细的描述,如http://zhouwf0726.itpub.net/post/9689/196733和http://blog.oracle.com.cn/index.php/12012/action_viewspace_itemid_4684.htm原创 2007-07-12 13:07:00 · 1081 阅读 · 0 评论 -
基金净值短信内容的拆分
单条短信长度有限制,为64或60个字符,尾部预留6个公司标识([XXXX]),如果短信内容超长这个限制,需要分拆成两条或多条。实际应用中碰到一个问题,运用定长拆分时,一个完整的数字可能被截断,造成短信阅读困难。所以需要用程序加以控制,如下面的净值短信需要拆分,数值部分可能需要新起一条短信。7月9日净值:成长1.4394增长3.761稳健1.039债券1.190服务3.414保本1 .553超短原创 2007-07-10 15:53:00 · 1924 阅读 · 0 评论 -
用dump函数来了解oracle的数据类型存储方式
问题:1. oracle中number,char/varchar,date等数据类型是怎么存储的?字节流是什么样的?2. 各种数据类型占用的字节长度是多大?SELECT dump(1), DUMP(123456), DUMP(-123456), DUMP(1234567890123456) -- 整数--SELECT DUMP(123456.789), DUMP(-123456.789), d原创 2007-07-12 13:44:00 · 5595 阅读 · 1 评论 -
误操作:drop了一个生产系统上的表
将一个客户交易信息表给误 删了,虽然不是一线业务系统中的交易表,但也足够吓人的。客服座席callcenter、网站web,网上交易都受到影响,导致不可用,比较吓人。只好用逻辑备份,恢复被drop表的数据,中断了1:30小时的时间。教训:1、drop表和truncate操作实在是太危险了,执行前一定要反复确定无误,否则后果很严重。2、尽可能在测试库或开发环境上编写SQL,在生产系统上直接修改风险原创 2007-04-18 13:20:00 · 964 阅读 · 0 评论 -
Oracle Expert和SQL Anyalze无法登录
要求登录 Oracle Management Server或独立资料档案库,可能是不知道两个登录的用户密码信息,导致无法登录。暂时未找到解决方案。原创 2007-04-24 14:51:00 · 721 阅读 · 0 评论 -
Oracle聚簇表
tacustomer有200万左右的记录数,记录长度上限(各个字段最大长度之和,如VARCHAR2(100)视作最长100个字节)约800个字节。taaccoinfo表约200万,记录长度上限为788个字节。两个表以customerid为关联字段,一个customer对应多个taaccoinfo.taaccountid(基本是1对1或1对2关系)。两表连接,若各自表上没有选择过滤条件,则执行时分别原创 2007-04-24 14:23:00 · 1542 阅读 · 0 评论 -
import表时,表空间不足导致产生ORA-00604错误
导入tacustomer表,记录数200万左右,单条记录的长度上限约为800Byte,但一般都在200Byte以下。从PL/SQL Developer中执行导入程序3分钟左右后,自行停止。想把tacustomer表drop掉,结果报错:察看bdump/alert_oralot.log文件,发现如下信息:Wed Apr 25 09:21:54 2007ORA-1653: unable t原创 2007-04-25 15:38:00 · 1339 阅读 · 0 评论 -
Oracle中NULL值操作简述
一个老生常谈的问题,前人已有描述,读者可参考http://www.51cto.com/art/200511/10681.htm(Oracle中null的使用详解)。不过,在实际编写pl/sql语,不小心仍旧会犯错误,有鉴于此,记录下来以便日后查询方便,避免犯低级错误。本文以Oracle中null值为例,其它数据库如DB2,SQLServer,Sybase等大同小异。1、四则运算包含null值的原创 2008-06-04 16:25:00 · 2579 阅读 · 0 评论