熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

Oracle數據庫常見問題答疑二

2013-11-13 15:55:06  來源: Oracle 

  利用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=bY不是數字
  
  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 SGAfixed size和variable size是什麼意思?
  
  答fixed size就是SGA中固定組件(它在編譯oracle 數據庫本身時就固定於其中)的大小它是固定大小的內存用來指向SGA的其它部分SGA這一部分的大小是不能改變的
  
  variable size指分配的內存塊大小可變SGA的可變塊分為共享池大池JAVA池游標區和其他結構
From:http://tw.wingwit.com/Article/program/Oracle/201311/17509.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.