仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1369|回复: 8
打印 上一主题 下一主题

[学习教程] MYSQL网页设计Oracle中提取和存储数据库工具的DDL

[复制链接]
简单生活 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:44:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
到2009年,甲骨文的数据库Oracle已经诞生了30周年,而MySQL却连它的一半时间都没有。微软的SQLServer仅仅比MySQL大两年,但是SQLServer的发布是建立在Sybase的基础上。oracle|工具|数据|数据库从工具(比方数据库表、索引、束缚、触发器等)中提取DDL命令的一般办法触及到的操纵包含从这些工具中提取元数据(metadata),并把这些数据存储在内存中。只管今朝有良多剧本能够完成如许的功效,可是它们一般都是不完全的大概过期的。侥幸的是,Oracle9.2供应了一个完成如许的功效的API:DBMS_METADATA程序包。

  在良多情形下,数据库中数据的保护操纵请求我们提取多种工具(比方数据库表、索引、束缚、触发器等)的DDL(DataDefinitionLanguage,数据界说言语)。

  比来我承当了一个义务,我必要编写一组数据库程序包来实行高功能的大批的数据删除(DELETE)操纵。如许的操纵请求我具有提取和存储数据库工具DDL的相干手艺。

  提取和存储数据库工具的DDL的办法以下:

  ・创建与源表布局不异的数据表,可是它不带主键、备用键和内部键束缚。

  ・比方,利用MyTable_X,个中MyTable是要被删除的方针数据表。

  ・把必要保留的数据拔出新创建的数据表(MyTable_X)中。

  ・利用NOLOGGINGPARALLEL选项在新数据表上创建索引。

  ・在新数据表上创建束缚。

  ・MyTable和MyTable_X数据表举行互换。把主表更名为MyTable_T,把MyTable_X更名为MyTable。

  ・考证了局并删除MyTable_T表。

  很分明,为了编写完成下面方针的代码,你必需提取数据库工具的元数据(界说和被选中的属性),并把它存储在内存中,如许在实行下面的操纵的时分才干够利用它。

  在网上存在大批的剧本,它们能够从多种Oracle数据字典(user_tables、user_indexes、user_ind_columns、user_constraints、user_cons_columns等)中提取数据库工具的元数据,接着为特定的工具机关DDL命令。这些剧本的一个成绩是,它们一般是SQL*Plus剧本,它会天生客户端文本文件,而这个文件不克不及被服务器端代码会见。它们的次要成绩有:

  ・不完全:不克不及提取一切的选项,并组合进DDL语句中。

  ・过期了:这些剧本一般不撑持Oracle最新的数据库特征--分区(partitioning)、基于函数的索引、主动段空间办理(ASSM)等。这些剧本大概溃散或天生毛病的DDL语句。

  成绩总结:只管有大批的从Oracle数据字典中提取数据库工具元数据的剧本,可是它们中的年夜多半要末不完全,要末过时了。

  办理计划:利用DBMS_METADATA程序包,进修怎样用最好的、没有毛病的和易于保护的体例实行下面的事件。

  利用Oracle的当地API:DBMS_METADATA程序包

  Oracle数据库接纳增补PL/SQL程序包的情势供应了丰厚的事后包装好的API。Oracle9.2版本中引进的DBMS_METADATA程序包大概恰好合适你的需求。它包括了用于检索数据库工具界说的API。

  我们将利用的API次要是DBMS_METADATA.GET_DDL函数。这个函数前往的工具界说SQL字符串是CLOB。它具有上面一些输出参数:

  ・object_typeVARCHAR2

  ・nameVARCHAR2

  ・schemaVARCHAR2DEFAULTNULL

  ・versionVARCHAR2DEFAULT’COMPATIBLE’

  ・modelVARCHAR2DEFAULT’ORACLE’,

  ・transformVARCHAR2DEFAULT’DDL’

  上面创建了一个用于测试的EmpTest数据表,它带有索引和束缚:

createtableEmpTest
(
empNointegernotnull,
lastNamevarchar2(30)notnull,
firstNamevarchar2(20)notnull,
jobvarchar2(9)’
hireDatedate’
isActivenumber(1)
constraintEmpTest_CK1
check(isActivein(0,1)),
salarynumber(9,2),
commisionnumber(9,2),
deptNonumber(2),
constraintEmpTest_PK
primarykey(empNo),
constraintEmpTest_AK1
unique(lastName,firstName)
);

createindexEmpTest_HireDate_Salary
onEmpTest
(
salary,
hireDate
);

  运转下面的剧本以后,就创建了一个带有三个索引(两个独一的和一个不惟一的索引)的EmpTest表:

selectindex_name,index_type,uniqueness
fromuser_indexes
wheretable_name=’EMPTEST’;

索引称号索引范例独一性EMPTEST_AK1NORMALUNIQUEEMPTEST_HIREDATE_SALARYNORMALNONUNIQUEEMPTEST_PKNORMALUNIQUE
  EmpTest表还包含六个束缚:

  ・一个主键-EmpTest_PK

  ・一个备用键-EmpTest_AK

  ・一个反省束缚-EmpTest_CK1

  ・体系天生的(SYS_*)三个非空的束缚,称号以下:

束缚称号束缚范例索引称号SYS_C002144065CSYS_C002144066CSYS_C002144067CEMPTEST_CK1CEMPTEST_PKPEMPTEST_PKEMPTEST_AK1UEMPTEST_AK1
  如今我们实行匿名的PL/SQL代码块来挪用DBMS_METADATA.GET_DDL函数,检索数据表的界说。

  DBMS_OUTPUT程序包只能输入最长为255个字符的字符串,因为在处置数据表的DDL字符串的时分太简单凌驾这个限定,以是这是一个成绩。为懂得决这个成绩,我们利用了当地历程Show()(列表1所示)。

  列表1:挪用DBMS_METADATA.GET_DDL()函数的PL/SQL代码块

declare
vClobclob;
vLongStringvarchar2(32767);
vOffSetpls_integer:=0;
vLengthpls_integer:=0;
vTablevarchar2(30):=’EmpTest’;

procedureShow(pVariablevarchar2,pLineSizepls_integer:=80)
is
begin
dbms_output.enable(1000000);
if(length(pVariable)>pLineSize)
then
dbms_output.put_line(substr(pVariable,1,pLineSize));
Show(substr(pVariable,pLineSize+1),pLineSize);
else
dbms_output.put_line(pVariable);
endif;
endShow;
begin
--猎取DDL
vClob:=dbms_metadata.get_ddl(’TABLE’,upper(vTable));

--猎取CLOB长度
vLength:=dbms_lob.GetLength(vClob);
dbms_output.put_line(’DDLlength:’||to_char(vLength));

vOffSet:=1;
dbms_lob.read(vClob,vLength,vOffSet,vLongString);
--封闭CLOB
if(dbms_lob.isOpen(vClob)>0)
then
dbms_lob.close(vClob);
endif;
Show(vLongString,80);
end;

  列表1天生上面的输入信息:

DDLlength:461
CREATETABLE"BORIS"."EMPTEST"
("EMPNO"NUMBER(*,0)NOTNULLENABLE,
"LASTNAME"VARCHAR2(30)NOTNULLENABLE,
"FIRSTNAME"VARCHAR2(20)NOTNULLENABLE,
"JOB"VARCHAR2(9),
"HIREDATE"DATE,
"ISACTIVE"NUMBER(1,0),
"SALARY"NUMBER(9,2),
"COMMISION"NUMBER(9,2),
"DEPTNO"NUMBER(2,0),
CONSTRAINT"EMPTEST_CK1"CHECK(isActivein(0,1))ENABLE,
CONSTRAINT"EMPTEST_PK"PRIMARYKEY("EMPNO")
USINGINDEXPCTFREE10INITRANS2MAXTRANS255
STORAGE(INITIAL65536NEXT1048576MINEXTENTS1MAXEXTENTS2147483645
PCTINCREASE0FREELISTS1FREELISTGROUPS1BUFFER_POOLDEFAULT)
TABLESPACE"TOOLS"ENABLE,CONSTRAINT"EMPTEST_AK1"UNIQUE("LASTNAME","FIRSTNAME")
USINGINDEXPCTFREE10INITRANS2MAXTRANS255
STORAGE(INITIAL65536NEXT1048576MINEXTENTS1MAXEXTENTS2147483645
PCTINCREASE0FREELISTS1FREELISTGROUPS1BUFFER_POOLDEFAULT)
TABLESPACE"TOOLS"ENABLE)PCTFREE10PCTUSED40INITRANS1
MAXTRANS255NOCOMPRESSLOGGING
STORAGE(INITIAL65536NEXT1048576MINEXTENTS1MAXEXTENTS2147483645
PCTINCREASE0FREELISTS1FREELISTGROUPS1BUFFER_POOLDEFAULT)
TABLESPACE"TOOLS"

  它运转的情形太好了,前往的数据表的DDL字符串带有主键EmpTest_PK、备用键EmpTest_AK1和反省束缚EmpTest_CK1。它创建了两个独一的索引来撑持主键和备用键束缚。这不是你必要的了局:你必要一个表,可是为了加速数据载进速率,它不要包括束缚和索引。只要在数据载进事情完成今后,你才创建索引和束缚。

  包管工具的界说自力的别的一个缘故原由在于天真性:你大概必要改动工具创建的序次。

  如今能够计划一个数据布局来存储工具的元数据了。

<FONTcolor=#000000>
[1][2][3]下一页

WindowsAzureSQLDatabase并不支持数据压缩和表分区之类的功能,而且SQLDatabase支持的Transact-SQL语言只是完整版的一部分。另外,因为解决方案提供商不能控制物理资源,所以他们不能将数据文件和索引分配给特定的硬件。
灵魂腐蚀 该用户已被删除
沙发
发表于 2015-1-19 21:57:13 | 只看该作者
微软对CLR作了大篇幅的宣传,这是因为数据库产品终于融入.net体系中。最开始我们也是狂喜,感觉对象数据库的一些概念可以实现了。
乐观 该用户已被删除
板凳
发表于 2015-1-28 13:02:29 来自手机 | 只看该作者
记得在最开始使用2k的时候就要用到这个功能,可惜2k没有,现在有了作解决方案的朋友会很高兴吧。
莫相离 该用户已被删除
地板
发表于 2015-2-5 21:34:28 | 只看该作者
sqlserver的痛苦之处在于有用文档的匮乏,很多只是表明的东西
若天明 该用户已被删除
5#
发表于 2015-2-13 17:01:23 | 只看该作者
可能有的朋友会抱怨集成的orderby,其实如果使用ranking函数,Orderby是少不了的。如果担心Orderby会影响效率,可以为orderby的字段建立聚集索引,查询计划会忽略orderby操作(因为本来就是排序的嘛)。
小妖女 该用户已被删除
6#
发表于 2015-3-4 00:31:49 | 只看该作者
对于微软系列的东西除了一遍遍尝试还真没有太好的办法
山那边是海 该用户已被删除
7#
发表于 2015-3-11 14:57:39 | 只看该作者
连做梦都在想页面结构是怎么样的,绝非虚言
海妖 该用户已被删除
8#
发表于 2015-3-19 00:31:55 | 只看该作者
入门没那么困难,精通没那么容易
飘灵儿 该用户已被删除
9#
发表于 2015-3-26 23:14:51 | 只看该作者
发几份SQL课件,以飨阅者
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-9-23 19:23

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表