问利用QUERY选项输出数据
我知道在Oraclei中可以使用QUERY有选择地输出表数据我想用EXP命令来实现但没有成功下面是我所写的命令以及得到的错误信息
exp ddd/ddd file=/dbf/u/customerdmp
tables=AASCAST_CUSTOMER_KEEP
query=\where CUA_TRANS_DTS \<
add_months\(sysdate \)\
table_export[]: CUA_TRANS_DTS: not found(没有找到)
答操作系统不同用来指定QUERY=参数的方法也不同WHERE 语句里面往往有很多特殊的字符如=><和空格等等而UNIX和Windows操作系统中的外壳命令提示是不欢迎这些字符的这些字符将被忽略你应该根据不同的操作系统采用不用的方法我一般使用带有QUERY选项的参数文件(PARFILE)利用PARFILE可以不考虑操作系统平台而使用完全相同的方法
下面给出一个例子我用select * from all_objects建立了一个表T我希望输出所有object_id 小于的行在Windows中必须这样做
C:\exp>exp userid=tkyte/tkyte tables=t
query=where object_id <
注意在windows中需要在WHERE语句的两端使用三个双引号在UNIX中必须这样做
$ exp userid=/ tables=t query=\where
object_id \< \
exp userid=/ tables=t parfile=exppar
如果使用包含query=where object_id < 的PARFILE文件我可以在两个系统中使用相同的一个命令
exp userid=/ tables=t parfile=exppar
在两种操作系统中完全相同这相对于在不同的平台中使用不同的QUERY字符串容易多了
问DBMS_RANDOM
您能否告诉我写一个能产生大于小于的随机数的随机数产生器的最好方法?
答Oracle 版介绍了DBMS_RANDOM包Oraclei 版介绍了DBMS_RANDOM包的新功能但Oraclei 文档中没有详细全面介绍其功能幸运的是有一个新的DBMS_RANDOM包函数能够返回之间的随机数这个新函数是
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 VARCHAR;
VALUE函数的第一种形式返回一个大于或等于且小于的随机数第二种形式返回一个大于或等于LOW小于HIGH的随机数下面是其用法的一个示例
SQL> select dbms_randomvalue
dbms_randomvalue()
from dual;
VALUE DBMS_RANDOMVALUE()
NORMAL函数返回服从正态分布的一组数此正态分布标准偏差为期望值为这个函数返回的数值中有%是介于与+之间%介于与+之间%介于与+之间事实上这就是你在清单中所看到的
最后是STRING函数它返回一个长度达个字符的随机字符串参数OPT可以是清单显示的值中的任何一个单个字符
关于这些函数及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
w
here empdept_num = deptnum and
empname Like S% and deptname=IT;
答执行次序随已有的索引统计和session/initora参数的不同而变化
假定已有一个建立在DEPT(name)和EMP(dept_num)上的索引假定优化器认为DEPT是唯一的它可能按下面的顺序进行操作
利用建立在DEPT(name)上的索引查找dept列
利用建立在EMP(dept_num)上的索引查找匹配的emp列(即连接empdept_num = deptnum)
依据建立在empename like S%进行过滤
现在我们假定没有建立在EMP(dept_num)上的索引也没有建立在DEPT(name)上的索引而存在建立在EMP(name)和DEPT(num)上的索引优化器可能按下面的次序进行操作
利用建立在EMP(name)上的索引找到带有S的EMPS
利用建立在DEPT(num)上的索引找到匹配项
根据deptname = IT过滤结果
谓词求值的次序是不确定的可以随时间的改变而改变并由优化器决定不要假定任何事情会按一定的次序发生如果你那么做随着时间的推移你的应用程序可能会出现一些看起来非常奇怪的错误看以下的例子建立一个表输入一些数据当X=a时第二列的数据Y是一个数值当X=b时Y不是数字
SQL> create table t ( x varchar() y varchar() );
Table created
SQL> insert into t values ( a );
row created
SQL> insert into t values ( b x );
row created
现在根据这个表运行一个查询查找满足x=ay=的行
SQL> select * from t where x = a and
y = ;
ERROR:
ORA: invalid number
no rows selected(错误无效的数字没有选择任何行)
呦没有成功在这种情况下数据库首先执行Y=当找到Y=X的行后很显然它不能将X转换为一个数字所以失败了而下面的程序将给出不同的结果
SQL> analyze table t compute statistics;
Table analyzed(表已经分析过)
SQL> select * from t where x = a and
y = ;
X Y
a
使用不同的优化器模式成功了!为什么?优化器说嘿检查x= a要比检查y=来得快因为在y=中有一个将y从字符变为数字的转换所以我先检查x= a然后再检查y=
这个例子说明谓词执行的次序可能是不确定的你不能指望有一种特定的执行次序也就是说当你依靠一个隐含的转换时必须非常谨慎
问显示SGAfixed size(固定大小)与variable size(可变大小)
当在svrmgr提示符下运行 show SGA时fixed size和variable size是什么意思?
答fixed size就是SGA中固定组件(它在编译oracle 数据库本身时就固定于其中)的大小它是固定大小的内存用来指向SGA的其它部分SGA这一部分的大小是不能改变的
variable size指分配的内存块大小可变SGA的可变块分为共享池大池JAVA池游标区和其他结构