2014-09-29 186 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

相关问题