不同数据库之间数据转移经验总结

时间:2019-05-14 17:36:54下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《不同数据库之间数据转移经验总结》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《不同数据库之间数据转移经验总结》。

第一篇:不同数据库之间数据转移经验总结

不同数据库之间数据转移经验总结 http://

不知道是不是自己幸运还是不幸,工作就一年的时间,我却接触了两次程序改版,而且是之间将其他语言写的程序改成php的。我其实觉得这是幸运。第一个是.net写的一个导医系统,使用的access数据库,第二个是.net写的一个内容管理系统,使用的sqlsever数据库。都要改为php+mysql的。从这两次经验中,我的确是学到了不少东西。并且也千万不要以为是多么复杂的事情,虽然是有点复杂。

既然是程序改版,当然就要涉及到原来数据的转移,虽然时下有不少所谓的数据转移工具,但是我们学习程序的人也知道,不同的数据库结构设置等等肯定有差别,而且还有令很多人头疼的编码问题,对于编码问题,我也是有一些研究的,过几天会写一个有关程序编码的问题的总结。今天我主要是说说我们怎么来做不同数据库之间的数据转移。授人以鱼不如授人以渔。相信对要做类似功能(比如数据处理、往期数据分析、数据转移等)的程序员有一定的帮助。

首先的前提是,不要奢望有最便捷成型的现成程序或软件来帮你,最好就是通过自己熟悉的语言,自己动手写程序来转移。

程序数据转移以我的方式来分的话可以分为两大类,当然可以更加细分。第一类是:由其他程序转移到自己专业的开源程序;第二类是由其他程序转移到自己专业的自己开发或自己团队开发的私有程序。不要小看,这有很大的不同。如果是转移到开源程序,虽然人家是开源的,但是不见得我们就完全熟悉人家的每个功能与设计吧,尤其是数据库字段的设计。那么我们在数据转移前就要仔细分析其数据库、表设计,而如果是自己的程序,就相对从容了许多。而来源数据因为是自己不熟悉,甚至是根本不知道的程序写的,那更要分析了,这就不用说了。

那么首先就先说说分析数据,1是分析旧版程序,程序都是相通的,有的时候我们转移数据并一定是说有数据,可能有的你只要转移文章表,转移较之采集(虽然也可以用采集实现)的好处就是可以保证数据的高度一致,就是id这个字段也一样,因为文章很多都是用id组合的文件名、路径,这样我们就可以通过配合栏目目录保证文章的路径不变。如果是内容管理系统类的旧程序,最好也是往自己熟悉的开源程序上转,以为这些开源程序历经时间的考验真的是相当的完善,至少要比你自己考虑的要全面很多,比如织梦、帝国这样的开源程序,其巧妙的模型设计几乎可以让我们实现任何功能。而一些系统类、功能类的程序,可能用一些这样的内容管理开源程序就不合适了,最好就是自己开发了。而分析旧版程序也没有必要让你直接学会另一门语言,我们只需要通过后台、数据库、前端,来弄清楚数据的结构,展示、分类、等等。比如文章类的,我们要找清楚对应的分类,对应的表在哪里,是单独的表还是所有分类都是用的一个表(这个很重要),就足够了,因为内容类的,我们几乎就是需要其文章内容;而系统类的,就比较麻烦一点,人家可能要求尽可能保证原来所有的数据,那我们在没有旧版程序开发说明书的情况下就要自己摸索了,最好能自己装个测试版,一个功能一个功能的来分析,今天操作,记录数据库数据变化,结合其字段注释,自己的尝试经验等来分析各个字段的意义。弄清楚了这个就好办了,一个系统真正复杂的表其实也没几个,先从简单的入手,因为表直接可能是有联系的,你简单的不明白是不可能弄懂其在别的表作为外键时的意义的。并且最好是有测试人员或辅助人员,因为自己很容易就弄乱。

2是分析新版系统,新版系统针对的是我们使用的开源系统,最重要的一点就是要添加测

试数据测试,因为一般情况下我们都知道数据库设计的时候都是有一些默认或初始值的,在我们搞不清楚字段初始值是怎样的情况下,可以在开源程序中加一个默认数据,根据这条数据,来判断默认值,这样在转移的时候一定注意给这些需要加初始值的字段添加正确的初始值(虽然数据设计中可能有的会自动加初始值,但是在一些特殊情况下回不起作用,所以要注意)。

分析数据是一个比较繁琐的事情,但是,我们在分析数据的时候其实可以和转移程序开发同时进行,这个转移程序是数据转移的重点,只是单纯的分析,永远也搞不清楚,有的时候做事情要先着手去做,做的过程中就会有了思路。下面就说说如何做转移程序。

我是学php的,当然做的这两个项目都是改成php程序,但是无论什么程序,基本都会有操作不同数据库的接口,类库或者扩展等等,php就有很多,几乎可以操作所有类型的数据库,不过,其操作不同数据库的能力是不同的,比如,php对mysql的操作几乎是最方便的,而对sqlsever和access的操作就弱了一些,虽然有一些类库,但是有的时候因为版本的不同而无法使用,所以我们要尽量的从底层代码来写转移程序,有的时候,我们也可以通过一些中间手段,就比如字符编码一样,所有编码都可以和utf-8进行转换,我要在另外两者间转换,可以通过utf-8作为中间人。数据转移也是一样,有的时候我们通过自己的程序很难操作人家的数据库,但是他可以转换为一个你可以操作的数据库也可以。以mysql来说,mysql可以存储为sql文件,或者是任何的文件,只需要在里面存储sql语句,用程序读取执行就可以。其他程序也是一样,我们就通过读取出原始数据,用php或你的专业语言,进行sql重组。然后执行插入,而中间要注意的就是一些编码、特殊字符、已经一些字段类型!尽量的让自己写的转移程序体验好一些、也就是智能一些,有比较好的扩张性,可以节省大量代码!其实就是提取封装一下!

任何程序的操作,其实都是对数据的操作!

第二篇:ORACLE数据库开发经验总结

ORACLE数据库开发经验总结

----ORACLE数据库作为大型数据库管理系统,近年来一直占有世界上高端数据库的最大 份额,其强大而完善的数据库管理功能,以及ORACLE公司推陈出新的不断努力,一直成 为IT业界瞩目的焦点。岭澳核电站的数据库平台采用了ORACLE7.3作为后端平台,前端选 择了ORACLE公司的DEVELOPER 2000 及DESIGNER 2000作为开发工具,采用了目前流行的

CLIENT/SERVER模式。本人在ORACLE系统的开发中,就ORACLE的整套开发工具提出一些自

己的体会,供同行参考。

----一.ORACLE SQL PLUS 使用技巧:----①查找重复记录:

SELECT DRAWING,DSNO FROM EM5_PIPE_PREFAB WHERE ROWID!=(SELECT MAX(ROWID)FROM EM5 _PIPE_PREFAB D WHERE EM5_PIPE_PREFAB.DRAWING=D.DRAWING AND EM5_PIPE_PREFAB.DSNO=D.DSNO);----执行上述SQL语句后就可以显示所有DRAWING和DSNO相同且重复的记录。----删除重复记录:

DELETE FROM EM5_PIPE_PREFAB WHERE ROWID!=(SELECT MAX(ROWID)FROM EM5 _PIPE_PREFAB D WHERE EM5_PIPE_PREFAB.DRAWING=D.DRAWING AND EM5_PIPE_PREFAB.DSNO=D.DSNO);----执行上述SQL语句后就可以刪除所有DRAWING和DSNO相同且重复的记录。----② 快速编译所有视图

----当在把数据库倒入到新的服务器上后(数据库重建),需要将视图重新编译一遍,因 为该表空间视图到其它表空间的表的连接会出现问题,可以利用PL/SQL的语言特性,快 速编译。

SQL >SPOOL ON.SQL SQL >SELECT ‘ALTER VIEW ‘||TNAME||’

COMPILE;’ FROM TAB;SQL >SPOOL OFF 然后执行ON.SQL即可。

SQL >@ON.SQL 当然,授权和创建同义词也可以快速进行,如:

SQL >SELECT ‘GRANT SELECT ON ’ ||TNAME||’ TO USERNAME;’ FROM TAB;SQL >SELECT ‘CREATE SYNONYM

‘||TNAME||’ FOR USERNAME.’||TNAME||’;’ FROM TAB;③ 用外联接提高表连接的查询速度

在作表连接(常用于视图)时,常使用以下方法来查询数据: SELECT PAY_NO, PROJECT_NAME FROM A WHERE A.PAY_NO NOT IN(SELECT PAY_ NO FROM B WHERE VALUE >=120000);----但是若表A有10000条记录,表B有10000条记录,则要用掉30分钟才能查完,主要因 为NOT IN要进行一条一条的比较,共需要10000*10000次比较后,才能得到结果。该用外

联接后,可以缩短到1分左右的时间: SELECT PAY_NO,PROJECT_NAME FROM A,B WHERE A.PAY_NO=B.PAY_NO(+)AND B.PAY_NO IS NULL AND B.VALUE >=12000;----④ 怎样读写文本型操作系统文件

----在PL/SQL 3.3以上的版本中,UTL_FILE包允许用户通过PL/SQL读写操作系统文件。如下: DECALRE FILE_HANDLE UTL_FILE.FILE_TYPE;BEGIN

FILE_HANDLE:=UTL_FILE.FOPEN(‘C:’,’TEST.TXT’,’A’);

UTL_FILE.PUT_LINE(FILE_HANDLE,’ HELLO,IT’S A TEST TXT FILE’);UTL_FILE.FCLOSE(FILE_HANDLE);END;----相关UTL_FILE数据库包详细信息可以参见相关资料。----⑤ 怎样在数据库触发器中使用列的新值与旧值

----在数据库触发器中几乎总是要使用触发器基表的列值,如果某条语句需要某列修改 前的值,使用:OLD就可以了,使用某列修改后的新值,用:NEW就可以了。如:OLD.DEPT_ NO,:NEW.DEPT_NO。

----二.ORACLE DEVELOPER 2000使用技巧:

----① 改变FORM(FMX模块)运行时的Runform4.5的题头:

----DEVELOPER2000中FMX默认题头为:Developer/2000 Forms Runtime for Windows

/ NT 你可以改为自己定义的标题,----1.在Form级触发器中添加触发WHEN-NEW-FORM-INSTANCE----2.在此触发器中写如下代码:

set_window_property(FORMS_MDI_WINDOW,TITLE,'POINT SYSTEM 欢迎使用');----② 如何隐藏菜单中的window选项:

----在创建自己的菜单时,最后选项总有window项,下面介绍如何去掉它,----1.创建一个Menu

----2.在Menu中建立一个Item,命名为WINDOW。----3.设置该Item属性如下:----

Menu Item Type:Magic Command Type:Null Magic Item:Window Lable:为空

----③ 怎样创建动态下拉列表List

----Developer 2000 中的列表是通过设置相关属性而完成数据项的列表设置的,但那

只是静态的,有时你想让某项成为动态的列表,随输入数据的改变而改变,就需要动手 去编个小程序。下面详细介绍怎样去做:----有块EBOP_CABLE_ACCOUNT,下有SPECIFICATION数据项,当一进入该模块时,就将

SPECIFICATION项在数据库中存储的值动态显示出来,先在Form4.5中建立一个PRCEDURE,命名为DYN_LIST: PROCEDURE DYN_LIST IS

CURSOR C1 IS

SELECT DISTINCT(SPECIFICATION)FROM EBOP_CABLE_ACCOUNT;CNT NUMBER;i NUMBER;TNAME EBOP_CABLE_ ACCOUNT.SPECIFICATION%TYPE;BEGIN

CLEAR_LIST('EBOP_CABLE_ ACCOUNT.SPECIFICATION');SELECT COUNT(DISTINCT

(SPECIFICATION))INTO CNT FROM EBOP _CABLE_ACCOUNT;open C1;FOR i IN 1..CNT LOOP

FETCH C1 INTO TNAME;EXIT WHEN C1%NOTFOUND OR C1%NOTFOUND IS NULL;ADD_LIST_ELEMENT('EBOP_CABLE_ACCOUNT.SPECIFICATION',i,TNAME,TNAME);END LOOP;DELETE_LIST_ELEMENT('EBOP_CABLE_ACCOUNT.SPECIFICATION',CNT+1);CLOSE C1;END;然后在FORM的WHEN-NEW

-FORM-INSTANCE触发子中加入一行: DYN_LIST;----这样一进入该FMX,就会动态刷新该列表。除此之外,SPECIFICATION数据项改为列 表项。

----④ 当显示多条记录且数据项特别多时,如何组织录入及显示界面:----如上图所示,PRN代码及设备代码在画布1(CONTENT型)上,其它数据项在画布2(ST ACK型)上,所有数据项为一个表的列或一个块的数据项。在拉动水平滚动条时或用TAB或 敲回车键时,将看到全部数据项。这种排布方法适用于数据项特别多又想显示多条记录 时用。主要制作顺序为:先建立两个画布,画布1(CONTENT型),画布2(STACK型),然后

建立块,选画布时用画布1,这样所有项都显示在画布1上,然后选中除PRN代码及设备代 码之外的所有数据项,选TOOLS菜单下的PROPERTIES选项,将这些数据项的CANVAS属性选

为画布2(STACK型),然后调整整体位置就可以了。----⑤ 如何在FORM的受限触发子中提交保存数据

----在FORM中很多触发子是不能用COMMIT WORK语句的,当你在该触发子中使用了UPDA

TE,DELETE等操作并想立即存盘时,就需要COMMIT WORK语句了。首先在服务器端建立D B_SQL_COMMIT这个过程(采用ORACLE7.3数据库),PROCEDURE DB_SQL_COMMIT IS source_cursor integer;ignore integer;V7 NUMBER :=2;BEGIN

source_cursor:=dbms_sql.open_cursor;dbms_sql.parse(source_cursor,'COMMIT WORK',V7);ignore:=dbms_sql.execute(source_cursor);DBMS_SQL.CLOSE_CURSOR(source_cursor);END;----然后在FORM中该触发子中调用过程DB_SQL_COMMIT;就可以了,当然你可以根据自己

需要将该过程加入参数,这样通过参数可以得到执行DML语句的权限。----⑥ 如何在FORM中实现某数据项自动按记录序号加一操作

----设块名为VO,要操作的数据项为VO_ID,在该块中建立块级触发子WHEN-CREATE-REC

ORD,加入如下代码:

:VO_ID:=:System.Trigger_Record;----这样每当生成新记录时VO_ID就会自动加一了。

----⑦ 如何在一个FORM中调用另一个FORM,或在一个块中调用另一个块时显示特定的 记录有时用户会要求在调用另一个FORM时,只显示相关的记录,举例如下,在一个FORM 的块中有一个按钮,在按钮触发子中加入如下代码: DECLARE PM PARAMLIST;BEGIN

PM:=GET_PARAMETER_LIST('PM');IF NOT ID_NULL(PM)THEN

DESTROY_PARAMETER_LIST('PM');END IF;PM:=CREATE_PARAMETER_LIST('PM');......................ADD_PARAMETER(PM,'THE_WHERE', TEXT_PARAMETER,'EM_NAME=''EM4'' AND EM_PROJECT_NAME=''支架预制''');OPEN_FORM('PAYMENT',ACTIVATE,SESSION,PM);END;

----其中EM_NAME,EM_PROJECT_NAME为本FORM某块的数据项,PAYMENT为要调用的FORM 模块。这样通过传递参数列表就可以得到想要的结果。在FORM PAYMENT.FMB中,建立一 参数THE_WHERE,CHAR型,长1000,然后在PAYMENT.FMB中建立FORM级触发子WHEN-NEW-F ORM-INSTANCE,在该触发子中加入以下语句:

IF :PARAMETER.THE_WHERE IS NOT NULL THEN SET_BLOCK_PROPERTY('PAYMENT', DEFAULT_WHERE,:PARAMETER.THE_WHERE);END IF;----其中PAYMENT为要显示的块,这样通过参数传递就得到想要的某些特定条件的数据 了。

----⑧ 在FORM中当有主从块时,连续输入记录如何避免被不断的提示保存:

----每输入一条主记录和若干条该主记录的从记录后,此时再导航到主块输下一条记录,FORM就会提示你是否要保存记录,而你并不希望FORM提示,让它自动保存,此时你可 以到Program Units中找到过程PROCEDURE Clear_All_Master_Details,然后在这个过程 中找到语句

Clear_Block(ASK_COMMIT);----将其改为Clear_Block(DO_COMMIT);就可以了。----⑨ 在Report开始时选择排序项:

----在报表开始的Parameter Form中选择报表按哪个数据项排序,----1.先在USER PARAMETER 中创建SORT参数,为字符型,长20。

----2.初始值选’责任方’,然后将这四个值输入到DATA SELECTION中,形成列表。----3.然后处理QUERY中的SQL语句: select CHARGER,FCO_NO,EM_NAME,FCO _NO,DESCRIPTION, FCR_POINT from FCR_MAIN ORDER BY DECODE(:SORT,'责任方',CHARGER,'FCO号', FCO_NO,'FCR号',FCR_NO,'FCR号',EM_NAME)----⑩ 在Developer 2000中如何读写操作系统文件

----在用Developer 2000的开发工具开发应用程序时,经常碰到需要读写外部文件的问

题,可以用ORACLE 带的包TEXT_IO来完成这项需求。例如: DECLARE

IN_FILE TEXT_IO.FILE_TYPE;OUT_FILE TEXT_IO.FILE_TYPE;LINE_BUFER VARCHAR2(80);/*若不用IN_FILE,可以将各字段联接在一起赋值给此变量*/

BEGIN

IN_FILE:=TEXT_IO.FOPEN(‘C:TEMPTEST1.TXT’,’r’);OUT_FILE:=TEXT_IO.FOPEN(‘C:TEMPTEST2.TXT’,’w+’);

LOOP

TEXT_IO.GET_LINE(IN_FILE,LINE_BUFER);TEXT_IO.PUT(LINE_BUFER);TEXT_IO.NEW_LINE;TEXT_IO.PUT_LINE(OUT_FILE,LINE_BUFER);END LOOP;EXCEPTION

WHEN no_data_found THEN

TEXT_IO.PUT_LINE(‘CLOSING THE FILE ,PLEASE WAITING....’);TEXT_IO.FCLOSE(IN_FILE);TEXT_IO.FCLOSE(OUT_FILE);END;----三.数据库管理

----① 在删除一个表中的全部数据时,须使用TRUNCATE TABLE 表名;因为用DROP TAB

LE,DELETE * FROM 表名时,TABLESPACE表空间该表的占用空间并未释放,反复几次DR OP,DELETE操作后,该TABLESPACE上百兆的空间就被耗光了。----② 数据库文件的移动方法

----当想将数据库文件移动到另外一个目录下时,可以用ALTER DATABASE命令来移动(比ALTER TABLESPACE适用性强):

----1.使用SERVER MANAGER关闭实例.SVRMGR > connect internal;SVRMGR > shutdown;SVRMGR >exit;----2.使用操作系统命令来移动数据库文件位置(假设这里操作系统为SOLARIS 2.6).在UNIX中用 mv命令可以把文件移动到新的位置,#mv /ora13/orarun/document.dbf /ora12/orarun----3.装载数据库并用alter database命令来改变数据库中的文件名.SVRMGR > connect internal;SVRMGR > startup mount RUN73;SVRMGR > alter database rename file

> ‘/ ora13/orarun/document.dbf’

> ‘/ ora12/orarun/document.dbf’;----4.启动实例.SVRMGR > alter database open;----ORACLE数据库开发经验总结

第三篇:JDBC连接数据库经验总结

Java数据库连接(JDBC)由一组用 Java 编程语言编写的类和接口组成。JDBC 为工具/数据库开发人员提供了一个标准的 API,使他们能够用纯Java API 来编写数据库应用程序。然而各个开发商的接口并不完全相同,所以开发环境的变化会带来一定的配置变化。本文主要集合了不同数据库的连接方式。

一、连接各种数据库方式速查表

下面罗列了各种数据库使用JDBC连接的方式,可以作为一个手册使用。

1、Oracle8/8i/9i数据库(thin模式)

Class.forName(“oracle.jdbc.driver.OracleDriver”).newInstance();String url=“jdbc:oracle:thin:@localhost:1521:orcl”;//orcl为数据库的SID String user=“test”;String password=“test”;Connection conn= DriverManager.getConnection(url,user,password);

2、DB2数据库

Class.forName(“com.ibm.db2.jdbc.app.DB2Driver ”).newInstance();String url=“jdbc:db2://localhost:5000/sample”;//sample为你的数据库名 String user=“admin”;String password=“";Connection conn= DriverManager.getConnection(url,user,password);

3、Sql Server7.0/2000数据库

Class.forName(”com.microsoft.jdbc.sqlserver.SQLServerDriver“).newInstance();String url=”jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb“;//mydb为数据库 String user=”sa“;String password=”“;Connection conn= DriverManager.getConnection(url,user,password);

4、Sybase数据库

Class.forName(”com.sybase.jdbc.SybDriver“).newInstance();String url =” jdbc:sybase:Tds:localhost:5007/myDB“;//myDB为你的数据库名

Properties sysProps = System.getProperties();SysProps.put(”user“,”userid“);SysProps.put(”password“,”user_password“);Connection conn= DriverManager.getConnection(url, SysProps);

5、Informix数据库

Class.forName(”com.informix.jdbc.IfxDriver“).newInstance();String url = ”jdbc:informix-sqli://123.45.67.89:1533/myDB:INFORMIXSERVER=myserver;user=testuser;password=testpassword“;//myDB为数据库名 Connection conn= DriverManager.getConnection(url);

6、MySQL数据库

Class.forName(”org.gjt.mm.mysql.Driver“).newInstance();String url =”jdbc:mysql://localhost/myDB?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1“ //myDB为数据库名

Connection conn= DriverManager.getConnection(url);

7、PostgreSQL数据库

Class.forName(”org.postgresql.Driver“).newInstance();String url =”jdbc:postgresql://localhost/myDB“ //myDB为数据库名 String user=”myuser“;String password=”mypassword“;Connection conn= DriverManager.getConnection(url,user,password);

8、access数据库直连用ODBC的

Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver“);String url=”jdbc:odbc:Driver={MicroSoft Access Driver(*.mdb)};DBQ=“+application.getRealPath(”/Data/ReportDemo.mdb“);Connection conn = DriverManager.getConnection(url,”“,”“);Statement stmtNew=conn.createStatement();

二、JDBC连接MySql方式

下面是使用JDBC连接MySql的一个小的教程

1、查找驱动程序

MySQL目前提供的java驱动程序为Connection/J,可以从MySQL官方网站下载,并找到mysql-connector-java-3.0.15-ga-bin.jar文件,此驱动程序为纯java驱动程序,不需做其他配置。

2、动态指定classpath 如果需要执行时动态指定classpath,就在执行时采用-cp方式。否则将上面的.jar文件加入到classpath环境变量中。

3、加载驱动程序

try{ Class.forName(com.mysql.jdbc.Driver);System.out.println(Success loading Mysql Driver!);}catch(Exception e){ System.out.println(Error loading Mysql Driver!);e.printStackTrace();}

4、设置连接的url

jdbc:mysql://localhost/databasename[?pa=va][&pa=va]

三、以下列出了在使用JDBC来连接Oracle数据库时可以使用的一些技巧

1、在客户端软件开发中使用Thin驱动程序

在开发Java软件方面,Oracle的数据库提供了四种类型的驱动程序,二种用于应用软件、applets、servlets等客户端软件,另外二种用于数据库中的Java存储过程等服务器端软件。在客户机端软件的开发中,我们可以选择OCI驱动程序或Thin驱动程序。OCI驱动程序利用Java本地化接口(JNI),通过Oracle客户端软件与数据库进行通讯。Thin驱动程序是纯Java驱动程序,它直接与数据库进行通讯。为了获得最高的性能,Oracle建议在客户端软件的开发中使用OCI驱动程序,这似乎是正确的。但我建议使用Thin驱动程序,因为通过多次测试发现,在通常情况下,Thin驱动程序的性能都超过了OCI驱动程序。

2、关闭自动提交功能,提高系统性能

在第一次建立与数据库的连接时,在缺省情况下,连接是在自动提交模式下的。为了获得更好的性能,可以通过调用带布尔值false参数的Connection类的setAutoCommit()方法关闭自动提交功能,如下所示:

conn.setAutoCommit(false);

值得注意的是,一旦关闭了自动提交功能,我们就需要通过调用Connection类的commit()和rollback()方法来人工的方式对事务进行管理。

3、在动态SQL或有时间限制的命令中使用Statement对象

在执行SQL命令时,我们有二种选择:可以使用PreparedStatement对象,也可以使用Statement对象。无论多少次地使用同一个SQL命令,PreparedStatement都只对它解析和编译一次。当使用Statement对象时,每次执行一个SQL命令时,都会对它进行解析和编译。这可能会使你认为,使用PreparedStatement对象比使用Statement对象的速度更快。然而,我进行的测试表明,在客户端软件中,情况并非如此。因此,在有时间限制的SQL操作中,除非成批地处理SQL命令,我们应当考虑使用Statement对象。

此外,使用Statement对象也使得编写动态SQL命令更加简单,因为我们可以将字符串连接在一起,建立一个有效的SQL命令。因此,我认为,Statement对象可以使动态SQL命令的创建和执行变得更加简单。

4、利用helper函数对动态SQL命令进行格式化

在创建使用Statement对象执行的动态SQL命令时,我们需要处理一些格式化方面的问题。例如,如果我们想创建一个将名字O'Reilly插入表中的SQL命令,则必须使用二个相连的“''”号替换O'Reilly中的“'”号。完成这些工作的最好的方法是创建一个完成替换操作的helper方法,然后在连接字符串心服用公式表达一个SQL命令时,使用创建的helper方法。与此类似的是,我们可以让helper方法接受一个Date型的值,然后让它输出基于Oracle的to_date()函数的字符串表达式。

5、利用PreparedStatement对象提高数据库的总体效率

在使用PreparedStatement对象执行SQL命令时,命令被数据库进行解析和编译,然后被放到命令缓冲区。然后,每当执行同一个PreparedStatement对象时,它就会被再解析一次,但不会被再次编译。在缓冲区中可以发现预编译的命令,并且可以重新使用。在有大量用户的企业级应用软件中,经常会重复执行相同的SQL命令,使用PreparedStatement对象带来的编译次数的减少能够提高数据库的总体性能。如果不是在客户端创建、预备、执行PreparedStatement任务需要的时间长于Statement任务,我会建议在除动态SQL命令之外的所有情况下使用PreparedStatement对象。

6、在成批处理重复的插入或更新操作中使用PreparedStatement对象

如果成批地处理插入和更新操作,就能够显著地减少它们所需要的时间。Oracle提供的Statement和 CallableStatement并不真正地支持批处理,只有PreparedStatement对象才真正地支持批处理。我们可以使用addBatch()和executeBatch()方法选择标准的JDBC批处理,或者通过利用PreparedStatement对象的setExecuteBatch()方法和标准的executeUpdate()方法选择速度更快的Oracle专有的方法。要使用Oracle专有的批处理机制,可以以如下所示的方式调用setExecuteBatch():

PreparedStatement pstmt3D null;try {((OraclePreparedStatement)pstmt).setExecuteBatch(30);...pstmt.executeUpdate();}

调用setExecuteBatch()时指定的值是一个上限,当达到该值时,就会自动地引发SQL命令执行,标准的executeUpdate()方法就会被作为批处理送到数据库中。我们可以通过调用PreparedStatement类的sendBatch()方法随时传输批处理任务。

7、使用Oracle locator方法插入、更新大对象(LOB)

Oracle的PreparedStatement类不完全支持BLOB和CLOB等大对象的处理,尤其是Thin驱动程序不支持利用PreparedStatement对象的setObject()和setBinaryStream()方法设置BLOB的值,也不支持利用setCharacterStream()方法设置CLOB的值。只有locator本身中的方法才能够从数据库中获取LOB类型的值。可以使用PreparedStatement对象插入或更新LOB,但需要使用locator才能获取LOB的值。由于存在这二个问题,因此,我建议使用locator的方法来插入、更新或获取LOB的值。

8、使用SQL92语法调用存储过程

在调用存储过程时,我们可以使用SQL92或Oracle PL/SQL,由于使用Oracle PL/SQL并没有什么实际的好处,而且会给以后维护你的应用程序的开发人员带来麻烦,因此,我建议在调用存储过程时使用SQL92。

9、使用Object SQL将对象模式转移到数据库中

既然可以将Oracle的数据库作为一种面向对象的数据库来使用,就可以考虑将应用程序中的面向对象模式转到数据库中。目前的方法是创建Java bean作为伪装的数据库对象,将它们的属性映射到关系表中,然后在这些bean中添加方法。尽管这样作在Java中没有什么问题,但由于操作都是在数据库之外进行的,因此其他访问数据库的应用软件无法利用对象模式。如果利用Oracle的面向对象的技术,可以通过创建一个新的数据库对象类型在数据库中模仿其数据和操作,然后使用JPublisher等工具生成自己的Java bean类。如果使用这种方式,不但Java应用程序可以使用应用软件的对象模式,其他需要共享你的应用中的数据和操作的应用软件也可以使用应用软件中的对象模式。

10、利用SQL完成数据库内的操作

我要向大家介绍的最重要的经验是充分利用SQL的面向集合的方法来解决数据库处理需求,而不是使用Java等过程化的编程语言。

如果编程人员要在一个表中查找许多行,结果中的每个行都会查找其他表中的数据,最后,编程人员创建了独立的UPDATE命令来成批地更新第一个表中的数据。与此类似的任务可以通过在set子句中使用多列子查询而在一个UPDATE命令中完成。当能够在单一的SQL命令中完成任务,何必要让数据在网上流来流去的?我建议用户认真学习如何最大限度地发挥SQL的功能。11 JNDI

username system

password manager

driverClassName

oracle.jdbc.driver.OracleDriver

url

jdbc:oracle:thin:@192.168.0.27:1521:titan

try{

InitialContext ctx=new InitialContext();Object o = ctx.lookup(”java:comp/env/hibernate“);out.print(”class="+o.getClass().getName());DataSource ds=(javax.sql.DataSource)o;}catch(NamingException e){

e.printSatckTrace;}

第四篇:C3E4-教学管理数据库-数据查询

C3E4:教学管理数据库-数据查询

一、实验目的

掌握数据库中表的查询操作

二、实验工具

MS SQL Server 2008

三、实验内容及要求

在 C3E3-教学管理数据库 中完成以下操作。

--【5-1】查询全体学生的姓名、--【5-2】查询全体学生的详细信息。

--【5-3】将每个学生的累计学分降低10%后显示出来。

学号和话号码电。

--【5-4】将每个学生的累计学分降低10%后显示出来,要求查询结果表的标题用汉语显示。

--【5-5】查询每个院系有在读学生的专业。

--【5-6】查询来自杭州的所有学生。

--【5-7】查询累计学分在160分以下的学生姓名和累计学分。

--【5-8】查询累计学分不在150和159之间的学生姓名和累计学分。

--【5-9】查询姓名在'陈'和'李'之间的学生学号和姓名。

--【5-10】查询来自杭州、宁波或温州的学生学号和姓名。

--【5-11】查询既不来自杭州,也不来自宁波的学生学号和姓名。

--【5-12】查询学号后两位是“09”,或者等于学号前两位或中间两位的学生学号和姓名。

--【5-13】查询姓名中第二个字为“鹏”的学生学号和姓名。

--【5-14】查询学号长度不等于7,或者学号后6位含有非数字字符的学生学号和姓名。

--【5-15】查询学号最后一位既不是“1”和“3”,也不是“9”的学生学号和姓名。

--【5-16】查询课程名以“DB_”开头的课程信息。

--【5-17】查询没有成绩的学号和开课计划编号。

--【5-18】查询有成绩的学号和开课计划编号。

--【5-19】查询这样的男生,他的电话号码前3位是“130”,他来自杭州或者宁波,他既不主修电子商务专业,也不主修信息管理专业;

--【5-20】查询选修了开课计划编号为'010101'的课程的学生学号和成绩,查询结果按分数降序排列。

--【5-21】查询选修了开课编号为'010101'的课程的学生学号、成绩以及加了10分后的新成绩,查询结果按原成绩降序、按新成绩升序排列。

--【5-22】查询选修了开课编号为'010101'的课程的学生学号,并按成绩降序排列。

--【5-23】查询所有课本的总价格和平均价格,以及打七折后的总价格和平均价格。

--【5-24】查询课程编号前两位数字是'02'的课程所用课本的总价格和平均价格。

--【5-25】查询至少选修了一门课程的学生总数。

--【5-26】查询课程编号前两位数字是'02'的课程总数。

--【5-27】查询各门课程的课程号及相应的选课人数。

--【5-28】查询学号前5位为'S0601'且选修了两门以上(含)课程的学生学号。

--【5-29】查询学生的基本信息及其选课信息。

--【5-30】查询选修了开课计划编号为“010101”的课程的学生学号和姓名。

--【5-31】查询至少选修了学号为“S060110”的学生所选一门课程的学生学号和姓名。

--【5-32】用JOIN和ON关键字实现5-31的查询。

--【5-33】查询学生的学号、姓名、籍贯信息及其选课信息,分别以左外连接、右外连接和全外连接的形式显示。--(1)左外连接

--(2)右外连接

--(3)全外连接

--【5-34】查询选修了课程名为“数据库原理”的学生学号和姓名。

--【5-35】查询累计学分比“胡汉民”多2分以上(含)的学生学号、姓名和累计学分。

--【5-36】查询学生S060101的姓名和各门课程的平均成绩。

--【5-37】查询累计学分比计算机专业和信息管理专业所有学生都低的学生名单。

--【5-38】查询选修了开课计划编号为010101的课程的学生姓名。

--【5-39】查询计算机专业和信息管理专业的学生信息。

第五篇:大数据,数据库创新的驱动力

大数据,数据库创新的驱动力

计算机科学与技术的发展使得大规模信息处理基础设施产生重要改变。在过去的30年中,经典的数据库管理系统(DBMS)在处理大规模数据方面与时俱进,在企业数据处理等方面得到广泛应用。数据库研究和技术进展主要集中在数据建模、描述性查询语言、事务处理和数据库可靠性等。在这个过程中,相关的数据仓库和数据挖掘分析技术也成为一个热点研究方向;人们认识到数据处理过程中的信息可以被有效整理和分析来支持以数据为中心的决策支持。

数据库管理系统在目前的互联网时代继续占据了重要地位。在一个典型的互联网服务系统架构中,数据库管理系统和Web服务器及应用服务共同作用,为互联网用户提供各类信息和服务。在这个系统架构中,人们期望系统能支持无限次和高速的互联网用户访问,这个时候数据库层由于在硬件可扩展性上面的不足可能成为系统性能瓶颈。这个挑战我们称为大数据问题(big data problem)。大数据系统期望能对大规模异构复杂数据建模,进行实时分析;传统的商用数据库系统很难提供良好的解决方案。另一个大数据相关的挑战是服务器端数据中心的数据维护及安全隐私问题。近年来云计算技术已经成为大数据中心的一种可靠解决方案,Google, Yahoo and Microsoft等公司也纷纷开发自己的云计算系统。尽管云计算在互联网应用中已经体现出很多优越性,其在系统成熟性、可用性等方面还有很大提高空间。

显而易见,大数据领域的大规模数据管理和复杂数据分析已经成为新的研究前沿。目前的各类大数据应用正是大数据研究的驱动力,比如社会网络、移动计算、科学应用等等。这些应用产生的大数据往往具有海量、时序动态性、多样等特性,给数据库领域的各项技术带来巨大挑战,涵盖包括数据获取、组织管理、分析处理和应用呈现等整个数据管理生命周期。针对数据管理和分析不同系统应用,各类大数据处理技术在也不断发展。MapReduce作为一种分布式的数据处理框架由于其灵活性、可扩展性、高效和容错等特性其近年来得到了广泛应用。此外,也有多类其他分布式数据处理系统用来解决MapReduce不擅长的问题,比如交互式分析、图计算和分析、实时和流处理、通用数据处理等等。大数据不但给数据库研究领域,同时也给体系结构、存储系统、系统软件和软件工程等计算机多个学科带来了很多机会和挑战。大数据正是目前很多计算机科学问题的根本,并驱动众多新科技的发展。

下载不同数据库之间数据转移经验总结word格式文档
下载不同数据库之间数据转移经验总结.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    网络数据库讲稿(表数据操作)

    网络数据库讲稿 一、插入数据 P131 1.INSERT … VALUES … VALUES所提供的值的个数、顺序、数据类型,必须与字段名列表中的相一致。 关于NULL 和 DEFAULT P133 CREATE......

    按不同标准分类整理数据教案

    按不同标准分类整理数据 教学内容:苏教版义务教育教科书数学二年级下册第90-92页例1和想想做做第1-3题。 教学目标: 1、使学生联系现实生活的场景,经历简单的分类收集、整理数......

    数据库-驾校管理数据字典(本站推荐)

    4.2、数据字典 4.2.1、学员子数据字典 (1)数据流的描述 数据流编号: D001 数据流名称: 学员信息 简述:报考驾校的学员信息 数据流来源:学员 数据流去向:学员信息判断 数据流组成:学......

    关于JDBC数据分页跨数据库小结

    关于JDBC数据分页跨数据库小结 一、 关于数据连接connection如何区分数据库类型 // 获取数据生产商名称 String databaseProductName = conn.getMetaData().getDatabasePro......

    数据库--数据查询和操作[5篇材料]

    《数据查询与操作》实验 一、实验目的与要求 1、理解简单查询和复合查询的意义。 2、掌握SELECT语句和各子句的使用。 3、掌握多表查询和子查询的使用。 4、掌握INSERT、UPD......

    Oracle数据库学习中的六条经验总结

    Oracle数据库学习中的六条经验总结 以下的文章主要是介绍在Oracle数据库学习中的六条经验总结,其实想学好Oracle数据库并不是一件很困难的事情,很多人都认为Oracle数据库的体......

    如何面对不同学生之间的差异

    43个孩子,来自于43个不同的家庭,造就了43个性格迥异、快慢不同的孩子。就说今天的考试吧,16分钟就有人交卷,40分钟还有人未交卷,放学后10分钟,我又陪着三个孩子写完试卷。可是我......

    按不同标准分类整理数据教学设计

    《按不同标准分类整理数据》教学设计 一、教学内容:苏教版义务教育教科《数学》二年级下册第90-92页例1和“想想做做”第1-3题。 二、教学目标: 1.学生联系现实生活的场景,经历......