MYSQL网站制作之嗨 甲骨文【4】
WindowsAzureSQLDatabase并不支持数据压缩和表分区之类的功能,而且SQLDatabase支持的Transact-SQL语言只是完整版的一部分。另外,因为解决方案提供商不能控制物理资源,所以他们不能将数据文件和索引分配给特定的硬件。静态SQL的利用
Oracle实践上比SQLServer好一些,但相对没有传说中那末强。这是这些天一识Oracle庐山真脸孔的感觉。看来很多多少事变多云云,听的要比见到的完善。接着第一句说,Oracle的静态SQL就很棒,我专门进修了一下。纪录以下。
先说说静态SQL是甚么,看这句熟习的:
select*froma_tablewherea_variable=a_declarevalue;
再写句静态的:
select*froma_tablewherea_variable=:a_dynamicvalue;
两句的区分很分明,后者多一个占位符,这个以冒号入手下手的变量能够天真地实行分歧前提的where语句。
这是静态SQL语句的上风,接上去的功效就是它的独门工夫了--实行DDL,DCL语句。
静态SQL的实行
1EXECUTEIMMEDIATE语句
EXECUTEIMMEDIATEdynamic_string
…|record}]
bind_argument[,bind_argumnet]…]
[{RETURNING|RETURN}INTObing_argument[,bind_argument]…];
上面是它的利用
处置DDL操纵(CREATE,ALTER,DROP)
CREATEORREPLACEPROCEDUREdrop_table(table_nameVARCHAR2)
IS
Sql_statemetVARCHAR2(100);
BEGIN
Sql_statement:=’DROPTABLE’||table_name;
EXECUTEIMMEDIATEsql_statement;
END;
/
创建历程drop_table后,挪用以下:
SQL>execdrop_table(‘worker’)
处置DCL操纵(GRANTREVOKE)
SQL>connsystem/manager
CREATEORREPLACEPROCEDUREgrant_sys_priv(privVARCHAR2,usernameVARCHAR2)
IS
Sql_statVARCHAR2(100);
BEGIN
Sql_stat:=’GRANT“||priv||’TO’||username;
EXECUTEIMMEDIATEsql_stat;
END;
/
挪用
SQL>execgrant_sys_priv(‘CREATESESSION’,’SCOTT’)
处置DML操纵(INSERTUPDATEDELETE)
假如DML语句带有占位符,那末在EI语句中则要带USING子句
假如DML语句带有RETURNING子句,那末EI语句中要带有RETURNINGINTO子句
例子,处置单行查询:
DECLARE
sql_statVARCHAR2(100);
emp_recordtbl%ROWTYPE;
BEGIN
sql-stat:=SELECT*FROMtblWHEREtblno=:no;
EXECUTEIMMEDIATEsql_statINTOemp_recordUSING&1;
dbms_output.put_line(emp_record.ename||emp_record.sal);
END;
/
2利用OPEN-FOR,FETCH和CLOSE语句处置多行查询
静态处置SELECT语句步骤:界说游标->翻开游标->轮回提取数据->封闭游标
界说:
TYPEcursortypeISREFCURSOR;
cursor_variablecursortype;
翻开:
OPENcursor_variableFORdynamic_string
...];
提取:
FETCHcursor_variableINTO{var1[,var2]...|recor_var};
封闭:
CLOSEcursor_variable;
显现特定部门雇员姓名和人为
DECLARE
TYPEempcurtypeISREFCURSOR;
emp_csempcurtype;
emp_recordemptable%ROWTYPE;
sql_statVARCHAR2(100);
BEGIN
sql_stat:=select*fromemptablewheredeptno=:dno;
OPENemp_csFORsql_statUSING&dno;
LOOP
FETCHemp_csINTOemp_record;
EXITWHENemp_cs%NOTFOUND;
dbms_output.put_line(emp_record.ename||emp_record.sal);
ENDLOOP;
CLOSEemp_cs;
END;
/
3利用批量静态SQL(9i)
BULK子句能够加速批量数据的处置速率。有三种语句撑持BULK子句的办法。
1利用EXECUTEIMMEDIATE,语法为:
EXECUTEIMMEDIATEdynamic_string
]
bind_argument[,bind_argumnet]…]
[{RETURNING|RETURN}
BULKCOLLECTINTOreturn_variable[,return_variable…]];
用于DML处置多行子句,例子:为某部门一切员工增添%比的人为
DECLARE……
BEGIN
sql_stat:=UPDATEemptblSETsal=sal*(1+:percent/100)||
WHEREdeptno=:dno||
RETURNINGename,salINTO:name,:salary;
EXECUTEIMMEDIATEsql_statUSING&percent,&dno
RETURNINGBULKCOLLECTINTOename_table,sal_table;
FORiIN1.ename_table.COUNTLOOP
dbms_output.put_line(ename_table(i)||sal_table(i));
ENDLOOP;
END;
/
2FETCH语句,语法为
FETCHdynamic_cursor
BULKCOLLECTINTOdefine_variable[,dyfine_variable...];
3FORALL语句。合用于DML,不合用于静态的SELECT语句。FORALL语句要与EI分离利用。语法为
FORALLindexINlowerbound..upperbound
EXECUTEIMMEDIATEdynamic_string
USINGbind_argument|bind_argumnet(index)
[,bind_argument|bind_argumnet(index)]…
[{RETURNING|RETURN}BULKCOLLECT
INTObind_argument[,bind_argument…]];
由于MySQL数据库已经如此普及,对企业来说它无疑是一个更好的选择。 而写到本地,我又考虑到效率问题.大家来讨论讨论吧,分数不打紧,就给10分,十全十美,没啥对错,各抒己见,但是要有说服力的哦~ 原来的计算字段其实和虚拟字段很像。只是管理方面好了而已,性能方面提高不多。但是SQL2005提供了计算字段的持久化,这就提高了查询的性能,但是会加重insert和update的负担。OLTP慎用。OLAP可以大规模使用。 你觉得我的非分区索引无法对起子分区,你可以提醒我一下呀!没有任何的提醒,直接就变成了非分区表。不知道这算不算一个bug。大家也可以试试。 然后最好有实践机会,能够把实践到的和实践结合起来,其实理论思考是个非常困扰和痛苦的事情 原来的计算字段其实和虚拟字段很像。只是管理方面好了而已,性能方面提高不多。但是SQL2005提供了计算字段的持久化,这就提高了查询的性能,但是会加重insert和update的负担。OLTP慎用。OLAP可以大规模使用。 分区表效率问题肯定是大家关心的问题。在我的试验中,如果按照分区字段进行的查询(过滤)效率会高于未分区表的相同语句。但是如果按照非分区字段进行查询,效率会低于未分区表的相同语句。 对一张百万级别的表建游标,同时又没有什么过滤条件,取得游标效率是如果直接SQL查询百万条数据;如果再对每条记录做处理,耗时将更长。 需要注意的一点,也是我使用过程中发现的一个问题。在建立function->schema->table后,如果在现有的分区表上建立没有显式声明的聚集索引时,分区表会自动变为非分区表。这一点很让我纳闷。
页:
[1]