程序员便利贴
分类: 数据库 | 评论

oracle 中 NLSSORT函数的用法 NLSSORT(),用来进行语言排序 拼音 SELECT * FROM TEAM ORDER BY NLSSORT(排序字段名,’NLS_SORT = SCHINESE_PINYIN_M’) 笔划 SELECT * FROM TEAM ORDER BY NLSSORT(排序字段名,’NLS_SORT = SCHINESE_STROKE_M’) 部首 SELECT * FROM TEAM ORDER BY NLSSORT(排序字段名,’NLS_SORT = SCHINESE_RADICAL_M’) /*——增加:yl end–*/ 列表一行汉字 WITH A AS (SELECT ‘获取汉字拼音首字母’ W FROM DUAL) SELECT SUBSTR(W, ROWNUM, 1) FROM A CONNECT BY ROWNUM = [...]

分类: 数据库 | 评论

SQL语句众多,常用的滚瓜烂熟,可不常用的,你就不一定记得了,这里放一些SQL语句,保留字什么的,以备查阅。 SELECT –从数据库表中检索数据行和列 INSERT –向数据库表添加新数据行 DELETE –从数据库表中删除数据行 UPDATE –更新数据库表中的数据 –SQL数据定义 CREATE TABLE –创建一个数据库表 DROP TABLE –从数据库中删除表 ALTER TABLE –修改数据库表结构 CREATE VIEW –创建一个视图 DROP VIEW –从数据库中删除视图 CREATE INDEX –为数据库表创建一个索引 DROP INDEX –从数据库中删除索引 CREATE PROCEDURE –创建一个存储过程 DROP PROCEDURE –从数据库中删除存储过程 CREATE TRIGGER –创建一个触发器 DROP TRIGGER –从数据库中删除触发器 CREATE SCHEMA –向数据库添加一个新模式 DROP SCHEMA –从数据库中删除一个模式 CREATE DOMAIN –创建一个数据值域 ALTER DOMAIN –改变域定义 [...]

分类: 数据库 | 评论
oracle

Oracle数据库所在服务器地址:192.168.3.67 默认端口:1521 服务名:OA10 修改 oracle\ora92\network\admin目录下的tnsnames.ora文件 # TNSNAMES.ORA Network Configuration File: D:\oracle\ora92\network\admin\tnsnames.ora # Generated by Oracle configuration tools. #以下是添加的 SNDEV= (DESCRIPTION= (ADDRESS=(PROTOCOL=TCP)(HOST=192.168.3.67)(PORT=1521)) (CONNECT_DATA= (SID=OA10) ) ) 补充:cmd中doc窗口登录方式为: 先用scott/tiger登录进去,然后conn username/pwd@SNDEV username为用户名 pwd为密码 SNDEV为上面配置的。

分类: 数据库 | 评论

由于工作需要,需要将业务数据库里所有的数据同步到另外一个处理服务器上。在做方案的时候,想了很多方法,当然最快的办法还是使用物理热备的方式。   但是我个人认为如果对于中大型数据库(我们的数据库有300G左右)最佳的选择还是使用SnapShot方式,即快照的方式。   Oracle数据库的快照是一个表,它包含有对一个本地或远程数据库上一个或多个表或视图的查询的结果。也就是说快照根本的原理就是将本地或远程数据库上的一个查询结果保存在一个表中。   以下是我建立的Snapshot,目的是从业务数据库上将数据Copy到处理数据库上,是不同的两个服务器之间对数据copy。   第一步:在处理服务器上的Oracle终端,建立database link,业务数据库服务器SID为TEST   create database link TEST_DBLINK.US.ORACLE.COM   connect to AMICOS identified by AMICOS   using ’test’;   第二步:在业务数据库上对应的表建立快照日志   Create snapshot log on A_Table;   第三步:建立Snapshot 快照名称为:Test_SnapShot   Create snapshot Test_SnapShot   REFRESH COMPLETE START WITH SYSDATE NEXT SYSDATE+1/24   as select * from A_Table@TEST_DBLINK   说明:REFRESH是刷新方法   刷新方式有:COMPLETE和FAST两种,而START WITH是说明开始执行的时间。   Next是下次执行的时间   而AS以后是构成快照的查询方法。   相关的方法:   更改快照   ALTER SNAPSHOT Test_SnapShot   REFRESH COMPLETE START WITH [...]

分类: Java, 数据库 | 评论

mysql 大对象存取: 类型一般应该用mediumblod, blob只能存2的16次方个byte, mediumblod是24次方, 一般来说够用了.longblob是32次方有些大. MYSQL默认配置只能存1M大小的文件,要修改配置,WIN版本的在mysql.ini文件中 修改max_allowed_packet,net_buffer_length等几个参数,或直接SET GLOBAL varName=value. linux版本可以在启动参数后加-max_allowed_packet=xxM等几个参数. MYSQL存大对象最好直接就setBinaryStream,又快又方便. 而不要先插入空再造型成BLOB然后再setBlob 例子: import java.sql.*; import java.io.*; public class DBTest { static String driver = “org.gjt.mm.mysql.Driver”; static String url = “jdbc:mysql://localhost:3306/test”; static String user = “root”; static String passwd = “passwd”; public static void main(String[] args) throws Exception { Connection conn = null; try [...]

分类: 数据库 | 评论

1、首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生欀如一条SQL语句如果用来从一个10万条记录的表中查1条记录,那查询优化器会选择“索引查找”方式,如果该表进行了归档,当前只剩下5000条记录了,那查询优化器就会改变方案,采用 “全表扫描”方式。 可见,执行计划并不是固定的,它是“个性化的”。产生一个正确的“执行计划”有两点很重要: (1)    SQL语句是否清晰地告诉查询优化器它想干什么? (2)    查询优化器得到的数据库统计信息是否是最新的、正确的? 2、统一SQL语句的写法 对于以下两句SQL语句,程序员认为是相同的,数据库查询优化器认为是不同的。 select * from dual select * From dual 其实就是大小写不同,查询分析器就认为是两句不同的SQL语句,必须进行两次解析。生成2个执行计划。 所以作为程序员,应该保证相同的查询语句在任何地方都一致,多一个空格都不行! 3、不要把SQL语句写得太复杂 我经常看到,从数据库中捕捉到的一条SQL语句打印出来有2张A4纸这么长。一般来说这么复杂的语句通常都是有问题的。我拿着这2页长的SQL语句去请教原作者,结果他说时间太长,他一时也看不懂了。可想而知,连原作者都有可能看糊涂的SQL语句,数据库也一样会看糊涂。 一般,将一个Select语句的结果作为子集,然后从该子集中再进行查询,这种一层嵌套语句还是比较常见的,但是根据经验,超过3层嵌套,查询优化器就很容易给出错误的执行计划。因为它被绕晕了。像这种类似人工智能的东西,终究比人的分辨力要差些,如果人都看晕了,我可以保证数据库也会晕的。 另外,执行计划是可以被重用的,越简单的SQL语句被重用的可能性越高。而复杂的SQL语句只要有一个字符发生变化就必须重新解析,然后再把这一大堆垃圾塞在内存里。可想而知,数据库的效率会何等低下。 4、使用“临时表”暂存中间结果 简化SQL语句的重要方法就是采用临时表暂存中间结果,但是,临时表的好处远远不止这些,将临时结果暂存在临时表,后面的查询就在tempdb中了,这可以避免程序中多次扫描主表,也大大减少了程序执行中“共享锁”阻塞“更新锁”,减少了阻塞,提高了并发性能。 5、 OLTP系统SQL语句必须采用绑定变量  select * from orderheader where changetime > ’2010-10-20 00:00:01′ select * from orderheader where changetime > ’2010-09-22 00:00:01′ 以上两句语句,查询优化器认为是不同的SQL语句,需要解析两次。 如果采用绑定变量 select * from orderheader where changetime > [...]

分类: 数据库 | 评论

1.数据库的对象: 1)优化表的类型: 2) 数据库表设计时候更小的占磁盘空间尽可能使用更小的整数类型.(mediumint就比int更合适) 3) 所有字段都得有默认值 4) 选择合适表类型(InnoDB或者myisam) 2,优化sql语句: 1)通过show status了解各种sql的执行频率 show status like ‘Com_%’ 了解 Com_select,Com_insert 的执行次数 2) 通过Explain分析低效的sql语句 3) 建立合适的索引 4) 通过show status like ‘Handler_%’查看索引的使用情况 handler_read_key表明索引效率的很高 Handler_read_rnd_key的值很高,表明查询运行效率很低 5) 定期分析表和检查表 analyze table test_table和check table test_table 然后查看Msg_text字段的值是否是ok 6)定期优化表 optimize table test_table 如果对表的字段varchar blob,text等进行了很多更改, 则撒花用 7) 优化 order by orgroup by等 3,锁的问题 1) MyISAM为表级锁 由于MyISAM写进程优先获得锁,使得读锁请求靠后等待队列 如果在大量更新操作的情况下,使得很难获得读锁。从而造成阻塞。 [...]

分类: Java, 数据库 | 评论

Java防SQL注入,最简单的办法是杜绝SQL拼接,SQL注入攻击能得逞是因为在原有SQL语句中加入了新的逻辑,如果使用PreparedStatement来代替Statement来执行SQL语句,其后只是输入参数,SQL注入攻击手段将无效,这是因为PreparedStatement不允许在不同的插入时间改变查询的逻辑结构,大部分的SQL注入已经挡住了,在WEB层我们可以过滤用户的输入来防止SQL注入比如用Filter来过滤全局的表单参数。 import java.io.IOException; import java.util.Iterator; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 通过Filter过滤器来防SQL注入攻击 * */ public class SQLFilter implements Filter { private String inj_str = “‘|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare|; |or|-|+|,”; protected FilterConfig filterConfig = null; /** * Should a character encoding specified by the client be ignored? [...]

分类: 数据库 | 评论

1.授权 –授权app用户从指定IP访问数据库的所有权限 grant all privileges on *.* to ‘app’@’10.200.12.232′ identified by ‘app1234′; –授权app用户从指定IP访问downloaddb数据库的表(增删改查) GRANT select,insert,update,delete ON downloaddb.* TO ‘app’@’10.200.12.199′ IDENTIFIED BY ‘app1234′ WITH GRANT OPTION; 2.刷新权限 –刷新权限 FLUSH PRIVILEGES;

一、JDBC连接DB2 Class.forName(“Com.ibm.db2.jdbc.net.DB2Driver”); String url=”jdbc:db2://dburl:port/DBname” cn = DriverManager.getConnection( url, sUsr, sPwd ); 二、JDBC连接Microsoft SQLServer(microsoft) Class.forName( “com.microsoft.jdbc.sqlserver.SQLServerDriver” ); cn = DriverManager.getConnection( “jdbc:microsoft:sqlserver://DBServerIP:1433;databaseName=master”, sUsr, sPwd ); 三、JDBC连接Sybase(jconn2.jar) Class.forName( “com.sybase.jdbc2.jdbc.SybDriver” ); cn = DriverManager.getConnection( “jdbc:sybase:Tds:DBServerIP:2638″, sUsr, sPwd ); 四、JDBC连接MySQL(mm.mysql-3.0.2-bin.jar) Class.forName( “org.gjt.mm.mysql.Driver” ); cn = DriverManager.getConnection( “jdbc:mysql://DBServerIP:3306/myDatabaseName”, sUsr, sPwd ); 五、JDBC连接PostgreSQL(pgjdbc2.jar) Class.forName( “org.postgresql.Driver” ); cn = DriverManager.getConnection( “jdbc:postgresql://DBServerIP/myDatabaseName”, sUsr, sPwd [...]

分类: 数据库 | 评论

1.存储过程的开头结尾 SET QUOTED_IDENTIFIER ON/OFF SET QUOTED_IDENTIFIER ON GO SET ANSI_NULLS ON GO ……. SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO 简单的说:SET QUOTED_IDENTIFIER ON/OFF SET QUOTED_IDENTIFIER ON 这种情况,我们可以使用关键字(”select” “update” 等)作为对象名(表名) 而SET QUOTED_IDENTIFIER ON 这种情况,我们不可以这么使用,因为系统会解析”select”,”update”等为关键字 一般的情况用不着,除非你想要把对象名称定义成这样 2.SET ANSI_NULLS {ON | OFF} 指定在对空值使用等于 (=) 和不等于 (<>) 比较运算符时,这些运算符的 SQL-92 遵从行为。 SQL-92 标准要求对空值的等于 (=) 或不等于 (<>) 比较取值为 FALSE。当 SET [...]

分类: 数据库 | 评论

有些不准确的,请指正 1.查看数据库版本 MSSQL: select @@version; MySQL: select version(); ORACLE: select * from v$version; 2.查看当前用户名 MSSQL: select user_name(); MySQL: select user(); ORACLE: select user from user_tables;  select username from v$session; 不知道是不是这样 3.查看当前数据库名 MSSQL: select db_name(); MySQL: select database(); Oracle: select name from v$database; show parameter db_name; 好象是多行,这个不对 oracle还有实例名 select instance_name from v$instance; show parameter instance 4.查看所有数据库名 MSSQL: [...]

分类: 数据库 | 评论

windows中手工删除ORACLE数据库 1.以Administrators group身份登陆windows系统。 2.通过oracle installer 卸载所有orcle产品及组件。 3.停掉Oracle Service服务。 4.删除%ORACLE_base%文件和SYSTEM_DRIVE:\program files下的oracle文件。 .删除SYSTEM_DRIVE:\Documents and Settings\All Users\「开始」菜单\程序中的oracle项。 6.打开注册表 到HKEY_CLASSES_ROOT下,删除以Oracle,ORA,ORCL开头的键; 到HKEY_LOCAL_MACHINE\SOFTWARE下,删除ORACLE键和Apache Group键; 到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services下,删除以oracle开头的键; 到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services \Eventlog\Application下,删除以oracle开头的键; 到HKEY_CURRENT_USER下,删除ORACLE键; 到HKEY_CURRENT_USER\SOFTWARE\ORACLE下,删除以Oracle 或 ORCL开头的键(如果有的话); 关闭注册表,重启计算机。 7.打开系统系统环境变量(我的电脑->右键->系统属性->高级->环境变量),在PATH中删除所有以%ORACLE_HOME%开始的项。、 8.重启计算机。

分类: 数据库 | 评论

oracle自动备份 @echo off set curdate=%date:~0,4%%date:~5,2%%date:~8,2% set backuppath=E:\oracle\databak\%curdate% md %backuppath% exp fnfloa/fnfloauser@orcl file=%backuppath%\fnfloa%curdate%.dmp log=%backuppath%\fnfloa%curdate%.log %date:~0,4%:取得年份 %date:~5,2%:取得月份 %date:~8,2%:取得日 md %backuppath% 建立目录 设置好bat文件后,就可以在计划任务中使用了,选择好备份时间,那么系统将自动备份了。

分类: 数据库 | 评论

这几天做项目,因为关系到从MYSQL向Oracle的迁移,所以,有了一些经验。 因为项目一开始就是用MYSQL开发的,所以没想到会出现的问题都出现了。 一、MYSQL可以导入导出脚本,本来应该准备好数据库的备份的初始化数据库和初始化数据的两个初始化脚本,经由MYSQL导出为一个full.sql的总的初始化脚本,用过mysql的都知道,导出的数据库脚本中,包含了建库、建表、以及插入数据的语句。需要分割成两个:建库、建表的初始化脚本和插入数据的初始化脚本。于是我写了一个类,用于分割SQL脚本,在类中,我查找到create table开头的后面紧跟着的字符串,就是表的名字,取出insert开头的语句,改行就是插入数据的,于是,通过文件流读取文件的每一行,如果是插入的取出来放入一个方法convertInsertSQL处理后写入一个脚本文件insert_data.sql中,剩下的写入一个脚本文件create_table.sql中, 方法convertInsertSQL对于插入语句做处理,因为脚本中的插入语句是批量插入的,insert into 表名(列名) values(对应值),( 对应值),( 对应值),所以需要拆分成insert into 表名(列名) values (对应值)这样的语句,所以我通过将前面values(前的值截取后,对剩下的所有对应数据,进行通过),(用正则分割成String数组,对数组进行循环,每次追加组成插入语句,最后将插入语句全部返回后写入文件流。 package com.test.file; import  java.io.BufferedReader; import  java.io.BufferedWriter; import  java.io.File; import  java.io.FileInputStream; import  java.io.FileOutputStream; import  java.io.IOException; import  java.io.InputStreamReader; import  java.io.OutputStreamWriter; import  java.util.HashMap; import  java.util.Map; /** * 将mysql数据库导出的脚本 * 分割成为建库和建表的两个脚本 * @author gaofei * */ public class MyFileReader { /** * @param args */ [...]