問利用QUERY選項輸出數據 我知道在Oracle
i中
可以使用QUERY有選擇地輸出表數據
我想用EXP命令來實現
但沒有成功
下面是我所寫的命令
以及得到的錯誤信息
exp ddd/ddd file=/dbf/u
/customer
dmp
tables=AASC
AST_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=exp
par
如果使用包含query=
where object_id <
的PARFILE文件
我可以在兩個系統中使用相同的一個命令
exp userid=/ tables=t parfile=exp
par
在兩種操作系統中
完全相同
這相對於在不同的平台中使用不同的QUERY字符串容易多了
問DBMS_RANDOM 您能否告訴我寫一個能產生大於
小於
的隨機數的隨機數產生器的最好方法?
答
Oracle
版介紹了DBMS_RANDOM包
Oracle
i
版介紹了DBMS_RANDOM包的新功能
但Oracle
i 文檔中沒有詳細全面介紹其功能
幸運的是
有一個新的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_random
value
dbms_random
value(
)
from dual;
VALUE DBMS_RANDOM
VALUE(
)
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 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 varchar
(
)
y varchar
(
) );
Table created
SQL> insert into t values (
a
);
row created
SQL> insert into t values (
b
x
);
row created
現在根據這個表運行一個查詢
查找滿足x=
a
y=
的行
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池
游標區和其他結構
From:http://tw.wingwit.com/Article/program/Oracle/201311/17509.html