2016-07-16 69 views
-1

使用CONCAT函數時,Oracle SQL和PL/SQL的規則有何不同?如何在Oracle中爲CONCAT函數使用子查詢和函數。在Oralcle函數中使用CONCAT函數的子選擇

如果我有像下面一個簡單的查詢,它的工作原理

SELECT CONCAT (' A, B.', 
       (SELECT REGEXP_SUBSTR ('CC, DDD, E, ', 
             '[^,]+', 
             1, 
             1) 
        --INTO RESULT_PATTERN 
        FROM DUAL)) 
    FROM DUAL; 

但是,如果我加入這個在PL/SQL函數,我得到錯誤

FUNCTION TEST_SELECTION (BIT_PATTERN IN VARCHAR2, 
           SEL_PATTERN IN VARCHAR2) 
     RETURN VARCHAR2 
    IS 
     RESULT_PATTERN  VARCHAR2 (250); 
     LOOP_BIT_PATTERN VARCHAR2 (10); 
     LOOP_SEL_PATERN VARCHAR2 (300); 
     TEMP_VAR   VARCHAR2 (200); 
    BEGIN 
     IF (LENGTH (BIT_PATTERN) > 0 AND SUBSTR (BIT_PATTERN, 0, 1) = '1') 
     THEN 
     RESULT_PATTERN := 
      CONCAT (RESULT_PATTERN, 
        (SELECT REGEXP_SUBSTR (SEL_PATTERN, **--This is line 35** 
              '[^,]+', 
              1, 
              1) 
           --TEMP_VAR 
         FROM DUAL));  **--This is line 40** 
     BIT_PATTERN := SUBSTR (BIT_PATTERN, 1); 
     SEL_PATTERN := ''; 
     --TEST_SELECTION (BIT_PATTERN, SEL_PATTERN); 
     END IF; 
    END TEST_SELECTION; 

的錯誤是

[Error] PLS-00103 (35: 22): PLS-00103: Encountered the symbol "SELECT" when expecting one of the following: 

    (- + case mod new not null <an identifier> 
    <a double-quoted delimited-identifier> <a bind variable> 
    continue 
[Error] PLS-00103 (40: 33): PLS-00103: Encountered the symbol ")" when expecting one of the following: 

    . , @ ; for <an identifier> 
    <a double-quoted delimited-identifier> group having intersect 
    minus order partition sta 

回答

1

您忘了返回塊末尾的值。

您的情況沒有必要在一個pl塊中將select ... into ...從雙中刪除。

-- by default all parameters are IN 
FUNCTION TEST_SELECTION (BIT_PATTERN VARCHAR2, 
         SEL_PATTERN VARCHAR2) 
RETURN VARCHAR2 
IS 
    RESULT_PATTERN  VARCHAR2 (250); 
    LOOP_BIT_PATTERN VARCHAR2 (10); 
    LOOP_SEL_PATERN VARCHAR2 (300); 
BEGIN 
    IF (LENGTH (BIT_PATTERN) > 0 AND SUBSTR (BIT_PATTERN, 0, 1) = '1') 
    THEN 
     -- Are you sure RESULT_PATTERN has a value at this point? 
     RESULT_PATTERN := RESULT_PATTERN || 
          REGEXP_SUBSTR(SEL_PATTERN, '[^,]+', 1,1); 
     BIT_PATTERN := SUBSTR(BIT_PATTERN, 1); 
     SEL_PATTERN := ''; 
    END IF; 
    -- I supose you want to return this variable 
    RETURN RESULT_PATTERN; 
END TEST_SELECTION; 
+0

'return'需要在'end if'後面,以避免'ORA-06503:PL/SQL:函數返回無值'錯誤。 –

+0

Upps,你是對的@William Robertson –

+0

這只是一個示例。我真的試圖找出在PL/SQL中使用這種方法的CONCAT函數是否無效,即使它在SQL語句中有效。 – adbdkb