2016-07-16 2 views
-1

Существуют ли разные правила для Oracle SQL и PL/SQL при использовании функции CONCAT? Как я могу использовать subselect с функцией в Oracle для функции CONCAT.Использование subselect с функцией CONCAT в функции Oralcle

Если у меня есть простой запрос, как показано ниже, она работает

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.

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

«возврат» должен идти после 'end if', чтобы избежать« ORA-06503: PL/SQL: функция возвращена без ошибок значения ». –

+0

Уппс, вы правы @William Robertson –

+0

Это всего лишь пример. Я действительно пытаюсь выяснить, не используется ли функция CONCAT таким образом в PL/SQL, хотя она действительна в SQL-заявлении. – adbdkb

Смежные вопросы