標準 XMLHttpRequest 的操作方法如下 :

abort()
停止當前請求

getAllResponseHeaders()
把 HTTP 請求的所有回應標頭作為鍵/值對傳回

getResponseHeader("header")
傳回指定標頭的字串值

open("method", "url")
建立對伺服器的呼叫。method 參數可以是 GET、POST 或 PUT。url 參數可以是相對 URL 或絕對 URL。這個方法還包括 3 個可選的參數

send(content)
向伺服器發送請求

setRequestHeader("header", "value")
把指定標頭設定為所提供的值。在設定任何標頭之前必須先呼叫 open

接下來,再來針對各別的方法 ( Method ) 作比較仔細的說明:

void abort()
顧名思義,這個方法就是要停止請求。

string getAllResponseHeaders()
這個方法的核心功能對 Web 應用程式開發人員應該很熟悉了,它傳回一個字串,其中包含 HTTP 請求的所有回應標頭,標頭包括 ContentLength、Date 和 URI。

string getResponseHeader(string header)
這個方法與 getAllRes-ponseHeaders() 是對應的,不過它有一個參數表示你希望得到的指定標頭值,並把這個值作為字串傳回。

void open(string method, string url, boolean asynch, string username,string password)
這個方法會建立對伺服器的呼叫。這是初始化一個請求的純腳本方法。它有兩個必要的參數,還有 3 個可選參數。
要提供呼叫的特定方法(GET、POST 或 PUT)
還要提供所呼叫資源的 URL。

另外還可以傳遞一個 Boolean 值,指示這個呼叫是非同步的還是同步的。預設值為 true,表示請求本質上是非同步的。如果這個參數為 false,處理就會等待,直到從伺服器傳回回應為止。由於非同步呼叫是使用 Ajax 的主要優勢之一,所以倘若將這個參數設定為 false,從某種程度上講與使用XMLHttpRequest 物件的初衷不太相符。不過,前面已經說過,在某些情況下這個參數設定為 false 也是有用的,比如在持久儲存頁面之前可以先驗證使用者的輸入。

最後兩個參數不說自明,允許你指定一個特定的使用者名稱和密碼。

void send(content)
這個方法實際向伺服器發出請求。如果請求聲明為非同步的,這個方法就會立即傳回,否則它會等待直到接收到回應為止。可選參數可以是 DOM 物件的實例、輸入串流,或者字串。傳入這個方法的內容會作為請求本體的一部分發送。

void setRequestHeader(string header, string value)
這個方法為 HTTP請求中一個給定的標頭設定值。它有兩個參數,第一個字串表示要設定的標頭,第二個字串表示要在標頭中放置的值。需要說明,這個方法必須在呼叫 open() 之後才能呼叫。

  在所有這些方法中,最有可能用到的就是 open() 和 send()。XMLHttp-Request 物件還有許多屬性,在設計 Ajax 互動時這些屬性非常有用。

 

文章標籤

MIS 發表在 痞客邦 留言(0) 人氣()

XMLHttpRequest 重要的屬性: onreadystatechange,readyState,status, statusText ,responseXML ,responseText。  

  • onreadystatechange
    參考至callback函式,readyState每次改變時,都會呼叫onreadystatechange所參考的函式。  
  • responseText
    伺服器傳來的請求回應文字,會設定給這個屬性。  
  • responseXML
    伺服器傳來的請求回應如果是XML,會成為DOM設定給這個屬性。  
  • statusText
    返回當前 XMLHttpRequest 請求的回應行狀態,回傳值: string status  
  • readyState
    回應 XMLHttpRequest 的當前狀態,會有0到4的數值,共有5個狀態

0 = UNINITIALIZED; opennot yet called
(未初始化) Object已建立,但是尚未初始化(尚未使用open方法)  

1 = Open; send for request not yet called
(初始化) Object已建立,尚未使用send方法  

2 = Sent; send called, headers and status are available
(送出數據) send方法已使用,但是當前的狀態及http檔頭頭未知  

3 = Receiving; downloading response, responseText only partially set (數據傳送中) 已接收部分數據,因為回應及http檔頭不全,這時通過 responseBody 和responseText 獲取部分數據會出現錯誤  

4 = COMPLETED; finished downloading
(完成)數據接數完畢,此時可以通過 responseBody 和 responseText 獲取完整的回應數據

status: 回應 XMLHttpRequest 請求的 http 狀態碼 ,回傳值:integer status code

100:Continue
101:Switching protocols
200:OK
201:Created
202:Accepted
203:Non-Authoritative Information
204:No Content
205:Reset Content
206:Partial Content
300:Multiple Choices
301:Moved Permanently
302:Found
303:See Other
304:Not Modified
305:Use Proxy
307:Temporary Redirect
400:Bad Request
401:Unauthorized
402:Payment Required
403:Forbidden
404:Not Found
405:Method Not Allowed
406:Not Acceptable
407:Proxy Authentication Required
408:Request Timeout
409:Conflict
410:Gone
411:Length Required
412:Precondition Failed
413:Request Entity Too Large
414:Request-URI Too Long
415:Unsupported Media Type
416:Requested Range Not Suitable
417:Expectation Failed
500:Internal Server Error
501:Not Implemented
502:Bad Gateway
503:Service Unavailable
504:Gateway Timeout
505:HTTP Version Not Supported

PS:此屬性 status 是唯讀,返回當前 XMLHttpRequest 請求的 http 狀態碼 ,此屬性僅當數據送出並完整接收完畢後才可以獲取。

程式範例如下:

if(myXmlHttp.readyState == 4) {
   if(myXmlHttp.status == 200) {
   //以純文字方式取回伺服器回傳資料
   txtresp = myXmlHttp.responseText;
   //以 XML 方式取回伺服器回傳資料
   xmlresp = myXmlHttp.responseXML;
   if (txtresp) {
      alert(txtresp);
      document.getElementById("myTxtResp").innerHTML = txtresp;
   }
}
 
文章標籤

MIS 發表在 痞客邦 留言(0) 人氣()

  AJax 技術是目前網頁流行的趨勢,在工作上也時常運用此技術.那什麼是 AJax 呢?節錄一段 WIKI 上的 AJax 文章如下: AJAX 全稱為「Asynchronous JavaScript and XML」(非同步JavaScript和XML),是一種創建互動式網頁應用的網頁開發技術。根據Ajax提出者Jesse James Garrett 建議,它:

  • 使用XHTML+CSS來表示資訊;
  • 使用JavaScript操作DOM(Document Object Model)進行動態顯示及互動;
  • 使用XML和XSLT進行資料交換及相關操作;
  • 使用XMLHttpRequest物件與Web伺服器進行非同步資料交換;
  • 使用JavaScript將所有的東西繫結在一起。
  • 使用SOAP以XML的格式來傳送方法名和方法參數。

   對架構有興趣的網友再自行細讀.接下來我們要以實作來瞭解AJax的運作,在實作之前再說明一下, JavaScript要放在網頁中的兩種模式:

第一種:JavaScript 嵌入 HTML 中的作法,有下列兩種模式

A: <script type="text/javascript"> .code </script>
B: <script type="text/javascript" src="url"></script>

建議使用 B 為宜,因為這樣程式碼分離,閱讀及 Debug 都較為方便.

第二種:搭配 XHTML,若是搭配嚴謹的XHTML格式則必須使用 cdata 將 JavaScript 用註解格式封裝 

<script type="“text/javascript”">
<![CDATA[//>
<!— Javascript Code here … //-->
<!]]>
</script>

AJAX 處理的順序大致可以分成下列五個步驟

1.Create the object : XMLHttpRequest
2.Set the readystatechange event trigger
3.Open the Request
4.Send the Request
5.Check the readyState property

整個架構圖如下:

AjaxConcept.png  

   下面就舉實例來說明 AJax 這五個步驟,在這個實例中需要兩個檔案 AJax.html & HelloAjax.txt,透過 AJax.html 是來取得網站內 HelloAjax.txt 檔案裡的資料。  

AJax.html 檔案

<html>
<head>
<script type='text/javascript'>  
var myXmlHttp;
function createXmlHttpObj(){
   if(window.XMLHttpRequest) {
      myXmlHttp = new XMLHttpRequest();
    } else if(window.ActiveXObject) {
      myXmlHttp = new ActiveXObject("Microsoft.XMLHTTP");  
    }
}

function handleStateChange(){
   var txtresp;
   var xmlresp;
   if(myXmlHttp.readyState == 4) {
      if(myXmlHttp.status == 200) {
    //以純文字方式取回伺服器回傳資料
   txtresp = myXmlHttp.responseText;
   //以 XML 方式取回伺服器回傳資料
    xmlresp = myXmlHttp.responseXML;
   //5.Check the readyState property
    if (txtresp) {
    document.getElementById("myTxtResp").innerHTML = txtresp;
      }     
     }  
 }
}
function sendRequest(){
 // 1.Create the object : XMLHttpRequest   
 createXmlHttpObj();  
 if(myXmlHttp) {      
  // 2.Set the readystatechange event trigger      
  myXmlHttp.onreadystatechange = handleStateChange;      
  // 3.Open the Request      
  myXmlHttp.open('get', 'HelloAjax.txt');      
  // 4.Send the Request      
  myXmlHttp.send(null);  
 }else {
   alert("您的瀏覽器不支援這個Ajax程式的功能");
 }
}
</script>
</head>
<body>
    <input value="click me(介紹 AJax 的功能)" onclick="sendRequest();" type="button"><br>
    <a href="#" onClick="sendRequest();" >click me(介紹 AJax 的功能)</a>
    <div id="myTxtResp"></div>
</body>
</html>

HelloAjax.txt 檔案

Hello AJax
這是由 AJax 技術取得伺服器後端 HelloAjax.txt 的檔案資料
文章標籤

MIS 發表在 痞客邦 留言(0) 人氣()

step1:首先安裝 Oracle 免費的資料庫版本作為測試:Oracle Database 11g Express Edition,安裝最後將system的密碼修改為oracle作為測試用。

step2:下載 AppServ 2.5.10 安裝後

  • 1. 修改php.ini檔,將;extension=php_oci8.dll 中的 ; 除去
  • 2. 修改php.ini檔,設定 session.save_path = "c:/temp"
  • 3. 並重啟apache:
    C:\AppServ\Apache2.2\bin>httpd -k restart

step3:建立 PHP 連結 Oracle 資料庫的測試程式:oracle_conn_test.php

<?php

$db = "(DESCRIPTION=(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)))(CONNECT_DATA=(SID=XE)))";

if ($c = OCILogon ( "system", "oracle", $db )) {
        
        echo "Successfully connected to Oracle.\n";
        
        OCILogoff ( $c );

} else {
        
        $err = OCIError ();
        
        echo "Connection failed." . $err [text];

}

?>

 

MIS 發表在 痞客邦 留言(0) 人氣()

在撰寫 PHP 程式時,error_reporting($Constant) 是指定PHP程式執行過程中,發生錯誤時,錯誤資訊產出在網頁的時機,只需要設定錯誤的等級,回報的錯誤將會有所不同。

參數說明:

Value

Constant

Description

Note

1 E_ERROR 執行時期致命的錯誤  
2 E_WARNING 執行時期錯誤警告  
4 E_PARSE 編譯時的程式剖析錯誤  
8 E_NOTICE 執行時期的提醒  
16 E_CORE_ERROR PHP 引擎啟動執行時產生的致命錯誤  
32 E_CORE_WARNING PHP 引擎啟動執行時產生的警告 since PHP 4
64 E_COMPILE_ERROR 致命的編譯時錯誤 since PHP 4
128 E_COMPILE_WARNING 致命的編譯時警告 since PHP 4
256 E_USER_ERROR 使用者定義的錯誤 since PHP 4
512 E_USER_WARNING 使用者定義的警告 since PHP 4
1024 E_USER_NOTICE 使用者定義的提醒 since PHP 4
2048 E_STRICT 編碼標準化警告(建議如何修改以向前兼容) since PHP 5.4
4096 E_RECOVERABLE_ERROR 接近致命的運行時錯誤,若未被捕獲則視同E_ERROR since PHP 5.2.0
8192 E_DEPRECATED Run-time notices. Enable this to receive warnings about code that will not work in future versions. since PHP 5.3.0
16384 E_USER_DEPRECATED User-generated warning message. This is like an E_DEPRECATED, except it is generated in PHP code by using the PHP function trigger_error(). since PHP 5.3.0
30719 E_ALL 所有的錯誤、警告 32767 in PHP 6, 30719 in PHP 5.3.x, 6143 in PHP 5.2.x, 2047 previously

 



範例:

1/0 會產生一個 WARNING 的錯誤等級,先將程式錯誤等級設為 E_ERROR ,則不會有錯誤訊息出現,因為已經被忽略了。

error_reporting(E_ERROR);
printf("%d\n", 1/0);

error_reporting(E_WARNING);
printf("%d\n", 1/0);


 

輸出結果:

0
Warning: Division by zero in C:\AppServ\www\test.php on line 6
0 



參考文件:
http://tw2.php.net/manual/en/errorfunc.constants.php#errorfunc.constants.errorlevels.e-error

文章標籤

MIS 發表在 痞客邦 留言(0) 人氣()

Windows Server AD 是一個 LADP 伺服器,可讓您將資訊儲存在目錄服務中,在資料庫中進行查詢,並可以使用他來作為身份的認證授權。

使用PHP撰寫程式難免會遇到需要作身份認證的問題,除了自行撰寫這部份程式的選擇外,PHP 的函式庫中亦提供了標準的 LDAP 函式,如果公司組織中已經有架設 Windows 2K/2003 網域的環境 ,將身份認證的工作交由 Windows AD 亦是一個不錯的選擇。

在寫此程式前,請先到 php.ini 檔,打開 php_ldap.dll 的功能(預設是關閉的),否則執行時會出現未定義函數的錯誤訊息。(打開後記得要重啟apache服務,功能才會生效)

PHP可以一筆一筆撈出AD資料(ldap_first_entry / ldap_next_entry),然後將每一筆資料的欄位屬性解析出來(ldap_get_values)。

實作如下:

案例環境說明:
1.公司組織內有一個Windows 網域,名稱為: domain.com。
2.domain.com 的網域有兩部網域主控站(DC)分別為:dc.domain.com、dc2.domain.com。
3.PHP版本:5.2.1 由下載 AppServ 2.5.10 安裝

PHP程式碼範例:

<?php
$domain = 'domain.com'; //設定網域名稱
$dn="dc=domain,dc=com";

$user = 'administrator'; //設定欲認證的帳號名稱
$password = 'password'; //設定欲認證的帳號密碼

// 使用 ldap bind 
$ldaprdn = $user . '@' . $domain; 
// ldap rdn or dn 
$ldappass = $password; // 設定密碼

// 連接至網域控制站
$ldapconn = ldap_connect($domain) or die("無法連接至 $domain");

// 如果要特別指定某一部網域主控站(DC)來作認證則上面改寫為
//$ldapconn = ldap_connect('dc.domain.com) or die("無法連接至 dc.domain.com"); 
// 或 
// $ldapconn = ldap_connect('dc2.domain.com)or die("無法連接至 dc2.domain.com"); 

//以下兩行務必加上,否則 Windows AD 無法在不指定 OU 下,作搜尋的動作
ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldapconn, LDAP_OPT_REFERRALS, 0);

if ($ldapconn) 
{ 
        // binding to ldap server
        echo("連結$domain <br>".$ldaprdn.",".$ldappass."<br>");
        $ldapbind = ldap_bind($ldapconn, $user, $password);     
        //$ldapbind = ldap_bind($ldapconn, $ldaprdn, $ldappass);     
        //$ldapbind = ldap_bind($ldapconn);     
        // verify binding     
        if ($ldapbind) 
        {         
                $filter = "(sAMAccountName=$user)";        
                $result = @ldap_search($ldapconn, $dn, $filter);        
                if($result==false) 
                        echo "認證失敗(找不到 $user)";        
                else 
                {            
                        echo "認證成功...";             
                        //取出帳號的所有資訊             
                        $entries = ldap_get_entries($ldapconn, $result);
                        $data = ldap_get_entries( $ldapconn, $result );
                        
                        echo $data ["count"] . " entries returned\n";
                        
                        for($i = 0; $i <= $data ["count"]; $i ++) {
                                for($j = 0; $j <= $data [$i] ["count"]; $j ++) {
                                        echo "[$i:$j]=".$data [$i] [$j] . ": " . $data [$i] [$data [$i] [$j]] [0] . "\n<br>";
                                }
                        }                            
                }    
        } 
        else 
        {         
                echo "認證失敗...";     
        } 
}
//關閉LDAP連結
ldap_close($ldapconn);
?> 
文章標籤

MIS 發表在 痞客邦 留言(0) 人氣()

本篇文章主要在介紹 Oracle SQL Loader: SQLLDR 的使用方法,如何將檔案資料快速上載到 Oracle 資料庫的 Table 中。

  • Input data file for SQL*Loader

準備要匯入的資料,以逗點''作為每一欄位的分隔,每一行則為每一筆資料。以下列的來說,則有六筆資料,每一筆資料則有 4 個欄位值。

C:\tmp\oracle>type employee.txt
100,Thomas,Sales,5000
200,Jason,Technology,5500
300,Mayla,Technology,7000
400,Nisha,Marketing,9500
500,Randy,Technology,6000
501,Ritu,Accounting,5400

 

  • SQL*Loader Control File

依匯入資料的格式,作好SQL Loader 控制檔

C:\tmp\oracle>type employee.ctl
load data
 infile 'employee.txt'
 into table employee
 fields terminated by ","
 ( id, name, dept, salary )

參數說明如下:

  • infile – 資料檔放置的路徑及檔名
  • into table – 要載入到那一個 table name
  • fields terminated by – 欄位與欄位之間的分隔符號
  • ( id, name, dept, salary ) – 列出是要將資料放入那幾個欄位

 

  • 在資料庫中建立一個table:employee
SQL> create table employee
(
  id integer,
  name varchar2(10),
  dept varchar2(15),
  salary integer,
  hiredon date
)

 

  •  執行 sqlldr 上載資料
C:\tmp\oracle>sqlldr scott/tiger control=employee.ctl
SQL*Loader: Release 11.2.0.2.0 - Production on 星期四 10月 25 14:16:39 2012
Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.
Commit point reached - logical record count 5
Commit point reached - logical record count 6

 

  • 驗證一下資料是否有上載到資料庫的 table:employee 中

sqlldr-employee.png  

 

  • 若有新的資料,要加入到 table:employee ,則必須在控制檔增加 參數:append
C:\tmp\oracle>type employee-append.ctl
load data
 infile 'employee-append.txt'
 append
 into table employee
 fields terminated by ","
 ( id, name, dept, salary )

 

要增加的資料如下:

C:\tmp\oracle>type employee-append.txt
600,Ritu,Accounting,5400
700,Jessica,Marketing,7800

 

  • 再執行一次 sqlldr
C:\tmp\oracle>sqlldr edi/edi control=employee-append.ctl
SQL*Loader: Release 11.2.0.2.0 - Production on 星期四 10月 25 14:35:30 2012
Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.
Commit point reached - logical record count 1
Commit point reached - logical record count 2

 

  • 再次驗證資料

sqlldr-employee-append.png  

 

  • 若要上載到資料庫的資料格式是固定位置如下:
200JasonTechnology550001-02-2005
300MaylaTechnology700010-08-2000
500RandyTechnology600001-01-2007

 

  • 控制檔可以修改如下:
C:\tmp\oracle>type employee-fixed.ctl
load data
 infile 'employee-fixed.txt'
 into table employee
 fields terminated by ","
 ( id position(1:3), name position(4:8), dept position(9:18), salary position(19:22),hiredon position(23:32) DATE "DD-MM-YYYY")

 

驗證資料:

sqlldr-employee-fixed.png  

文章標籤

MIS 發表在 痞客邦 留言(0) 人氣()

  Oracle 從 9i 開始提供了 Flashback Query 功能,可用於恢復錯誤的 DML 操作。在 Oracle 10g 中對 Flashback Query 做了較大改進,不再局限於 Flashback Query ,還可用於恢復錯誤的 DDL(Drop) 操作。

  Flashback Query  是透過一個新的 Package:DBMS_FLASH 來實現。DBA 可使用 Flashback Query 可以及時取得錯誤操作 DML(Delete、Update、Insert) 在當前某一時間點資料庫的映射視圖,DBA 可以利用系統時間或系統改變號(SCN:System Change Number)來指定這個唯讀視圖,並可以針對錯誤進行相應的恢復措施。

  以下來實作一下整個過程:

1. 可以先用下列 SQL 語法來查詢 recyclebin 是否有被 drop 的 table,此時應該是沒有的。

SQL>select object_name,original_name,operation,type,droptime from recyclebin;

 2. 建立測試的 table : demo_users

create table demo_users (id char(2), name varchar2(10));
insert into demo_users values ('01','David');
insert into demo_users values ('02','Scott');
select * from demo_users;

 可以查詢到有兩筆資料在 demo_users 的資料表( Table )裡。

recyclebin_table_select_ok.png  

3. 刪除資料表 demo_users 並在查詢資源回收筒中是否有被刪除的資料表。

SQL>drop table demo_users;
SQL>SELECT object_name,original_name,operation,type,droptime 
FROM recyclebin;

 此時發現有一筆資料

recyclebin_table.png  

4. 回復此資料表 demo_users

SQL>flashback table demo_users to before drop ;

 這樣子就可以將資料表 Table:demo_users 回復了。

      Oracle Flashback Database 的特性允許透過 SQL 語法 Flashback Database 語句,讓資料庫回到當前的某一個時間點或者SCN,而不需要做時間點的恢復。Flashback Database 可以迅速將資料庫回到錯誤操作或人為錯誤的前一個時間點,如 Ctrl+Z 的 "復原" 操作,可以不利用備份資料 (RM) 就可以快速的實現以時間點為基礎來作恢復。Oracle 通過新建的 Flashback Logs,記錄資料庫的 Flashback 操作。如果希望能 Flashback Database,需要設置如下參數:DB_RECOVER_FILE_DEST日誌的存放位置, DB_RECOVER_FILE_DEST_SIZE恢復區的大小。在建立資料庫的時候,Oracle將自動建立恢復區,但預設是關閉的,需要執行 alter database flashback on 的指令來啟動。

 

  • 若要回復整個資料庫到當前的某一個時間點,SQL 指令為:
SQL>flashback database to time to_timestamp(xxx);
  •  若要回復某一個資料表 Table 到當前的某一個時間點,SQL 指令為:
SQL> flashback table table_name to timestamp 
to_timestamp('2006-05-30 14:21:43','yyyy-mm-dd hh24:mi:ss');

  • 有關scn值就是記錄在這個table裡:flashback_transaction_query


  table_flashback_transaction_query.png  

參考文獻: http://blog.roodo.com/mywork/archives/1684525.html

 

Configuring Your Database for Oracle Flashback Transaction Query

To configure your database for the Oracle Flashback Transaction Query feature, you or your database administrator must do the following:

  • Ensure that Oracle Database is running with version 10.0 compatibility.

  • Enable supplemental logging:

    ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;

 

Configuring Your Database for Flashback Transaction

To configure your database for the Flashback Transaction feature, you or your database administrator must do the following:

  • With the database mounted but not open, enable ARCHIVELOG:

    ALTER DATABASE ARCHIVELOG;
    
  • Open at least one archive log:

    ALTER SYSTEM ARCHIVE LOG CURRENT;
    
  • If not done already, enable supplemental logging:

    ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
    

 

文章標籤

MIS 發表在 痞客邦 留言(0) 人氣()

  Oracle 的 External Tables 被定義為可以讀取資料庫外部的資料,如:文字檔案、CSV...等檔案;您可以把它當成是一個可以不需事先將資料導入( load in ) 資料庫就可以進行 Query 的 View,您可以針對 external table 的 data 作 select、join、sort 等動作,也可以對 external tables 建立 views,synonymes。但是,你不能對這些 external 作DML 的動作(UPDATE, INSERT, or DELETE),也就是只能讀取( Read Only ),而且也不能建立 index。

下面的範例中,將對不同格式 Comma delimitedFixed field length 的檔案來作示範。

Step I: 建立 External Tables 所需的文字檔

Comma delimited (文字檔案、CSV) 檔案資料格式如下,各欄位以 ',' 作為區隔

200,Whalen,Administration,1987.09.17 00:00:00
201,Hartstein,Marketing,1996.02.17 00:00:00
202,Fay,Marketing,1997.08.17 00:00:00
114,Raphaely,Purchasing,1994.12.07 00:00:00
115,Khoo,Purchasing,1995.05.18 00:00:00
116,Baida,Purchasing,1997.12.24 00:00:00
117,Tobias,Purchasing,1997.07.24 00:00:00
118,Himuro,Purchasing,1998.11.15 00:00:00

 Step II: 建立 Directory 物件 

CREATE OR REPLACE DIRECTORY ext_dir as 'C:\oraclexe\ExternalTable';

為了預防 ORA-29913 的錯誤,因此需授權需要讀取資料的人有讀/寫的權限

GRANT read, write on directory ext_dir to polin;

Step III: 建立 External Tables

CREATE TABLE ext_table_csv (
  employee_id     number(6),
  last_name       varchar2(25),
  department_name  varchar2(30),
  hire_date       date
)
ORGANIZATION EXTERNAL (
  type              oracle_loader
  default directory ext_dir
  access parameters (
    records delimited  by newline
    fields  terminated by ','
    missing field values are null
    (employee_id, last_name, department_name,hire_date CHAR(19) DATE_FORMAT DATE MASK "YYYY.MM.DD HH24:MI:SS")
  )
  location ('user_dept.csv')
)
reject limit unlimited;

ACCESS PARAMETERS 參數指定,此 External Tables 的格式,以 NEWLINE為每筆資料的分隔,每個欄位用 ',' 分隔,若有無值的狀況,當成 NULL,四個欄位分別為 employee_id,last_name,department_name,hire_date,其中 hire_date 的 format 指定為 "YYYY.MM.DD HH24:MI:SS"

Step IV: Querying Data

select * from ext_table_csv order by department_name;

查詢出來的資料如下圖:
externalTableQuery.png  

Fixed field length 檔案資料格式如下,各欄位的資料長度是固定的,以欄位的起始位址作為區隔,如前兩碼1-2是國家代碼,第3碼是區域碼

AR2
AU3
BE1
BR2
CA2
CH1
CN3
DE1

 Fixed field length所需建立 External Tables 的語法如下:

CREATE TABLE ext_table_fixed (
   country_id CHAR(2),
   region_id NUMBER(1)
)
ORGANIZATION EXTERNAL (
   type       oracle_loader
   default directory ext_dir
   access parameters (
     records delimited by newline
     fields (
       country_id position(1:2) ,
       region_id  position(3:4)
    )
  )
  location ('country_region.txt')
)
reject limit unlimited;

延伸討論

若我們將 External Table 實體目錄 'C:\oraclexe\ExternalTable' 下的檔案更名或刪除,則系統會有錯誤訊息,因此可以得知,它是直接去讀取該目錄下的檔案內容。

externalTableQueryError.png  

Populating Tables using the INSERT command
如果您想對這些資料作進一步的操作,可以是使用"insert into ... select from" 的語法來將這些資料加入 Database 中,這種方式比 SQL*Loader的效率好很多。

Dropping External Tables
如果你不需要這些 External Tables,可以使用 DROP TABLE statement 將它們移除,不過這不會影響到存在於資料庫外的檔案。

Summary
基本上你也可以使用 SQL*Loader來完成以上的事情,但是相較之下 External Tables 彈性跟效率都比較好。External Table尚有其他的定義和使用注意事項( Ex. Performance ),在使用前最好是先評估一下。

參考文獻
External tables in Oracle http://www.adp-gmbh.ch/ora/misc/ext_table.html

MIS 發表在 痞客邦 留言(0) 人氣()

關於Express的版本

  • SQL Server Express (x86 和 x64)

單純只有SQL Server Express資料庫系統。與with Tools, with Advanced Services兩版本最大差異就是沒有SQL Server Management Studio 2008 Express(SSMSE)管理工具。也就是說,如果你的這台資料庫伺服器只需要讓遠端Client連接進來進行相關作業,根本不會有本機使用 SSMSE管理工具的機會,那就很適合這個版本,小又單純。

  • SQL Server Express with Tools (x86 和 x64)


這是2008 Express + SSMSE管理工具的版本。也就是你有需要在資料庫伺服器本機做一些組態設定…等相關操作,那你就安裝這個版本。

  • SQL Server Express with Advanced Services (x86 和 x64)


除了SQL Server Express與SSMSE管理工具外,還提供「全文索引」及「報表伺服器」兩大功能。

SQL Server 2008 Express的限制

  在開始進入安裝之前,我們要先了解2008 Express的一些限制。在2008 Express中除了進階軟體功能的限制外(例如:壓縮),另外更重要的就是硬體上的限制,在功能差異方面,請參考上一節的註解「SQL Server 2008版本功能差異」。而2008 Express硬體的限制延續2005 Express一樣的限制:

  • CPU數目:1
  • 記憶體上限:1 GB
  • 64位元支援:Windows on Windows (WOW)
  • 資料庫大小:4 GB

2008 Express 的限制是「單一mdf檔案的大小」有限制,所以如果你預計你的資料庫大小會超過4 GB時,除了購買正式版外,在2008 Express上你可以多開幾個資料庫檔案避開這部分的限制,例如:products.mdf、members.mdf,但唯一麻煩可能是程式就要設計成 「跨資料庫存取」的方式。

SQL Server 2008 Express 安裝前環境準備

在開始安裝SQL Server Express之前,必須先準備好作業系統.NET Framework環境,所以我們必須先行下載以下套件(最好依順序安裝):
 

  • Microsoft .Net Framework 3.5 SP1:下載點(啟動載入器)、下載點(完整套件)
  • Windows Installer 4.5:下載點 (需重開機)
  • Windows PowerShell 1.0:
    x86 版 Windows XP Service Pack 2 的 Windows PowerShell 1.0:下載點
    x64 版 Windows XP Service Pack 2 的 Windows PowerShell 1.0:下載點
    x86 版 Windows Server 2003 Service Pack 1 的 Windows PowerShell 1.0:下載點
    x64 版 Windows Server 2003 的 Windows PowerShell 1.0:下載點
    Itanium 版 Windows Server 2003 Service Pack 1 的 Windows PowerShell 1.0:下載點
    x86 版 Windows Vista 的 Windows PowerShell 1.0:下載點
    x64 版 Windows Vista 的 Windows PowerShell 1.0:下載點


要比較注意的只有PowerShell一項,請選擇正確的版本對應的PowerShell,進入下載面畫後,你可以依需求切換PowerShell的語 系版本,也就是說,假設我不要使用繁體版本,我習慣看英文,那就可以選擇安裝英文版本的PowerShell,安裝之後,以後只要有關 PowerShell的任何訊息都會以英文來顯示。重點是,對應的作業系統版本要對,語系看你喜好。

另外只有一種情況下可以不安裝 PowerShell,只有單純安裝「SQL Server Express」這個版本時,可以不下載及安裝PowerShell,其他兩個2008 Express版本(with Tools及with Advanced Services),或單獨安裝SSMSE管理工具,都需要安裝以上三個套件。

SQL Server 2008 Express 安裝

  • SQL Server Express Service Pack 1:下載點
    Microsoft SQL Server 2008 Management Studio Express:下載點
  • SQL Server Express with Tools:下載點
  • SQL Server Express with Advanced Services:下載點
  • SQL Server Expres Service Pack 1:下載點
  • Microsoft SQL Server 2008 線上叢書 (2009 年 5 月):下載點
  • 範例和範例資料庫 (英文):下載點

2009年4月7日SQL Server Express推出Service Pack 1,所以你安裝with Tools及with Advanced Services版本,切記,安裝之後一定要快上Service Pack 1,依照基本預計值應就可以安裝成功。

SQL Server 2008 Express 的「執行個體」

「執行個體」,簡單說,你就把執行個體看成每一個「資料庫的名稱」,例如,我這次安裝的資料庫名稱叫「SQLEXPRESS」,然後,我在同一台電腦再安裝一次SQL Server 2008,然後我給他執行個體的名稱為「SQLBruce」。然後只需在使用時(SSMSE、網頁、應用程式都一樣)指定你所要「連接」的資料庫執行個體名稱,這些程式就知道要跟那一個資料庫來進行連接及處理的動作。

預設執行個體:此執行個體是藉由執行它的電腦網路名稱來識別。一部電腦中只能有一個是預設執行個體。它能讓較早SQL Server版本來使用SSMSE來連線到預設執行個體。

具名執行個體:此執行個體是以電腦的網路名稱加上執行個體名稱來識別,格式為{Computer Name}\{Instance Name},例如:

DS\SQLExpress
DS\SQLBruce
以上是標準使用{Computer Name}\{Instance Name}的格式。

192.168.1.10\SQLExpress
192.168.1.10\SQLBruce
你也可以使用IP來代替{Computer Name}部分。

DS.yourdomain.com\SQLExpress
DS.yourdomain.com\SQLBruce
你也可以使用Domain來代替{Computer Name}部分。IP與Domain在遠端連線時會使用到。

.\SQLExpress
.\SQLBruce

這個重要,這個「‧」(點)代表「本機」的意思。如果你是在本機作業,那就可以使用這個簡寫「‧」來代替{Computer Name},例如,你的資料庫與網站是在同一台伺服器,那麼網站內與資料庫連接相關程式碼,就可以使用這個「‧」來簡化程式碼

SQL Server 2008 Express 別名設定

若要以輸入192.168.1.10 來取代 192.168.1.10\SQLExpress 登入資料庫則需要作下列步驟

  • Protocals For SQLEXPRESS 的 TCP/IP 要Enable,與將 IPAll 的 TCP Port 設為1433

SQLServerConfigurationManager.png  

  •  啟用 Client Protocals 的TCP/IP ,讓外來的電腦可連入這台主機的 SQL Server 2008 Express

SQLServerClientProtocals.png  

  •  設定別名(Alias)192.168.1.10就可以登入為192.168.1.10\SQLEXPRESS

SQLServerClientAlias.png  

  • 啟動 SQL Server Browser 的 Services 

SQLServerServices.png  

  •  別忘了將防火牆對 SQL Server 2008 通訊的 1433 port 開啟

SQLServerFirewallPort.png  

  •  遠端電腦要連入時,就可以在伺服器用192.168.1.10 取代192.168.1.10\SQLEXPRESS 登入了

SQLServerLogin.png  

 

參考:http://blog.kkbruce.net/2009/08/microsoft-sql-server-2008-express.html#.T4vlPtmd0ug

文章標籤

MIS 發表在 痞客邦 留言(0) 人氣()