2016-07-16 10 views
-1

CONCAT 함수를 사용할 때 Oracle SQL과 PL/SQL에 대한 규칙이 다릅니 까? Oracle에서 CONCAT 기능을 위해 subselect를 함수와 함께 어떻게 사용할 수 있습니까? 나는 다음과 같은 간단한 쿼리가있는 경우Oralcle 함수에서 CONCAT 함수와 함께 subselect 사용

, 그것은 내가 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; 

을 얻을

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

작동하지만,

[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

블록 끝의 값을 잊어 버리는 것을 잊었습니다.

select ...을 이중 블록에서 pl 블록으로 만들 필요가 없습니다.

-- 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

'ORA-06503 : PL/SQL : 값없이 반환 된 함수'오류를 방지하려면'return'이'end if' 뒤를 따라야합니다. –

+0

Upps, 당신 말이 맞아요 @William Robertson –

+0

이것은 단지 예제 일뿐입니다. 나는 정말로 SQL 문에서 유효하더라도 CONCAT 함수가이 방법을 PL/SQL에서 유효하지 않은지 알아 내려고합니다. – adbdkb