您的位置:
首页 >> 资讯资料 >> IT培训 >> 正文:Oracle数据库常见问题答疑[2]

Oracle数据库常见问题答疑[2]

Redo Buffers (重做缓冲区) 

6307840 bytes 

Database mounted. (数据库已加载) 

Database opened.数据库已打开。 

现在使用SYS用户的口令,以SYS身份连接: 

SVRMGR> connect sys/change_on_install@ora81 

Connected.(已连接) 

成功了。现在试着以SYSDBA身份连接: 
 

SVRMGR> connect sys/change_on_install@ora81 

as sysdba; 

ORA-01017: invalid username/password; logon 

denied(无效的用户名/口令;登录被拒绝) 

这里出现了你所说的错误。你的SYS口令为:change_on_install,但口令文件中的口令却是foobar。SYS用户是专用的,以SYSDBA身份连接就像是以INTERNAL连接,你必须使用口令文件中的口令。试试这样做: 

SVRMGR— connect sys/foobar@ora81 as sysdba; 

Connected.(已连接) 

并不是每个人都需要使用口令文件中的口令;用户需要使用他们自己的口令。通过授权SYSDBA给SCOTT,你就可以明白这一点: 

SVRMGR> grant sysdba to scott; 

Statement processed.(已处理) 

这个命令将SCOTT以SCOTT的凭证加入到口令文件中。如果你改变了SCOTT的口令,口令文件也会自动同步改变。现在,你可以试试以SYSDBA身份连接SCOTT了: 

SVRMGR> connect scott/tiger@ora81 as sysdba; 

Connected.(已连接) 

一切正常。现在可以使用ALTER USER 命令来改变SYS用户的口令。 

SVRMGR> alter user sys identified by 

change_on_install; 

Statement processed.(已成功更改)
SVRMGR≫ connect sys/change_on_install@ora81 

as sysdba; 

Connected.(已连接) 

你还可以用change_on_install,因为改变SYS用户口令将同时改变口令文件中的口令。当你建立了口令文件后,Oracle数据库在其中放入两个账号:SYS和INTERNAL,并将你在命令行中提供的口令作为这两个账户的口令。当你改变数据库中的SYS用户口令时,数据库将冲掉口令文件中的SYS和INTERNAL口令。下面操作将显示口令foobar已经是无效的了: 
 

SVRMGR> connect sys/foobar@ora81 as sysdba; 

ORA-01017: invalid username/password; logon 

denied(无效的用户名/口令,登录被拒绝) 

问:利用QUERY选项输出数据 

我知道在Oracle8i中,可以使用QUERY有选择地输出表数据。我想用EXP命令来实现,但没有成功。下面是我所写的命令,以及得到的错误信息: 

exp ddd/ddd file=/dbf/u11/customer.dmp 

tables=AASC.AST_CUSTOMER_KEEP 

query=\'where CUA_TRANS_DTS \< 

add_months\(sysdate, -6\)\' 

table_export[2]: CUA_TRANS_DTS: not found.(没有找到) 

答:操作系统不同,用来指定QUERY=参数的方法也不同。WHERE 语句里面往往有很多特殊的字符,如=.>.<和空格等等。而UNIX和Windows操作系统中的外壳命令提示是不欢迎这些字符的,这些字符将被忽略。你应该根据不同的操作系统采用不用的方法。我一般使用带有QUERY选项的参数文件(PARFILE),利用PARFILE,可以不考虑操作系统平台而使用完全相同的方法。 

下面给出一个例子。我用select * from all_objects建立了一个表T,我希望输出所有object_id 小于5000的行。在Windows中,必须这样做: 

C:\exp>exp userid=tkyte/tkyte tables=t 

query="""where object_id < 5000""" 

注意:在windows中,需要在WHERE语句的两端使用三个双引号。在UNIX中,必须这样做: 

$ exp userid=/ tables=t query=\"where 

object_id \< 5000\" 

exp userid=/ tables=t parfile=exp.par 

如果使用包含query="where object_id < 5000"的PARFILE文件,我可以在两个系统中使用相同的一个命令: 

exp userid=/ tables=t parfile=exp.par 

在两种操作系统中,完全相同。这相对于在不同的平台中使用不同的QUERY字符串容易多了。
问:DBMS_RANDOM 

您能否告诉我写一个能产生大于0小于1的随机数的随机数产生器的最好方法? 

答:Oracle8 8.0版介绍了DBMS_RANDOM包,Oracle8i 8.1.6版介绍了DBMS_RANDOM包的新功能,但Oracle8i 文档中没有详细全面介绍其功能。幸运的是:有一个新的DBMS_RANDOM包函数能够返回0-1之间的随机数。这个新函数是: 

FUNCTION value RETURN NUMBER; 
 

FUNCTION value (low IN NUMBER, high IN 

NUMBER) RETURN NUMBER; 

FUNCTION normal RETURN NUMBER; 

FUNCTION string (opt char, len NUMBER) 

RETURN VARCHAR2; 

VALUE函数的第一种形式返回一个大于或等于0且小于1的随机数;第二种形式返回一个大于或等于LOW,小于HIGH的随机数。下面是其用法的一个示例: 

SQL> select dbms_random.value, 

dbms_random.value(55,100) 

2 from dual; 

VALUE DBMS_RANDOM.VALUE(55,100) 

.782821936 79.6367038 

NORMAL函数返回服从正态分布的一组数。此正态分布标准偏差为1,期望值为0。这个函数返回的数值中有68%是介于-1与+1之间,95%介于-2与+2之间,99%介于-3与+3之间。事实上,这就是你在清单1中所看到的。 

最后,是STRING函数。它返回一个长度达60个字符的随机字符串。参数OPT可以是清单2显示的值中的任何一个单个字符。 

关于这些函数及DBMS_RANDOM包的文件都包含在SQLPlus中: 

select text 

from all_source 

where name = 'DBMS_RANDOM' 

and type = 'PACKAGE' order by line;
问:连接次序与谓词求值 

在下面的查询中,WHERE 语句的哪一部分先执行? 

Select field names from emp, dept 

where emp.dept_num = dept.num and 

emp.name Like 'S%' and dept.name='IT'; 

答:执行次序随已有的索引、统计、和session/init.ora参数的不同而变化。 

假定已有一个建立在DEPT(name)和EMP(dept_num)上的索引。假定优化器认为DEPT是唯一的,它可能按下面的顺序进行操作: 
 

利用建立在DEPT(name)上的索引查找dept列 

利用建立在EMP(dept_num)上的索引查找匹配的emp列(即连接emp.dept_num = dept.num) 

依据建立在emp.ename like 'S%'进行过滤 

现在,我们假定没有建立在EMP(dept_num)上的索引,也没有建立在DEPT(name)上的索引,而存在建立在EMP(name)和DEPT(num)上的索引。优化器可能按下面的次序进行操作: 

利用建立在EMP(name)上的索引找到带有S的EMPS 

利用建立在DEPT(num)上的索引找到匹配项 

根据dept.name = 'IT'过滤结果 

谓词求值的次序是不确定的,可以随时间的改变而改变,并由优化器决定。不要假定任何事情会按一定的次序发生。如果你那么做,随着时间的推移,你的应用程序可能会出现一些看起来非常奇怪的错误。看以下的例子:建立一个表,输入一些数据。当X='a’时,第二列的数据“Y”是一个数值,当X='b’时,“Y”不是数字。 

SQL> create table t ( x varchar2(1), y varchar2(1) ); 

Table created. 

SQL> insert into t values ( 'a', '1' ); 

1 row created. 

SQL> insert into t values ( 'b', 'x' ); 

1 row created.
现在根据这个表运行一个查询:查找满足x='a',y=1的行。 

SQL> select * from t where x = 'a' and 

y = 1; 

ERROR: 

ORA-01722: invalid number 

no rows selected(错误,无效的数字,没有选择任何行) 

呦,没有成功。在这种情况下,数据库首先执行Y=1,当找到Y='X'的行后,很显然,它不能将'X'转换为一个数字,所以失败了。而下面的程序将给出不同的结果: 
 

SQL> analyze table t compute statistics; 

Table analyzed.(表已经分析过) 

SQL> select * from t where x = 'a' and 

y = 1; 

X Y 

- - 

a 1 

使用不同的优化器模式,成功了!为什么?优化器说:“嘿,检查x= 'a'要比检查y=1来得快,因为在y=1中有一个将y从字符变为数字的转换。所以,我先检查x= 'a',然后再检查y=1。” 

这个例子说明谓词执行的次序可能是不确定的,你不能指望有一种特定的执行次序。也就是说,当你依靠一个隐含的转换时,必须非常谨慎。 

问:显示SGA--fixed size(固定大小)与variable size(可变大小) 

当在svrmgr提示符下运行 “show SGA”时,fixed size和variable size是什么意思? 

答:fixed size就是SGA中固定组件(它在编译oracle 数据库本身时就固定于其中)的大小。它是固定大小的内存,用来指向SGA的其它部分。SGA这一部分的大小是不能改变的。 

variable size指分配的内存块大小可变。SGA的可变块,分为共享池、大池、JAVA池、游标区和其他结构。
【作者:本站编辑┊来源:培训资讯网┊2006-08-29】TAGS:
评论与咨询 内容报错
姓名: 电话: 邮箱: 地址:

  • ·本咨询平台是部分培训机构与本站指定的网上报名、咨询的专用平台,您可以通过此处提交您的信息,我们或该机构会根据您所提交的信息及时给予回复;
  • ·为了更好的问您服务,请填写您真实的姓名和相关联系方式,以便我们能及时给您答复;
  • ·不得提交有关违反国家互联网规定的不良信息,对于违规者我们有权追究你的法律责任!若有任何问题请 联系我们
关于我们 | 服务条款 | 广告服务 | 客服中心 | 网站导航 - 设为首页 - 收藏本站
Copyright © 2006-2008 www.0512edu.com.cn All Rights Reserved
苏州培训资讯网 版权所有
Powered By:AspArticle2.0 在远方