2014-09-29 190 views

回答

3

兩者都是一樣的,CONCAT()用於支持SQL腳本處理的不同字符集,其中'||'可能被錯誤地解釋。

Documentation

在大多數平臺,並置運算符是兩個實心垂直 酒吧,表4-3所示。但是,某些IBM平臺爲此操作員使用了斷開的 豎條。當在具有不同字符集的系統(例如ASCII和 EBCDIC)之間移動 系統之間的SQL腳本文件時,豎線可能不會被轉換爲目標Oracle數據庫環境所需的豎線 。 Oracle提供 CONCAT字符函數作爲豎線 操作符的替代方法,用於操作系統或網絡實用程序難以或不可能控制 轉換時的情況。在應用程序中使用 此功能將在具有不同字符集的環境 之間移動。

7

我設置了一個簡單的PL/SQL腳本(下面)來嘗試每個循環中的兩個級聯選項。 ||的結果是142.93秒,而CONCAT是144.11秒。無論哪種方式,您每次操作大約需要1.4微秒。我的結論是,似乎沒有任何明顯的性能差異。

除了更易讀,||是連接運算符的ANSI標準。


DECLARE 
    i NUMBER; 
    j NUMBER := 100000000; 
    v VARCHAR2 (1000); 
    v_start TIMESTAMP := SYSTIMESTAMP; 
BEGIN 
    FOR i IN 1 .. j LOOP 
     v := DBMS_RANDOM.VALUE() || DBMS_RANDOM.VALUE(); 
    END LOOP;  
    DBMS_OUTPUT.put_line ('1: ' || (SYSTIMESTAMP - v_start)); 
END; 

DECLARE 
    i NUMBER; 
    j NUMBER := 100000000; 
    v VARCHAR2 (1000); 
    v_start TIMESTAMP := SYSTIMESTAMP; 
BEGIN 
    FOR i IN 1 .. j LOOP 
     v := CONCAT (DBMS_RANDOM.VALUE(), DBMS_RANDOM.VALUE()); 
    END LOOP;  
    DBMS_OUTPUT.put_line ('2: ' || (SYSTIMESTAMP - v_start)); 
END; 

作爲一個註腳,OracleCONCAT函數的本約的目的:

當移動具有不同 的字符集,比如ASCII之間的系統間的SQL腳本文件和EBCDIC,豎線可能不會被翻譯成目標所需的豎線 數據庫env ironment。 Oracle提供了CONCAT字符功能 到垂直杆操作者對情況的替代,當它是通過操作 系統或網絡公用程序執行 難以或不可能控制翻譯。在 將環境之間具有不同的字符集的移動應用程序使用此功能。

+0

一些我的同事的表明,採用管他們的查詢,而CONCAT功能不有時會失敗。我認爲在我們的情況下,這是不同字符集的問題,但網絡/操作系統問題很有趣。我將C7 .imr文件轉換爲C10(基於網頁),因此我正在切換到||。 – 2017-02-07 14:39:04

相關問題