MYSQL网站制作之Oracle数据库数据工具剖析 (下)
下面我将描述五个不使用MySQL的响亮理由。oracle|工具|数据|数据库 历程和函数历程和函数都以编译后的情势寄存在数据库中,函数能够没有参数也能够有多个参数并有一个前往值。历程有零个或多个参数,没有前往值。函数和历程都能够经由过程参数列表吸收或前往零个或多个值,函数和历程的次要区分不在于前往值,而在于他们的挪用体例。历程是作为一个自力实行语句挪用的:
pay_involume(invoice_nbr,30,due_date);
函数以正当的表达式的体例挪用:
order_volumn:=open_orders(SYSDATE,30);
创立历程的语法以下:
CREATEPROCEDUREprocedure_name
{AS|IS}
declaration_section
BEGIN
executable_section
[EXCEPTION
exception_section]
END
每一个参数的语法以下:
paramter_namemodedatatype[(:=|DEFAULT)value]
mode有三种情势:IN、OUT、INOUT。
IN暗示在挪用历程的时分,实践参数的取值被传送给该历程,情势参数被以为是只读的,当历程停止时,把持会前往把持情况,实践参数的值不会改动。
OUT在挪用历程时实践参数的取值都将被疏忽,在历程外部情势参数只能是被赋值,而不克不及从中读取数据,在历程停止后情势参数的内容将被付与实践参数。
INOUT这类形式是IN和OUT的组合;在历程外部实践参数的值会传送给情势参数,情势参数的值可读也可写,历程停止后,情势参数的值将付与实践参数。
创立函数的语法和历程的语法基础不异,独一的区分在于函数有RETUREN子句
CREATEFINCTIONfunction_name
RETURNreturning_datatype
{AS|IS}
declaration_section
BEGIN
executable_section
exception_section
END
在实行部分函数必需有哟个或多个return语句。
在创立函数中能够挪用单行函数和组函数,比方:
CREATEORREPLACEFUNCTIONmy_sin(DegreesInINNUMBER)
RETURNNUMBER
IS
piNUMBER=ACOS(-1);
RadiansPerDegreeNUMBER;
BEGIN
RadiansPerDegree=pi/180;
RETURN(SIN(DegreesIn*RadiansPerDegree));
END包
包是一种将历程、函数和数据布局绑缚在一同的容器;包由两个部分构成:内部可视包标准,包含函数头,历程头,和内部可视数据布局;另外一部分是包主体(packagebody),包主体包括了一切被绑缚的历程和函数的声明、实行、非常处置部分。
打包的PL/SQL程序和没有打包的有很年夜的差别,包数据在用户的全部会话时代都一向存在,当用户取得包的实行受权时,就即是取得包标准中的一切程序和数据布局的权限。但不克不及只对包中的某一个函数或历程举行受权。包能够重载历程和函数,在包内能够用统一个名字声明多个程序,在运转时依据参数的数量和数据范例挪用准确的程序。
创立包必需起首创立包标准,创立包标准的语法以下:
CREATEPACKAGEpackage_name
{AS|IS}
public_variable_declarations|
public_type_declarations|
public_exception_declarations|
public_cursor_declarations|
function_declarations|
procedure_specifications
END
创立包主体利用CREATEPACKAGEBODY语句:
CREATEPACKAGEBODYpackage_name
{AS|IS}
private_variable_declarations|
private_type_declarations|
private_exception_declarations|
private_cursor_declarations|
function_declarations|
procedure_specifications
END
公有数据布局是那些在包主体外部,对被挪用程序而言是不成见的。
触发器(Triggers)
触发器是一种主动实行呼应数据库变更的程序。能够设置为在触发器事务之前或以后触发或实行。可以触发触发器事务的事务包含上面几种:
DML事务
DDL事务
数据库事务
DML事务触发器能够是语句或行级触发器。DML语句触发器在触发语句之前或以后触发DML行级触发器在语句影响的行变更之前或以后触发。用户能够给单一事务和范例界说多个触发器,但没有任何办法能够加强多触发器触发的命令。下表列出了用户能够使用的触发器事务:
事务触发器形貌INSERT当向表或视图拔出一行时触发触发器UPDATE更新表或视图中的某一行时触发触发器DELETE从表或视图中删除某一行时触发触发器CREATE当利用CREATE语句为数据库或项目增添一个工具时触发触发器ALTER当利用ALTER语句为变动一个数据库或项目标工具时触发触发器DROP当利用DROP语句删除一个数据库或项目标工具时触发触发器START翻开数据库时触发触发器,在事务后触发SHUTDOWN封闭数据库时触发,事务前触发LOGON当一个会话创建时触发,事务前触发LOGOFF当封闭会话时触发,事务前触发SERVER服务器毛病产生时触发触发器,事务后触发
创立触发器的语法以下:
CREATETRIGGERtrigger_name
{before|after|insteadof}event
ON{table_or_view_name|DATABASE}
]
trigger_body
只要DML触发器(INSERT、UPDATE、DELETE)语句可使用INSTEADOF触发器而且只要表的DML触发器能够是BEFORE或AFTER触发器。
象束缚一样触发器能够被设置为禁用或启用来封闭或翻开他们的实行体(EXECUTE),将触发器设置为禁用或启用利用ALTERTRIGGER语句:
ALTERTRIGGERtrigger_nameENABLE;
ALTERTRIGGERtrigger_nameDISABLE;
要禁用或启用表的一切触发器,利用ALTERTABLE语句
ALTERTRIGGERtable_nameDISABLEALLTRIGGER;
ALTERTRIGGERtable_nameENABLEALLTRIGGER;
删除触发器利用DROPTRIGGER
DROPTRIGGERtrigger_name;
数据字典
Oracle数据字典包括了用户数据库的元数据。带下划线的表称号中带OBJ$、UET$、SOURCE$,这些表是在实行CREATEDATABASE语句时代由sql.bsq剧本创立的,一样平常情形下用户很少会见这些表。剧本catalog.sql(一般位于$oracle_home/rdbms/admin)在CREATEDATABASE语句以后当即运转,创立数据字典视图。
数据字典视图大抵能够分为三类:
.前缀为USER_的数据字典视图,包括了用户具有的工具的信息。
.前缀为ALL_的数据字典视图,包括了用户以后能够会见的全体工具和权限的信息。
.前缀为DBA_的数据字典视图,包括了数据库具有的一切工具和权限的信息。
在尽年夜多半数据字典视图中都有象DBA_TABLES,ALL_TABLES和USER_TABLES如许的视图家属。Oracle中有凌驾100个视图家属,以是要周全先容这些视图家属是单调有趣的并且没有多年夜的意义。鄙人表中列出了最主要和最经常使用的视图家属,必要注重的是每一个视图家属都有一个DBA_,一个ALL_一个USER_视图。
视图家属(ViewFamily)形貌COL_PRIVS包括了表的列权限,包含授与者、被授与者和权限EXTENTS数据局限信息,好比数据文件,数据段名(segment_name)和巨细INDEXES索引信息,好比范例、独一性和被触及的表IND_COLUMNS索引列信息,好比索引上的列的排序体例OBJECTS工具信息,好比形态和DDLtimeROLE_PRIVS脚色权限,好比GRANT和ADMIN选项SEGMENTS表和索引的数据段信息,好比tablespace和storageSEQUECNCES序列信息,好比序列的cache、cycle和ast_numberSOURCE除触发器以外的一切内置历程、函数、包的源代码SYNONYMS别号信息,好比援用的工具和数据库链接db_linkSYS_PRIVS体系权限,好比grantee、privilege、admin选项TAB_COLUMNS表和视图的列信息,包含列的数据范例TAB_PRIVS表权限,好比授与者、被授与者和权限TABLES表信息,好比表空间(tablespace),存储参数(storageparms)和数据行的数目TRIGGERS触发器信息,好比范例、事务、触发体(triggerbody)USERS用户信息,好比一时的和缺省的表空间VIEWS视图信息,包含视图界说
在Oracle中另有一些不经常使用的数据字典表,但这些表不是真实的字典家属,他们都是一些主要的单一的视图。
VIEWNAME形貌USER_COL_PRIVS_MADE用户授与别人的列权限USER_COL_PRIVS_RECD用户取得的列权限USER_TAB_PRIVS_MADE用户授与别人的表权限USER_TAB_PRIVS_RECD用户取得的表权限
其他的字典视图中次要的是V$视图,之以是如许叫是由于他们都是以V$或GV$开首的。V$视图是基于X$假造视图的。V$视图是SYS用户所具有的,在缺省情况下,只要SYS用户和具有DBA体系权限的用户能够看到一切的视图,没有DBA权限的用户能够看到USER_和ALL_视图,但不克不及看到DBA_视图。与DBA_,ALL,和USER_视图中面向数据库信息相反,这些视图可视的给出了面向实例的信息。
在年夜型体系上化几周工夫手工输出每条语句
手工输出带用户名变量的语句,然后再输出每个用户名,这必要花好几个小时的工夫
写一条SQL语句,天生必要的ALTERUSER语句,然后实行他,这只必要几分钟工夫
很分明我们将选择天生SQL的办法:
例:
SELECTALTERUSER||username||
TEMPORARYTABLESPACEtemp;
FROMDBA_USERS
WHEREusernameSYS
ANDtemporary_tablespace
这个查询的了局将被脱机处置到一个文件中,然后在实行:
ALTERUSERSYSTEMTEMPORARYTABLESPACEtemp;
ALTERUSEROUTLNTEMPORARYTABLESPACEtemp;
ALTERUSERDBSNMPTEMPORARYTABLESPACEtemp;
ALTERUSERSCOTTTEMPORARYTABLESPACEtemp;
ALTERUSERDEMOTEMPORARYTABLESPACEtemp;这些过程被存储和运行在数据库服务器上,以减少在客户端的处理过程,从而最大限度地提高了处理能力,因为通常情况下数据库服务器会运行地更快。存储过程并不是MySQL独有的功能,但是这个最近新增加的功能使得这个数据库比以前更具吸引力了。 索引视图2k就有。但是2005对其效率作了一些改进但是schema.viewname的作用域真是太限制了它的应用面。还有一大堆的环境参数和种种限制都让人对它有点却步。 SQLServer的异构移植功能个人感觉最好了。(如果对比过SQLServer的链接服务器和Oracle的透明网关的朋友会发现SQLServer的sp_addlinkedserver(openquery)异构数据库系列比Oracle真是强太多了。) 现在是在考虑:如果写到服务器端,我一下搞他个10个存储过程导过去,那久之服务器不就成垃圾箱了吗?即便优化了我的中间层. 以前的DTS轻盈简单。但是现在的SSIS虽然功能强大了很多,但是总是让人感觉太麻烦。看看论坛中询问SSIS的贴子就知道。做的功能太强大了,往往会有很多用户不会用了 sqlserver的痛苦之处在于有用文档的匮乏,很多只是表明的东西 现在是在考虑:如果写到服务器端,我一下搞他个10个存储过程导过去,那久之服务器不就成垃圾箱了吗?即便优化了我的中间层. 呵呵,这就是偶想说的 原来公司用过MYSQL自己也只是建个表写个SQL
页:
[1]