Oracle性能优化与Delphi代码
刚学了点oracle方面的知识,感觉以前写代码只凭喜好写,完全没有深究缘由,导致在内行人看来,写的都是垃圾代码,现在就把学到的一些东西写出来,也算是给刚入门的朋友一点帮助吧。
以前,写数据库访问代码,感觉很简单,不就是sql语句嘛,所以什么语句都是这样写:
A:
qry1.Close;
qry1.SQL.Text := edt1.Text ;
qry1.Open
;
感觉挺好,语句自己拼,拼好了,直接执行。
还有另外一种写法:
B:
qry1.Close;
qry1.SQL.Text := edt1.Text
;
qry1.Parameters.ParamByName('vvv').Value := edt2.Text ;
qry1.Open
;
感觉这样写也是达到一样的结果,而用参数的方法,感觉很麻烦,多余,edt1.Text里变量还都得写成参数,所以从来不这样写,似乎也看不出和A方法有什么区别,只是更多了些麻烦。
最近学了点oracle性能优化方面的知识,知道了oracle的共享池,及其对性能的影响。共享池保存的是最近使用的sql语句,如果有相同的sql语句在共享池中,就不会再做分析、生成执行计划,效率就会提高很多,但是select
* from tableA where aa='a'和sel ......
Oracle性能优化与Delphi代码
刚学了点oracle方面的知识,感觉以前写代码只凭喜好写,完全没有深究缘由,导致在内行人看来,写的都是垃圾代码,现在就把学到的一些东西写出来,也算是给刚入门的朋友一点帮助吧。
以前,写数据库访问代码,感觉很简单,不就是sql语句嘛,所以什么语句都是这样写:
A:
qry1.Close;
qry1.SQL.Text := edt1.Text ;
qry1.Open
;
感觉挺好,语句自己拼,拼好了,直接执行。
还有另外一种写法:
B:
qry1.Close;
qry1.SQL.Text := edt1.Text
;
qry1.Parameters.ParamByName('vvv').Value := edt2.Text ;
qry1.Open
;
感觉这样写也是达到一样的结果,而用参数的方法,感觉很麻烦,多余,edt1.Text里变量还都得写成参数,所以从来不这样写,似乎也看不出和A方法有什么区别,只是更多了些麻烦。
最近学了点oracle性能优化方面的知识,知道了oracle的共享池,及其对性能的影响。共享池保存的是最近使用的sql语句,如果有相同的sql语句在共享池中,就不会再做分析、生成执行计划,效率就会提高很多,但是select
* from tableA where aa='a'和sel ......
这样一来,Delphi使用Webservice和JAVA通讯时,可以将DELPHI的时间直接传给JAVA。从而免去了时间字符串parse之间的消耗,提高的程序效率。
Delphi时间实质就是double类型,整数部分表示天,小数部分表示当天时间,每毫秒为1/86400000。考虑到时区的转换后,JAVA和DELPHI时间之间的转换类如下:
import java.util.Calendar;
import java.util.Date;
/**
*
* Java时间和Delphi时间转换类
* @author Jim Wu
*
*/
public class UtilDelphiTime {
private static Calendar calendar = Calendar.getInstance();
private static int gmtOffset = calendar.get(Calendar.ZONE_OFFSET) + calendar.get(Calendar.DST_OFFSET);
public static double JTime2DTime(Date javaTime){
long sysMillis = javaTime.getTime() + gmtOffset;
return sysMillis / 86400000 + 25569 + ((double) (sysMillis % 86400000) / 86400000);
}
public static Date JTime2DTime(double delphiTime){
long timeLong = (long)(delphiTime * 86400000L) - (255 ......
这样一来,Delphi使用Webservice和JAVA通讯时,可以将DELPHI的时间直接传给JAVA。从而免去了时间字符串parse之间的消耗,提高的程序效率。
Delphi时间实质就是double类型,整数部分表示天,小数部分表示当天时间,每毫秒为1/86400000。考虑到时区的转换后,JAVA和DELPHI时间之间的转换类如下:
import java.util.Calendar;
import java.util.Date;
/**
*
* Java时间和Delphi时间转换类
* @author Jim Wu
*
*/
public class UtilDelphiTime {
private static Calendar calendar = Calendar.getInstance();
private static int gmtOffset = calendar.get(Calendar.ZONE_OFFSET) + calendar.get(Calendar.DST_OFFSET);
public static double JTime2DTime(Date javaTime){
long sysMillis = javaTime.getTime() + gmtOffset;
return sysMillis / 86400000 + 25569 + ((double) (sysMillis % 86400000) / 86400000);
}
public static Date JTime2DTime(double delphiTime){
long timeLong = (long)(delphiTime * 86400000L) - (255 ......
.pas ---- pascal的缩写, 单元原始程式档( unit source files )
.dpr ---- 专案档 ( project files )
.dpk ---- 包裹原始程式档/组件包 ( package source files )
.dfm ---- 表单档 (记录form的内容,除去这个内容就等于删除了form这个表单)
.dcu ---- 是编译好的单元文件.若只有一个dcu文件,则不能看到源代码.
1.代码模板(Code Templates): Ctrl+J ------可通过这种方式先取你所需的代码
2.查询说明文件(Help):F1
3.代码补缺(Code Completion):Ctrl+Space ------自动显示物件的属性及事件,或在输入“.”后直接出现
4.代码参数(Code Parameters):Ctrl+Shift+Space
5. 重复寻找( Search Again ) : F3
6.物件检视器(Object Inspector): F11 -----物件的属性,事件
7. 切换表单(Form)/程式编辑区(Unit) : F12
8. 物件关联检视器(Object TreeView): Alt + Shlft + F11 展示各元件,可选取、删除元件,拖元件改变其Parent
9. 开启专案档(Open Project& ......
近来发现一个Delphi莫名其妙的bug,当使用SetOptionalParam时,不能使用一连串数字的字符串,如'101',注意,是带引号的。在SaveToFile时,就会出现'Invalid field type'的异常,真是百思不得其解!连'001'这种串也不行,去掉引号,直接按数字赋值,则正常。
procedure TForm1.Button1Click(Sender: TObject);
var
cds:TClientDataSet;
begin
cds:=TClientDataSet.Create(nil);
with cds do
begin
FieldDefs.Add('f1',ftString,50);
CreateDataSet;
end;
cds.SetOptionalParam('ppppp','101');
cds.SaveToFile('c:\sss.dat'); //出现异常:Invalid field type!,把101改为abc,正常
cds.Free;
end; ......
今天心血来潮在自己的电脑上安装了mysql-5.1.41-win32和mysql-connector-odbc-5.1.6-win32。以前,我曾经尝试使用DELPHI6去联接MYSQL但是在网上找很多资料都不很好用;今天突然也想起这个问题就干起回来了。
1. 建立数据库
use mysql;
drop database myDB;
create database myDB;
use myDB;
CREATE TABLE Table_01 (
FLD_01 int not null auto_increment,
FLD_02 varchar(50) ,
FLD_03 int NOT NULL DEFAULT 0,
key(FLD_01)
);
2. 使用ODBC建立一个MYSQL的DSN,名称(MYSQL_DB)什么都可以。
3. 在FORM中增加了Adoconnection,AdoQuery,DataSource和DBGrid.
AdoConnection.connectionstring := 'MYSQL_DB';
AdoQuery.sql.text :='select * from Table_01';
4. 全部ACTIVE :=TRUE;
搞好。
......
ADO 使用 ORACLE provider FOR OLE DB 驱动时
调用存储过程需要返回游标时,在连接字符串中增加
PLSQLRSet=1 参数。
存储过程中的游标不需要付初始值
如:
sp1: TADOStoredProc;
sp1.Close;
sp1.ProcedureName := 'pkg_ScanList_By_JobNo.sp_GetScanList'; //存储过程名
sp1.Parameters.Clear;
sp1.Parameters.CreateParameter('S_JobNo',ftstring,pdInput,20,'2191544508'); //输入类型的参数
sp1.open;
......
ADO 使用 ORACLE provider FOR OLE DB 驱动时
调用存储过程需要返回游标时,在连接字符串中增加
PLSQLRSet=1 参数。
存储过程中的游标不需要付初始值
如:
sp1: TADOStoredProc;
sp1.Close;
sp1.ProcedureName := 'pkg_ScanList_By_JobNo.sp_GetScanList'; //存储过程名
sp1.Parameters.Clear;
sp1.Parameters.CreateParameter('S_JobNo',ftstring,pdInput,20,'2191544508'); //输入类型的参数
sp1.open;
......