Struts 2 的開發環境設定,所需最低的要求為:

1. Servlet API 2.4
2. JSP API 2.0
3. Java 5

可以在 http://struts.apache.org/downloads.html 此下載所需的 Struts 2 所有開發套件,在此使用 Struts 2.3.15.2 ("best available")。

在此建議的 IDE 介面為 Eclipse IDE for Java and Report Developers Eclipse IDE for Java and Report Developers,下載後解壓於 D:\Progs\eclipse ; WEB Server 可以使用 Apache Tomcat v7.0.42 ,下載後解壓於C:\AppServ\apache-tomcat-7.0.42 ; Java JDK 1.6 或 1.7 版,下載後執行安裝。接下來就直接執行 D:\Progs\eclipse\eclipse.exe 即可啟動 Eclipse IDE 開發環境。

Step 1: 首先要在 Eclipse IDE 開發環境建立一個專案 struts2_test:

struts2-sample-project.png  

整個專案的程式擺放配置如下圖:

struts2-sample.png  

Step 2: 在此專案的 WEB-INF 下建立一個 web.xml 來定義此專案起動時的執行方式

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <display-name>Struts Blank</display-name>

    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>

</web-app>

Step 3: 於Java Source 下建立 Struts 2 Action 的規則檔: struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="true" />

    <package name="default" namespace="/" extends="struts-default">

        <default-action-ref name="index" />

        <global-results>
            <result name="error">/error.jsp</result>
        </global-results>

        <global-exception-mappings>
            <exception-mapping exception="java.lang.Exception" result="error"/>
        </global-exception-mappings>

        <action name="index">
            <result type="redirectAction">
                <param name="actionName">HelloWorld</param>
                <param name="namespace">/example</param>
            </result>
        </action>
    </package>
    
    <!-- Add packages here -->    
    <include file="example.xml"/>
    <include file="test.xml"/>
</struts>

注意,可以使用Struts 2.3.15.2 中的 struts2-blank 的專案來作初始設定。這裡建立一個 test 的 package 測試,所以要將 test.xml 檔案含括進來。test.xml 的檔案內容如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
    <package name="test" namespace="/test" extends="struts-default">
        
        <action name="Hello" class="com.test.Hello">
            <result name="success">/test/Hello.jsp</result>
        </action>
        <action name="UserLogin_*" method="{1}" class="com.test.UserLoginAction">
            <result name="sign_on">/test/userLogin.jsp</result>
            <result name="input">/test/userLogin2.jsp</result>  => input 是 struts2 的預設值,即是 http://localhost:8080/struts2_test/test/UserLogin_input 會指向 /test/userLogin2.jsp 這個檔案
            <result name="success">/test/userLoginResult.jsp</result>
        </action>
        
    </package>    
    
</struts>

 Step 3:將所需 Struts2 的 JAR 檔放在 WEB-INF/lib 目錄下:

asm-3.3.jar
asm-commons-3.3.jar
asm-tree-3.3.jar
commons-fileupload-1.3.jar
commons-io-2.0.1.jar
commons-lang3-3.1.jar
commons-logging-1.1.3.jar
freemarker-2.3.19.jar
javassist-3.11.0.GA.jar
log4j-1.2.17.jar
ognl-3.0.6.jar
struts2-core-2.3.15.2.jar
xwork-core-2.3.15.2.jar

Step 4: 先建立一個顯示 "Hi Hello Struts 2!!"  的 Hello.jsp 頁面,其中"Hello Struts 2!!"為要取得的message。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>    
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Hello Struts 2</title>
</head>
<body>
  Hi <s:property value="message" />
</body>
</html>

  Step 5: Hello.jsp 頁面裡要取得 message 的變數,在 test.xml 控制檔中已宣告對應的 class="com.test.Hello" ,所以要建立取得此 message 的方法:getMessage(),檔案為 Hello.java ,package 為 com.test

package com.test;

public class Hello {
    public String getMessage(){
        return "Hello Struts 2!!";
    }
    
    public String execute(){
        return "success";
    }
}

注意:struts2 預設回應的方法為 execute() ,只要填入 return "success" 即可在 Apache Tomcate 中執行 http://localhost:8080/struts2_test/test/Hello 。

 

建立一個使用者登入作業範例:

step 1:建立 userLogin2.jsp

還記得在 test.xml 中我們有一個設定<result name="input">/test/userLogin2.jsp</result>  => input 是 struts2 的預設值,即是 http://localhost:8080/struts2_test/test/UserLogin_input 會指向 /test/userLogin2.jsp 這個檔案,內容如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
   
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>User Login Form Using taglib </title>
</head>
<body>

<s:form action="UserLogin">
    <s:textfield key="loginName" />
    <s:password key="password" />
    <s:submit />
</s:form>

</body>
</html>

 Step 2:建立對應的 ActionForm class="com.test.UserLoginAction"

package com.test;

import com.opensymphony.xwork2.ActionSupport;

public class UserLoginAction extends ActionSupport {
    
    private String loginName;
    private String password;
    
    public String getLoginName() {
        return loginName;
    }
    public void setLoginName(String loginName) {
        this.loginName = loginName;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    
    public String execute() throws Exception {
        if (isInvalid(getLoginName()))
            return INPUT ;
        if(isInvalid(getPassword()))
            return "sign_on";
        
        return SUCCESS; // "success";
    }
    
    private boolean isInvalid(String str){
        return ( str==null || str.length()==0 );
    }
    
    @Override
    public void validate() {
        // TODO Auto-generated method stub
        super.validate();
        if (isInvalid(getLoginName()))
            this.addFieldError("loginName", "Login Name was required");
        
    }
    
}

 Step 3:對輸入欄位加入判斷

在 Struts2 要對欄位加入偵錯判斷的方法有二個,一個是覆寫 validate() 的方法,在此方法裡加入  this.addFieldError("loginName", "Login Name was required"); ,第二種方法為建立一個檔案為 程式名-validation.xml 的檔案,如: UserLoginAction-validation.xml,內容如下:

<!DOCTYPE validators PUBLIC
        "-//Apache Struts//XWork Validator 1.0.2//EN"
        "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">

<validators>
    <field name="loginName">
        <field-validator type="requiredstring">
            <message key="requiredstring"/>
        </field-validator>
    </field>
    <field name="password">
        <field-validator type="requiredstring">
            <message key="requiredstring"/>
        </field-validator>
    </field>
</validators>

Step 4:建立多國語言判斷

Struts2 是可以支援多國語言的,但您必需使用 struts-tags 且在輸入欄位的 From 裡使用 key 值,如  <s:textfield key="loginName" /> ,多國語言的檔名為 package.properties ,預設是 US 。內容如下:

password = Password
loginName = Login Name

 PS: Eclipse 的多國語言的編輯器可以從 http://sourceforge.net/projects/eclipse-rbe/ 下載 ResourceBundleEditor_v0.8.0.zip ,解壓後放在 D:\Progs\eclipse\plugins 目錄下,重新起動 Eclipse 就可以了。

 參考:

http://struts.apache.org/release/2.2.x/docs/message-resource-files.html

 

文章標籤

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

用 PL/SQL 撰寫 HELLO PL/SQL 的方法有下列幾種:

1. Anonymous Blocks
2. Function
3. Procedure
4. Package

註:所有建立的 Table、Index、Sequence、Function、Procedure、Package...等,都可以在 VIEW:USER_OBJECTS 中的 status 欄位查詢得到它的狀態。

Anonymous Blocks 的程式範例:

SET SERVEROUTPUT ON -- 資料輸出顯示開啟
-- Anonymous Blocks
DECLARE
  V_HELLO VARCHAR2(20);
BEGIN
  V_HELLO := 'HELLO PL/SQL';
  DBMS_OUTPUT.PUT_LINE(V_HELLO);
END ;
-- 執行
/ 

顯示出的結果

anonymous block completed
HELLO PL/SQL

 

Function 的程式範例:

CREATE OR REPLACE FUNCTION FUNC_HELLO( F_NAME VARCHAR2:=NULL )
RETURN VARCHAR2
IS
  V_TEMP VARCHAR2(20);
BEGIN
  V_TEMP := 'HELLO ';
  RETURN V_TEMP || F_NAME;
END;
-- 執行 Compile
/ 

執行 Function 帶參數

SELECT FUNC_HELLO('PL/SQL') FROM DUAL;
-- 執行
/ 

結果

FUNC_HELLO('PL/SQL')
-------------------------------------
HELLO PL/SQL

 

執行 Function 不帶參數

SELECT FUNC_HELLO FROM DUAL;
-- 執行
/ 

結果

FUNC_HELLO
-------------------------------------
HELLO

 

Procedure 的程式範例:

CREATE OR REPLACE PROCEDURE PROC_HELLO IS
  V_HELLO VARCHAR2(20);
BEGIN
  V_HELLO := 'HELLO PL/SQL';
  DBMS_OUTPUT.PUT_LINE(V_HELLO);
END ;
-- 執行 Compile
/ 

執行 Procedure

SET SERVEROUTPUT ON
EXECUTE PROC_HELLO
-- 執行
/ 

結果

anonymous block completed
HELLO PL/SQL

 

 Package 的程式範例:

-- 建立 Package 規格
CREATE OR REPLACE PACKAGE PACK_HELLO AS
  PROCEDURE PROC_HELLO(P_NAME VARCHAR2:=NULL) ;
  FUNCTION FUNC_HELLO (F_NAME VARCHAR2:=NULL) RETURN VARCHAR2;
END;
/
-- 建立 Package 主體
CREATE OR REPLACE PACKAGE BODY PACK_HELLO AS
  PROCEDURE PROC_HELLO(P_NAME VARCHAR2:=NULL) IS
  BEGIN
   DBMS_OUTPUT.PUT_LINE('HELLO '||P_NAME );    
  END ;
  
  FUNCTION FUNC_HELLO ( F_NAME VARCHAR2:=NULL) RETURN VARCHAR2 IS
    V_HELLO VARCHAR2(20);
  BEGIN
    V_HELLO:='HELLO ';
    RETURN V_HELLO || F_NAME; 
  END ;
END;
/

執行 Package.Procedure:PACK_HELLO.PROC_HELLO

SET SERVEROUTPUT ON
EXECUTE PACK_HELLO.PROC_HELLO('PL/SQL');
/

結果

匿名區塊已完成
HELLO PL/SQL

執行 Package.Function:PACK_HELLO.FUNC_HELLO

SELECT PACK_HELLO.FUNC_HELLO('PL/SQL') FROM DUAL;
/

結果

PACK_HELLO.FUNC_HELLO('PL/SQL')
--------------------------------------------------------
HELLO PL/SQL
文章標籤

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

彈性欄位分成兩種:Key flexfields 與 Descriptive flexfield;Key flexfield 出現在 Form 的一般文字類型的輸入型態

Key flexfield 出現在 Form 的一般文字輸入型態欄位,Descriptive flexfield 則會在 Form 上出現兩個字元寬的方形標示 [ ] 來代表,由下列的圖示可以得知此兩種 Flexfield 的不同。當點擊此 文字欄位[ ] 時,系統會彈出一個視窗,內含一個 From ,藉此來讓使用者輸入資料。Key flexfield 使用的時機,一般是用來儲存其它模組要的值 Code ,例如:組織代碼: Org ID,會計科目: Accounting Code,這些 Code 若有多個截段( Segment ) ,可以組合在一起,就成為一串連續的資料,可稱為 combination。如下圖中 Part 欄位的值:COM-876-LTN。

Descriptive flexfield 使用的時機,則是在既有的 Form 上擴展欄位空間(expansion space) ,它可以依照 Form 上欄位內的值,彈出相對應符合的資料格式。例如:在填寫固定資產時,若類別欄位的值為:電腦類,彈出的 Form 可以是CPU,RAM,HD相關的欄位;若為辦公室桌子類,彈出的 Form 則可以為:Style,Size,Type。

Flexfield_Concepts.png  

  至於 Segment,Value,Value Description,Value Set 與 Flexfields 的關係,可以從下圖中瞭解。

Base_Flexfield_Concepts.png  

文章標籤

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

  此篇文章是為了瞭解 Descriptive Flesfields 的觀念與作法,並與 EBS 的 Application:WIP Standard Options 作關連來實作,這樣的好處在於不用針對 Application 客製任何程式,就可以增加欄位,並且可以用來收集資料,不過它也有侷限,一個 Application 最多的彈性欄位 ( Flexfield ) 只能有 15 個,從Attribute1 到 Attribute15 。

N:Bill Of Material/Routings/Standard Operations
EBS_FF_Descriptive.png  

  預期的成果如上圖,在 Standard Operations 的頁面最右邊的[.],點選後,會出現一個 Form:Operation Information,讓您可以用 LOV 的選單模式挑選所要的值。

   首先,先建立 Validate Sets:wip_resource_code 用來規範欄位的格式及顯示的方法。

N:Bills Of Material/Setup/Validation/Sets
EBS_FF_Sets_wipResource.png  

  針對此 Validate Sets:wip_resource_code 預先設定有那些資料可以選擇。

N:Bills Of Material/Setup/Validation/Values
EBS_FF_values_wipResource.png  

  因為是要對 Standard Operation 這個 Form 增加彈性欄位,若不瞭解 Application 與 Title 的相關資訊,可以利用 「Help/Diagnostics/Examine」 來作查詢。

EBS_Examine.png  

  在 Block 可以選擇 $DESCRIPTIVE_FLEXFIELD$ ,Field 選擇 B_STD_OPS.DF ,系統會自動顯示出 Application 的相關資訊:Operation Information (Bills of Material) 。

EBS_Examine_Field_Value.png  

  利用上面查詢到的資料,就可以在 Descriptive Segments 中針對 Application 為 Bills Of Material 且 Title 為 Operation Information 的 From 作彈性欄位的設定。 

N:Bills Of Material/Setup/Flexfields/Descriptive Segments
EBS_FF_Descriptive_Operation_Information_Segment.png  

   選擇好後按下 Segments,將之前設定好的 Value Set :wip_resource_code 選進來,Column 欄位可指定放在預留 15 個 Attribute1-15中的那一欄位。

EBS_FF_Descriptive_Operation_Information_Summary.png  

   作完以上的設定後,最後別忘了將 Freeze Flexfield Definition 打勾,並按下 Compile ,系統會自動建立一個 View ,除了提示您是否有成功外,還會告訴您這個 View 的名字;完成後,再回到 Standard Operations,就會有預期的效果。

EBS_FF_Descriptive_Operation_Information.png  

  整個作業流程整理如下:

  1. 找到 Application 及 title
  2. uncheck Freeze Fexfild definitions
  3. 選取context code 後點segment
  4. 增、修 Segments Summary 的欄位
  5. 退出時,check Freeze Fexfild definitions,並compile
文章標籤

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

loging to oracle DB  在進入 OS 之後:

[orajdemo@jdbs1 tmp]$ sqlplus /nolog

這樣的登入資料庫,帳號就會變成是 SYS ,取得 SYSDBA 的角色,可以用 SYSDBA 登入資料庫,你即使不知道 SYSTEM 的密碼,你也可以變更
SQL> connect /as sysdba
Connected.

但如果你要改成 SYSTEM 帳號登入,那當然就還是得要有 SYSTEM 的密碼。
Enter user-name: system
Enter password:
Connected.

 

Q:Oracle的啟動指令為何?
A:>startup [force] [restrict] [open[RECOVER] |mount|nomount] file=filename
例:>startup nomount pfile=init.ora (資料庫未建立時應以此方式載入參數檔)

Q:續上,如何掛上資料庫? (若資料庫已建立時)
A:>alter database [ mount | open[read write|read only] ]

Q:Oracle的啟動程序為何?
A:shutdown-> nomount(instance started) -> mount(control file
open) -> open(all files opened)

Q:Oracle的shutdown程序為何?(快 -> 慢)
A:>shutdown[abort | immediate | transactional | normal]

Q:顯示參數值?
A:>show parameter

Q:動態更改參數值?
A:>alter session set parameter_name = values
  >alter system set parameter_name = values [DEFERRED]
例:
>alter session set SQL_TRACE=true;
  >alter system set TIMED_STATISTICS=true;
  >alter system set SORT_AREA_SIZE=131072 DEFERRED;

Q: 如何增加 Control File
A:
1. 將Oracle的Database Shut down
2. 用OS(operation system)的命令將現行的Control file 複制到另一目錄
3. 在參數檔(init.ora)中加入此Control file(需含完整路徑)
4. 重新起動DataBase

Q: v$logfile 中的 STATUS是何意?
A:
空白:表現在正在使用
INVALID : 表可能有問題
STALE: 表剛加入的Log File
DELETED: 表很久沒用的Log File

Q: 如何強迫轉換到另一個 Redo Log File (Forcing Log Switches)
A: >alter system switch logfile;

Q: Forcing Checkpoints for Redo Log File
A: >alter system checkpoint;

Q: 如何控制Redo Log File 的檢查時間?
A:
LOG_CHECKPOINT_INTERVAL
LOG_CHECKPOINT_TIMEOUT
FAST_START_IO_TARGET

Q: 如何增加 Redo Log Groups ?
A: >alter database [database] add logfile [group integer] filespace size integer m/k
例: >alter database add logfile group 3 ‘$HOME/data/disk4/redo0401.rdo’ size 500k;

Q: 如何加 Redo Log Members
A: >alter database [database] add logfile member ‘filename’ [reuse],’filename’ [reuse] to group integer
例: >alter database add logfile member '$HOME/data/disk4/redo0402.rdo' to group 4

Q: 如何重新配置/更名online Redo Log Files?
A: 1. 被重新配置/更名 的檔名需存在
例: >alter database rename file '$HOME/data/disk4/redo0401.rod'  to '$HOME/data/disk4/redo0401.rdo'
Q: 如何Drop Redo Log Group
A: > alter database [database] drop logfile {group integer|‘filename’}
例: >alter database drop logfile group 2;
註:檔案仍存在,需用OS命令移除,如:#rm $HOME/redo0402.rdo

Q: 如何 Drop Redo Log Members
A: >alter database [database] drop logfile member ‘filename’
例: >alter database drop logfile member ‘$HOME/redo0402.rdo’;
註:檔案仍存在,需用OS命令移除,如:#rm $HOME/redo0402.rdo

Q: 如何查詢有多少DataFile?
A: >select name from v$datafile;
Or >select file_name, tablespace_name from dba_data_files;

Q: 查詢 Redo Log File?
A: >select * from v$logfile;

Q: 如何清除Redo Log File內的資料?
A: >alter database clear [unarchived] logfile group integer|
例:>alter database clear logfile group 2
註: 1.參數unarchived 是當不在備份模式時才加入的
   2.正在作用的Redo Logfile無法清除

Q: 查詢TableSpace的狀態
A: select tablespace_name, status from dba_tablespaces;

Q: 如何查詢Table的欄位?
A: >describe TableName
 

Q: 如何改變tablespace的狀態在online或offline
A:
>alter tablespace user_indx online;
>alter tablespace user_indx offline;

Q:何種情況要將tablespace改為offline的狀態?
A:
1.離線備份(雖然也可以線上備份)
2.當資料庫是open狀態時,進行回存tablespace
3.當資料庫是open狀態時,刪除data file
4.不讓使用者存取時
 

文章標籤

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

在 Oracle EBS 的訂單模組( OM : Order Management) 有提供訂單匯入的功能,主要操作的 Table 有兩個 : OE_HEADERS_IFACE_ALL、OE_LINES_IFACE_ALL,詳細請參考 Oracle 官方文件:115omapi.pdf 。以下以範例來作說明:

範例1 : 新訂單

-- Insert a Sales Order Header and make the Order's Status is Booked. (表頭:OE_HEADERS_IFACE_ALL,並作 Booked)

INSERT INTO OE_HEADERS_IFACE_ALL (
order_source_id
,orig_sys_document_ref
,creation_date
,created_by
,last_update_date
,last_updated_by
,operation_code
,sold_to_org_id
,booked_flag
,org_id
,customer_po_number )
VALUES (
1001 --order_source_id
,'12345691' --orig_sys_document_ref
,SYSDATE --creation_date
,-1 --created_by
,SYSDATE --last_update_date
,-1 --last_updated_by
,'INSERT' --operation_code
,1891 --sold_to_org_id
,'Y' --booked_flag
,77 --org_id (for specific ou)
,'12345691' -- customer_po_number 
);

-- Insert a Sales Order Line (表身:OE_LINES_IFACE_ALL)

INSERT INTO OE_LINES_IFACE_ALL (
order_source_id
,orig_sys_document_ref
,orig_sys_line_ref
,inventory_item_id
,ordered_quantity
,operation_code
,created_by
,creation_date
,last_updated_by
,last_update_date
,ship_from_org_id
)
VALUES (
1001 --order_source_id
,'12345691' --orig_sys_document_ref
,'1' --orig_sys_line_ref
,285730 --inventory_item_id
, 1 --ordered_quantity
, 'INSERT' --operation_code
, -1 --created_by
, SYSDATE --creation_date
, -1 --last_updated_by
, SYSDATE --last_update_date
, 77 -- ship_from_org_id
);

範例2 : 訂單變更 (Line 1->qty 0 ; Line 2 new with qty 2)

-- Insert a Sales Order Header and make the Order's Status is Booked.(表頭:OE_HEADERS_IFACE_ALL)

INSERT INTO OE_HEADERS_IFACE_ALL 
(
change_sequence
,order_source_id
,orig_sys_document_ref
,creation_date
,created_by
,last_update_date
,last_updated_by
,operation_code
,sold_to_org_id
,booked_flag
,org_id
,customer_po_number
,force_apply_flag )
VALUES (
1--change_sequence
,1001 --order_source_id
,'12345691' --orig_sys_document_ref
,SYSDATE --creation_date
,-1 --created_by
,SYSDATE --last_update_date
,-1 --last_updated_by
,'UPDATE' --operation_code
,1891 --sold_to_org_id
,'Y' --booked_flag
,77 --org_id (for specific ou)
,'12345691' --customer_po_number
,'Y' -- force_apply_flag  
);

-- Insert a Sales Order Line 1 (表身:OE_LINES_IFACE_ALL)

INSERT INTO OE_LINES_IFACE_ALL 
(
change_sequence
,order_source_id
,orig_sys_document_ref
,orig_sys_line_ref
,inventory_item_id
,ordered_quantity
,operation_code
,created_by
,creation_date
,last_updated_by
,last_update_date
,change_reason
)
VALUES (
1--change_sequence
,1001 --order_source_id
,'12345691' --orig_sys_document_ref
,'1' --orig_sys_line_ref
,285730 --inventory_item_id
, 0 --ordered_quantity
, 'UPDATE' --operation_code
, -1 --created_by
, SYSDATE --creation_date
, -1 --last_updated_by
, SYSDATE --last_update_date
,'Not provided ' -- change_reason
);

-- Insert a Sales Order Line 2 (表身:OE_LINES_IFACE_ALL)

INSERT INTO OE_LINES_IFACE_ALL 
(
change_sequence
,order_source_id
,orig_sys_document_ref
,orig_sys_line_ref
,inventory_item_id
,ordered_quantity
,operation_code
,created_by
,creation_date
,last_updated_by
,last_update_date
,change_reason
)
VALUES (
1--change_sequence
,1001 --order_source_id
,'12345691' --orig_sys_document_ref
,'2' --orig_sys_line_ref
,285730 --inventory_item_id
, 2 --ordered_quantity
, 'INSERT' --operation_code
, -1 --created_by
, SYSDATE --creation_date
, -1 --last_updated_by
, SYSDATE --last_update_date
,'Not provided ' -- change reason
);

範例3 : 訂單單身拆行 (Line 2 由數量qty 200 拆成 Line1 -> qty 2 & Line2 -> qty 198)

-- Insert a Sales Order Header and make the Order's Status is Booked.(表頭:OE_HEADERS_IFACE_ALL)

INSERT INTO OE_HEADERS_IFACE_ALL 
(
change_sequence
,order_source_id
,orig_sys_document_ref
,creation_date
,created_by
,last_update_date
,last_updated_by
,operation_code
,sold_to_org_id
,booked_flag
,org_id
,customer_po_number
,force_apply_flag )
VALUES (
1--change_sequence
,1001 --order_source_id
,'12345691' --orig_sys_document_ref
,SYSDATE --creation_date
,-1 --created_by
,SYSDATE --last_update_date
,-1 --last_updated_by
,'UPDATE' --operation_code
,1891 --sold_to_org_id
,'Y' --booked_flag
,77 --org_id (for specific ou)
, '12345691' --customer_po_number
,'Y' -- force_apply_flag 
);

-- Insert a Sales Order Line 1 (表身:OE_LINES_IFACE_ALL)

INSERT INTO OE_LINES_IFACE_ALL (
change_sequence
,order_source_id
,orig_sys_document_ref
,orig_sys_line_ref
,shipment_number
,inventory_item_id
,ordered_quantity
,operation_code
,created_by
,creation_date
,last_updated_by
,last_update_date
,change_reason
)
VALUES (
1--change_sequence
,1001 --order_source_id
,'12345691' --orig_sys_document_ref
,'2' --orig_sys_line_ref
, NULL --shipment_number
,285730 --inventory_item_id
, 2 --ordered_quantity
, 'UPDATE' --operation_code
, -1 --created_by
, SYSDATE --creation_date
, -1 --last_updated_by
, SYSDATE --last_update_date
,'Not provided ' --change reason
);

-- Insert a Sales Order Line 2 (表身:OE_LINES_IFACE_ALL)

INSERT INTO OE_LINES_IFACE_ALL (
change_sequence
,order_source_id
,orig_sys_document_ref
,orig_sys_line_ref
,shipment_number
,inventory_item_id
,ordered_quantity
,operation_code
,created_by
,creation_date
,last_updated_by
,last_update_date
,change_reason
,split_from_line_ref )
VALUES (
1--change_sequence
,1001 --order_source_id
,'12345691' --orig_sys_document_ref
,'21' --orig_sys_line_ref
, '2' --shipment_number
,285730 --inventory_item_id
, 198 --ordered_quantity
, 'INSERT' --operation_code
, -1 --created_by
, SYSDATE --creation_date
, -1 --last_updated_by
, SYSDATE --last_update_date
,'Not provided ' -- Change reason
,'2' --split_from_line_ref
); 

範例4 : 以客戶料號 Import

-- Insert a Sales Order Header and make the Order's Status is Booked.(表頭:OE_HEADERS_IFACE_ALL)

INSERT INTO OE_HEADERS_IFACE_ALL 
(
change_sequence
,order_source_id
,orig_sys_document_ref
,creation_date
,created_by
,last_update_date
,last_updated_by
,operation_code
,sold_to_org_id
,booked_flag
,org_id
,customer_po_number
,force_apply_flag )
VALUES (
1--change_sequence
,1001 --order_source_id
,'12345691' --orig_sys_document_ref
,SYSDATE --creation_date
,-1 --created_by
,SYSDATE --last_update_date
,-1 --last_updated_by
,‘INSERT' --operation_code
,1891 --sold_to_org_id
,'Y' --booked_flag
,77 --org_id (for specific ou)
, '12345691' --customer_po_number
,'Y' -- force_apply_flag 
);

-- Insert a Sales Order Line (表身:OE_LINES_IFACE_ALL)

INSERT INTO OE_LINES_IFACE_ALL (
change_sequence
,order_source_id
,orig_sys_document_ref
,orig_sys_line_ref
,customer_item_name 
,ordered_quantity
,operation_code
,created_by
,creation_date
,last_updated_by
,last_update_date
,ship_from_org_id
)
VALUES (
1--change_sequence
,1001 --order_source_id
,'12345691' --orig_sys_document_ref
,'3' --orig_sys_line_ref
, 'D210100BT' --customer_item_name 
, 3 --ordered_quantity
, 'INSERT' --operation_code
, -1 --created_by
, SYSDATE --creation_date
, -1 --last_updated_by
, SYSDATE --last_update_date
, 77 -- ship_from_org_id
);
文章標籤

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

IP Address

如果您要組建一個單一的 IP 網路﹐那麼您得分配相同的 Net ID 給所有主機﹐而各主機的 Host ID 卻必須是唯一的﹐也就是說沒有任何兩個 Host ID 會是一樣的。您的網路還要連上 internet 或其它網路的話﹐那麼您使用的 Net ID 也必須是唯一的﹐也就是必需經過註冊才能獲得否則就會造成衝突了。下面的圖示大致可以說明 Net ID & Host ID 的概念。

NetworkPrefixes.png  

IP Address 的範圍大致可以分成 A、B、C 三個Class

‧A Class 的 IP 使用最前面一組數字來做 Net ID﹐其餘三組做 Host ID
‧B Class 的 IP 使用前面兩組數字來做 Net ID﹐另兩組做 Host ID
‧C Class 的 IP 使用前面三組數字來做 Net ID﹐剩下的一組做 Host ID

Net Mask

等級 開首 網路數目 主機數目 使用範圍
A 0 127 16,777,214 1.x.x.x 到 126.x.x.x
B 10 16,384 16,382 128.x.x.x 到 191.x.x.x
C 110 2,097,152 256 192.x.x.x 到 223.x.x.x
D 1110 - - 224.- 到 239.-
E 1111 - - 240.- 到 255.-

 在我們進行 IP 位址劃分的時候﹐IP 和 Net Mask 都必須一對使用的﹐兩者缺一不可,Net Mask 的作用是來判斷彼此的 IP Address 是否在於同一網段。

‧A Class 的 Net Mask 是 255.0.0.0
‧B Class 的 Net Mask 是 255.255.0.0
‧C Class 的 Net Mask 是 255.255.255.0

例如:139.175.152.254/16 是一個 B Class IP,Net Mask 是255.255.0.0。

IP Address 換成二進位是﹕
10001011.10101111.10011000.11111110

其 Net Mask 是 255.255.0.0 ﹐換成二進位﹕
11111111.11111111.00000000.00000000

然後將 IP 和 mask 加以 AND 運算﹕
10001011.10101111.10011000.11111110
AND
11111111.11111111.00000000.00000000

得出﹕
10001011.10101111.00000000.00000000

換成十進位就是 139.175.0.0 ﹐這個就是 Net ID了。

那麼,怎麼求 Host ID 呢﹖也很簡單﹕

先將 Net Mask 做一個 NOT 運算﹐可以得出﹕
00000000.00000000.11111111.11111111

然後再和 IP 做一次 AND 運算﹐就可以得到 Host ID:
00000000.00000000.10011000.11111110 ﹐

換成十進位就成了﹕0.0.152.254。


然而,由於 Internet 的爆炸性成長﹐IP 的位址買少見少﹐而且在很多機構裡﹐也不是所有機器都有必要使用註冊的 IP 位址。於是﹐我們就在 A﹑B﹑C 這三個層級裡面﹐各劃出一些位址範圍保留給私有位址所用﹐它們分別是﹕

‧10.0.0.0 - 10.255.255.255
‧172.16.0.0 - 172.31.255.255
‧192.168.0.0 - 192.168.255.255

CIDR (Classless Inter-Domain Routing)

原來 IP 位址的分配依功能、應用及範圍的不同,有A、B、C、D、E 五種等級的區分,但也因此導致許多 IP 位址的浪費,因此 IETF (Internet Engineering Task Force) 提出 CIDR (Classless Inter-Domain Routing) 的架構,打破以往等級分類的藩籬,網路規劃完全依照網路遮罩進行定義,使得原來A、B、C等級網路固定長度區塊的劃分,成為變動長度區塊的架構 (超網路,Supernet),讓網路位址的的運用更有彈性。

參考文件:
http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#IPv4_CIDR_blocks

http://www.pcnet.idv.tw/pcnet/network/network_ip_addr.htm

 

文章標籤

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

FileZilla Server 是一套免費的 FTP Server,它的功能強大且簡單設定,大部份都是按 Next & Next,就可以架好一台專屬於您的 FTP Server,且它也支援遠端管理。只要在 FileZilla Server Interface 介面上,選擇 Edit-> Settings 設定選項中 Admin Interfaxe Settings ,設定可以連入及管理的密碼,這樣遠端的電腦只要有裝 FileZilla Server Interface 管理工具就可以從遠端登入這台 FTP Server 作管理了。

FileZilla-Admin-Interfaxe-Settings.png  

以上圖為例:即只允許 10.10.2.0/24 & 10.10.3.0/24 段的 IP 可以連入,注意:這裡 IP Addresses 的設定是以 CIDR 的格式才它接受。

文章標籤

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

Oracle的優化器(Optimizer)有兩種優化方式, Hint也不例外,除了/*+rule*/其他的都是CBO優化方式

  • 基於規則的優化方式(Rule-Based Optimization,簡稱為RBO)
  • 基於成本的優化方式(Cost-Based Optimization,簡稱為CBO)


RBO(Rule-Based Optimization)方式:優化器在分析SQL語句時,所遵循的是Oracle內部預定的一些規則。比如我們常見的,當一個where子句中的一列有索引時去走索引。
CBO(Cost-Based Optimization)方式:它是看語句的成本(Cost),這裡的成本主要指CPU和記憶體RAM。優化器在判斷是否用這種方式時,主要參照的是表及索引的統計資訊。統計資訊給出表的大小、 有多少行、每行的長度等資訊。這些統計資訊起初在庫內是沒有的,是做 Analyze 後才出現的,很多的時侯過期統計資訊會令優化器做出一個錯誤的執行計畫, 因些應及時更新這些資訊。

優化模式(Optimization)包括Rule、Choose、First rows、All rows四種方式:

  •     Rule:基於規則的方式。
  •     Choose:預設的情況下Oracle用的便是這種方式。指的是當一個表或索引有統計資訊,則走CBO的方式,如果表或索引沒統計資訊,表又不是特別的小,而且相應的列有索引時,那麼就走索引,走RBO的方式。
  •     First Rows:它與Choose方式是類似的,所不同的是當一個表有統計資訊時,它將是以最快的方式返回查詢的最先的幾行,從總體上減少了響應時間。
  •     All Rows:也就是我們所說的Cost的方式,當一個表有統計資訊時,它將以最快的方式返回表的所有的行,從總體上提高查詢的輸送量。沒有統計資訊則走RBO的方式

Oracle DB 可以在哪些設定配置上修改預設的優化規則
    A、Instance 層級:我們可以通過在 initSID.ora 檔中設定 OPTIMIZER_MODE=RULE/CHOOSE/FIRST_ROWS/ALL_ROWS 如果沒設定OPTIMIZER_MODE參數則預設用的是Choose方式
    B、Sessions 層級:可通過ALTER SESSION SET OPTIMIZER_MODE=RULE/CHOOSE/FIRST_ROWS/ALL_ROWS來設定。
    C、SQL語句層級:用Hint(/*+ ... */)來設定

為什麼表的某個欄位明明有索引,但執行計畫卻不走索引,原因有下列幾項:
    1、優化模式是 all_rows 的方式
    2、表作過 Analyze,有統計資訊
    3、表很小,Oracle DB 的優化器認為不值得走索引。

SQL Optimizer Hints的用法:

1. 不區分大小寫, 多個提示用空格分開
如:select /*+ hint1(tab1) hint2(TAB1 idx1) */ col1, col2 from tab1 where col1='xxx';

2. 如果表使用了別名, 那麼提示裡也必須使用別名
如:select /*+ hint1(t1) */ col1, col2 from tab1 t1 where col1='xxx';

3. 如果使用同一個表的多個欄位用逗號 "," 號分開
如: select /*+ index(t1.A,t1.B) */ col1, col2
    from   tab1 t1
    where  col1='xxx';

Oracle DB hints 概念:10g資料庫可以使用更多新的optimizer hints來控制優化行為。現在讓我們快速解析一下這些強大的新hints:

1、spread_min_analysis

   使用這一hint,你可以忽略一些關於如詳細的關係,像依賴圖分析等試算表的編譯時間優化規則。其他的一些優化,如創建過濾以有選擇性的定位試算表訪問結構並限制修訂規則等,得到了繼續使用。

   由於在規則數非常大的情況下,試算表分析 ( Analyze ) 會很長。這一提示可以幫助我們減少由此產生的數以百小時計的編譯時間。

例:SELECT /*+ SPREAD_MIN_ANALYSIS */ ...

2、spread_no_analysis

   通過這一hint,可以使無試算表分析( Analyze )成為可能。同樣,使用這一hint可以忽略修訂規則和過濾產生。如果存在一試算表分析,編譯時間可以被減少到最低程度。

例:SELECT /*+ SPREAD_NO_ANALYSIS */ ...

3、use_nl_with_index

   這項hint使CBO通過嵌套迴圈把特定的表格加入到另一原始行。只有在以下情況中,它才使用特定表格作為內部表格:如果沒有指定標籤,CBO必須可以使 用一些標籤,且這些標籤至少有一個作為索引鍵值加入判斷;反之,CBO必須能夠使用至少有一個作為索引鍵值加入判斷的標籤。

例: SELECT /*+ USE_NL_WITH_INDEX (polrecpolrind) */ ...

4、CARDINALITY

  此hint定義了對由查詢或查詢部分返回的基數的評價。注意如果沒有定義表格,基數是由整個查詢所返回的總行數。

例:SELECT /*+ CARDINALITY ( [tablespec] card ) */

5、SELECTIVITY

  此hint定義了對查詢或查詢部分選擇性的評價。如果只定義了一個表格,選擇性是在所定義表格裡滿足所有單一表格判斷的行部分。如果定義了一系列表格,選擇性是指在合併以任何順序滿足所有可用判斷的全部表格後,所得結果中的行部分。

例: SELECT /*+ SELECTIVITY ( [tablespec] sel ) */

然而,注意如果hints CARDINALITY 和 SELECTIVITY都定義在同樣的一批表格,二者都會被忽略。

6、no_use_nl

  Hint no_use_nl 使CBO執行迴圈嵌套,通過把指定表格作為內部表格,把每個指定表格連接到另一原始行。通過這一hint,只有hash join和sort-merge joins會為指定表格所考慮。

例: SELECT /*+ NO_USE_NL ( employees ) */ ...

7、no_use_merge

  此hint使CBO通過把指定表格作為內部表格的方式,拒絕 sort-merge 把每個指定表格加入到另一原始行。

例: SELECT /*+ NO_USE_MERGE ( employees dept ) */ ...

8、no_use_hash

  此hint使CBO通過把指定表格作為內部表格的方式,拒絕hash joins把每個指定表格加入到另一原始行。

例: SELECT /*+ NO_USE_HASH ( employees dept ) */ ...

9、no_index_ffs

  此hint使CBO拒絕對指定表格的指定標籤進行fast full-index scan。 Syntax: /*+ NO_INDEX_FFS ( tablespecindexspec ) */


在SQL優化過程中常見HINT的用法(前10個比較常用, 前3個最常用):

1. /*+ INDEX *//*+ INDEX(TABLE INDEX1, index2) *//*+ INDEX(tab1.col1 tab2.col2) *//*+ NO_INDEX *//*+ NO_INDEX(TABLE INDEX1, index2) */

表明對表選擇索引的掃描方法:
第一種:不指定索引名是讓 oracle 對表中可用索引比較並選擇某個最佳索引;
第二種:指定索引名且可指定多個索引;
第三種:是10g開始有的, 指定列名, 且表名可不用別名;
第四種:即全資料表掃描;
第五種:表示禁用某個索引, 特別適合於準備刪除某個索引前的評估操作. 如果同時使用了 INDEX 和 NO_INDEX 則兩個提示都會被忽略掉.
例如:SELECT /*+ INDEX(BSEMPMS SEX_INDEX) USE SEX_INDEX BECAUSE THERE ARE FEWMALE BSEMPMS */ FROM BSEMPMS WHERE SEX='M';

2. /*+ ORDERED */
FROM子句中默認最後一個表是驅動表,ORDERED將from子句中第一個表作為驅動表. 特別適合於多表連接非常慢時嘗試.
例如:SELECT /*+ ORDERED */ A.COL1,B.COL2,C.COL3 FROM TABLE1 A,TABLE2 B,TABLE3 C WHERE A.COL1=B.COL1 AND B.COL1=C.COL1;

3. /*+ PARALLEL(table1,DEGREE) *//*+ NO_PARALLEL(table1) */
該提示會將需要執行全資料表掃描的查詢分成多個部分(並行度)執行, 然後在不同的作業系統進程中處理每個部分. 該提示還可用於DML語句. 如果SQL裡還有排序操作, 進程數會翻倍,此外還有一個一個負責組合這些部分的進程,如下面的例子會產生9個進程. 如果在提示中沒有指定DEGREE, 那麼就會使用創建表時的預設值. 該提示在預設情況下會使用APPEND提示. NO_PARALLEL是禁止平行作業,否則語句會使用由於定義了並行物件而產生的並行處理.
例如:select /*+ PARALLEL(tab_test,4) */ col1, col2 from tab_test order by col2;

4. /*+ FIRST_ROWS *//*+ FIRST_ROWS(n) */
表示用最快速度獲得第1/n行, 獲得最佳回應時間, 使資源消耗最小化.
在 update 和 delete 語句裡會被忽略, 使用分組語句如 group by/distinct/intersect/minus/union 時也會被忽略.
例如:SELECT /*+ FIRST_ROWS */ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';

5. /*+ RULE */
表明對語句塊選擇基於規則的優化方法.
例如:SELECT /*+ RULE */ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';

6. /*+ FULL(TABLE) */
表明對表選擇全域掃描 Full Table Scan 的方法.
例如:SELECT /*+ FULL(A) */ EMP_NO,EMP_NAM FROM BSEMPMS A WHERE EMP_NO='SCOTT';

7. /*+ LEADING(TABLE) */
類似於ORDERED提示, 將指定的表作為連接次序中的驅動表.

8. /*+ USE_NL(TABLE1,TABLE2) */
將指定表與嵌套的連接的行源進行連接,以最快速度返回第一行再連接,與 USE_MERGE 剛好相反.
例如:SELECT /*+ ORDERED USE_NL(BSEMPMS) */ BSDPTMS.DPT_NO,BSEMPMS.EMP_NO,BSEMPMS.EMP_NAM FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;

9. /*+ APPEND *//*+ NOAPPEND */
直接插入到表的最後,該提示不會檢查當前是否有插入操作所需的塊空間而是直接添加到新塊中, 所以可以提高速度. 當然也會浪費些空間, 因為它不會使用那些做了delete操作的塊空間. NOAPPEND提示則相反,所以會取消PARALLEL提示的默認APPEND提示.
例如:insert /*+ append */ into test1 select * from test4;
insert /*+ parallel(test1) noappend */ into test1 select * from test4;

10. /*+ USE_HASH(TABLE1,table2) */
將指定的表與其它行源通過雜湊連接方式連接起來.為較大的結果集提供最佳回應時間. 類似於在連接表的結果中遍歷每個表上每個結果的嵌套迴圈, 指定的hash表將被放入記憶體, 所以需要有足夠的記憶體(hash_area_size或pga_aggregate_target)才能保證語句正確執行, 否則將在磁片裡進行.
例如:SELECT /*+ USE_HASH(BSEMPMS,BSDPTMS) */ * FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;

---------------------------------------------------------------------

11. /*+ USE_MERGE(TABLE) */
將指定的表與其它行源通過合併排序連接方式連接起來.特別適合於那種在多個表大量行上進行集合操作的查詢, 它會將指定表檢索到的的所有行排序後再被合併, 與USE_NL剛好相反.
例如:SELECT /*+ USE_MERGE(BSEMPMS,BSDPTMS) */ * FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;

12. /*+ ALL_ROWS */
表明對語句塊選擇基於開銷的優化方法,並獲得最佳輸送量,使資源消耗最小化. 可能會限制某些索引的使用.
例如:SELECT /*+ ALL+_ROWS */ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';

13. /*+ CLUSTER(TABLE) */
提示明確表明對指定表選擇簇掃描的存取方法. 如果經常訪問連接表但很少修改它, 那就使用集群提示.
例如:SELECT /*+ CLUSTER */ BSEMPMS.EMP_NO,DPT_NO FROM BSEMPMS,BSDPTMS WHERE DPT_NO='TEC304' AND BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;

14. /*+ INDEX_ASC(TABLE INDEX1, INDEX2) */
表明對表選擇索引昇冪的掃描方法. 從8i開始, 這個提示和INDEX提示功能一樣, 因為預設oracle就是按照昇冪掃描索引的, 除非未來oracle還推出降冪掃描索引.
例如:SELECT /*+ INDEX_ASC(BSEMPMS PK_BSEMPMS) */ FROM BSEMPMS WHERE DPT_NO='SCOTT';

15. /*+ INDEX_COMBINE(TABLE INDEX1, INDEX2) */
指定多個點陣圖索引, 對於B樹索引則使用INDEX這個提示,如果INDEX_COMBINE中沒有提供作為參數的索引,將選擇出點陣圖索引的布林組合方式.
例如:SELECT /*+ INDEX_COMBINE(BSEMPMS SAL_BMI HIREDATE_BMI) */ * FROM BSEMPMS WHERE SAL<5000000 AND HIREDATE<SYSDATE;

16. /*+ INDEX_JOIN(TABLE INDEX1, INDEX2) */
合併索引, 所有資料都已經包含在這兩個索引裡, 不會再去訪問表, 比使用索引並通過rowid去掃描表要快5倍.
例如:SELECT /*+ INDEX_JOIN(BSEMPMS SAL_HMI HIREDATE_BMI) */ SAL,HIREDATE FROM BSEMPMS WHERE SAL<60000;

17. /*+ INDEX_DESC(TABLE INDEX1, INDEX2) */
表明對表選擇索引降冪的掃描方法.
例如:SELECT /*+ INDEX_DESC(BSEMPMS PK_BSEMPMS) */ FROM BSEMPMS WHERE DPT_NO='SCOTT';

18. /*+ INDEX_FFS(TABLE INDEX_NAME) */
對指定的表執行快速全索引掃描,而不是全資料表掃描的辦法.要求要檢索的列都在索引裡, 如果表有很多列時特別適用該提示.
例如:SELECT /*+ INDEX_FFS(BSEMPMS IN_EMPNAM) */ * FROM BSEMPMS WHERE DPT_NO='TEC305';

19. /*+ NO_EXPAND */
對於WHERE後面的OR 或者IN-LIST的查詢語句,NO_EXPAND將阻止其基於優化器對其進行擴展, 縮短解析時間.
例如:SELECT /*+ NO_EXPAND */ * FROM BSEMPMS WHERE DPT_NO='TDC506' AND SEX='M';

20. /*+ DRIVING_SITE(TABLE) */
強制與ORACLE所選擇的位置不同的表進行查詢執行.特別適用於通過dblink連接的遠端表.
例如:SELECT /*+ DRIVING_SITE(DEPT) */ * FROM BSEMPMS,DEPT@BSDPTMS DEPT WHERE BSEMPMS.DPT_NO=DEPT.DPT_NO;

21. /*+ CACHE(TABLE) *//*+ NOCACHE(TABLE) */
當進行全資料表掃描時,CACHE提示能夠將表全部緩存到記憶體中,這樣訪問同一個表的使用者可直接在記憶體中查找資料. 比較適合資料量小但常被訪問的表, 也可以建表時指定cache選項這樣在第一次訪問時就可以對其緩存. NOCACHE則表示對已經指定了CACHE選項的表不進行緩存.
例如:SELECT /*+ FULL(BSEMPMS) CAHE(BSEMPMS) */ EMP_NAM FROM BSEMPMS;

22. /*+ PUSH_SUBQ */
當SQL裡用到了子查詢且返回相對少的行時, 該提示可以盡可能早對子查詢進行評估從而改善性能, 不適用於合併連接或帶遠端表的連接.
例如:select /*+ PUSH_SUBQ */ emp.empno, emp.ename, itemno from emp, orders where emp.empno = orders.empno and emp.deptno = (select deptno from dept where loc='XXX');
遠端連接其他資料庫,注意判斷資料庫是否啟動,或者是否有需要的表,否則會出錯

23. /*+ INDEX_SS(TABLE INDEX1,INDEX2) */
指示對特定表的索引使用跳躍掃描, 即當組合索引的第一列不在where子句中時, 讓其使用該索引

參考資料:

http://docs.oracle.com/cd/E11882_01/server.112/e16638/hintsref.htm#autoId0

http://jojo117.iteye.com/blog/584845

文章標籤

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

LVM (Logical Volume Mamager) 概念
使用 LVM,硬碟中的分割區必須加入『Logical Volume Group 邏輯磁區群組(簡稱 VG)』,這種分割區在 LVM 中稱為『Physical Volume 實體磁區(簡稱PV)』,各位可以把 VG 想成是一個大硬碟,然後再從其中切出一塊空間『Logical Volume 邏輯磁區(簡稱 LV)』對應至系統的檔案系統。
 
除了/boot 分割區,其餘的檔案系統皆可在 Volume Group 在這顆虛擬的大硬碟中。/boot 分割區不可以在 VG 中,因為開機管理程式將無法讀取到它。假如您想要  /  檔案系統在 VG 中,您必須另外建立一個  /boot 分割區,使其不屬於VG 的一員。
 
VG 可以分割為幾個 『Logical Volume 邏輯磁區』,將會指定它們的掛載點,例如  /opt  與  /,以及檔案系統類型,如 ext4。當某個檔案系統的容量全滿時,VG 中的剩餘空間可以增加到此檔案系統所對映的邏輯磁區以增大此檔案系統大小。
示意圖如下:

Linux LVM (Logical Volume Manager) Concept.png  

接下來我們用VMWare 來模擬實體機,一步步來安裝 Oracle Linux

Oracle Linux 的來源可從下面取得

https://edelivery.oracle.com/linux

01. 安裝前, 先定義規格

01_oracleLinuxSpec.png

02. 選擇全新安裝

02_oracleLinuxInstallSelect.png

03. 不作安裝來源的檢查

03_oracleLinuxDiskSkip.png

04. 用英文模式來安裝, 因為中文有時翻譯的可能會讓人看不懂

04_oracleLinuxLanguage.png

05. 鍵盤選擇 U.S. English

05_oracleLinuxKB.png

06. 選擇硬碟的類型

06_oracleLinuxStorage.png

07. 硬碟內的資料不保存

07_oracleLinuxDiscardData.png

08. 主機的名稱

08_oracleLinuxHostName.png

09. 時間區域 Time Zone:選亞洲/台北

09_oracleLinuxTZ.png

10. root 的密碼

10_oracleLinuxPW.png

11. 硬碟的配置, 依 LVM 的概念作分配, 選擇自行規劃

11_oracleLinuxHDLayout.png  

12. 先將實體硬碟 sdb & sdc 變成 LVM Physical Volume

12_oracleLinuxLVM01.png

13. 將這兩個LVM Physical Volume (PV):sdb & sdc 加入 Volume Group (VG) VolGroup1 裡

13_oracleLinuxVG_LV.png

14. 記得 /boot 不能放在 LV 裡, 且要將 Force to be a primary paritition 打勾, 這樣系統才開得起來

14_oracleLinuxBoot.png

15. 整個碟碟的規劃如下

15_oracleLinuxLayoutAll.png

16. boot loader 放在 /dev/sda 上, 這樣大致就設定完成

16_oracleLinuxBootLoader.png

17. 因為待會我們要安裝 Oracle Database 12c Release 1 (12.1) , 所以選擇 Customize Now 來挑選必要的 package 軟體

17_oracleLiuxPlatform.png  

The following package groups were included for this installation.

    Base System > Base
    Base System > Compatibility libraries
    Base System > Hardware monitoring utilities
    Base System > Large Systems Performance
    Base System > Network file system client
    Base System > Performance Tools
    Base System > Perl Support
    Servers > Server Platform
    Servers > System administration tools
    Desktops > Desktop
    Desktops > Desktop Platform
    Desktops > Fonts
    Desktops > General Purpose Desktop
    Desktops > Graphical Administration Tools
    Desktops > Input Methods
    Desktops > X Window System
    Applications > Internet Browser
    Development > Additional Development
    Development > Development Tools

安裝 Oracle Database 12c Release 1 (12.1.0.1)  的官方文件可以參考:

http://www.oracle-base.com/articles/12c/oracle-db-12cr1-installation-on-oracle-linux-6.php

http://www.oracle-base.com/articles/12c/oracle-db-12cr1-rac-installation-on-oracle-linux-6-using-virtualbox.php

文章標籤

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