PL / SQL: оператор SQL игнорируется с помощью функции оракула - PullRequest
0 голосов
/ 11 февраля 2019

Я пытаюсь скомпилировать функцию, но они показывают ошибку «PL / SQL: оператор SQL игнорируется» и упоминают функцию «PO_PROD_CODE».Не могли бы вы помочь дать комментарий.

PL / SQL: оператор SQL игнорируется с помощью функции оракула (функция "PO_PROD_CODE")

  FUNCTION PO_PROD_CODE (s_prod_code VARCHAR2) RETURN VARCHAR2 IS

   v_po_prod_code_result   VARCHAR2(100);

   BEGIN 

     SELECT FLEX_VALUE 
        INTO v_po_prod_code_result
      FROM apps.FND_FLEX_VALUES_VL

    WHERE  attribute1 IN ('BXX', 'EXX', 'GXX', 'HKXX', 'PDX', 'PSX', 'GPX') 
      AND FLEX_VALUE = s_prod_code ;

  RETURN v_po_prod_code_result;
  END;
  /

   FUNCTION PO_DOC_LOCATION_TEXT (N_ORG_ID NUMBER, N_PO_HEADER_ID NUMBER) RETURN VARCHAR2 IS

  v_po_doc_location_text  VARCHAR2(150);                                      
  s_prod_code VARCHAR2(20); 
   BEGIN

      SELECT 'PO\'||PO_DIVISION_CODE||'\'||PO_PRODUCT_LINE||'\'||PO_NUM||'\' AS "DOC_TEXT"
        INTO v_po_doc_location_text
        FROM (SELECT  poh.SEGMENT1 PO_NUM,
                      poh.ORG_ID,
                      poh.ATTRIBUTE14 AS "PO_PRODUCT_LINE",
                      poh.ATTRIBUTE15 AS "PO_DIVISION",
            CASE (SELECT ffvv.attribute1 bs_group
                        FROM apps.fnd_flex_values_vl ffvv,
                            apps.fnd_flex_value_sets ffvs
                        WHERE ffvv.flex_value_set_id = ffvs.flex_value_set_id
                            AND ffvs.flex_value_set_name = 'XXX_PROD_LINES'
                            AND ffvv.enabled_flag = 'Y'
                            AND ((ffvv.attribute4 = 'Y' AND poh.ORG_ID = 83) OR (ffvv.attribute5 = 'Y' AND poh.ORG_ID = 87))
                            AND ffvv.flex_value = PO_PROD_CODE (v_po_prod_code_result, s_prod_code) --call the "PO_PROD_CODE" function get the sql feild "prod_line_code")

                                  WHEN 'ABC'    THEN 'AB'   --FLEX_VALUE_ID,FLEX_VALUE PRO_CODE,
                                  WHEN 'DEF'    THEN 'DE'
                                  WHEN 'GSD'    THEN 'HK'
                                  WHEN 'HIG'    THEN 'HG'
                                  WHEN 'PIG'    THEN 'PG'
                                  WHEN 'BCE'    THEN 'BE'
                                  WHEN 'GP'     THEN 'HK' 

                                  ELSE ''
                                 END PO_DIVISION_CODE  
                FROM APPS.PO_HEADERS_ALL poh
                WHERE poh.ORG_ID = N_ORG_ID
                  AND poh.po_header_id = N_PO_HEADER_ID

       );

    EXCEPTION
      WHEN OTHERS THEN
      v_po_doc_location_text := 'PO\MO\';
    END;
    RETURN v_po_doc_location_text + s_prod_code;
END;

Завершить успешно!Когда я пытаюсь запустить скрипт, подробности выглядят следующим образом:

SELECT abc.XXX_util.PO_DOC_LOCATION_TEXT ('83','1145225') from dual;

В сообщении об ошибке указано:

ORA-06502: PL / SQL: ошибка числа или значения: от символа доошибка преобразования числа

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

В вашем коде есть несколько ошибок, и вам придется их исправить:

  • Вы должны написать оператор SELECT INTO, написав часть INTO перед написаниемFROM (как вы написали в своей функции PO_DOC_LOCATION_TEXT)
  • В ваших WHEN-THEN сравнениях отсутствует CASE слово
  • В вашей функции PO_DOC_LOCATION_TEXT вы вызвали функцию PO_PROD_CODE, передав двапараметры, но он принимает только один параметр.Вы должны только передать входной параметр.Если вы хотите заполнить локальную переменную возвращаемым значением из функции PO_PROD_CODE, вы должны сделать это вне SQL-запроса.
  • В вашем запросе отсутствует одна скобка ) внутри функции PO_DOC_LOCATION_TEXT, и я думаю, это однакоторые потерялись внутри вашего call the "PO_PROD_CODE" function get the sql feild "prod_line_code" комментария
  • Вы заканчиваете свою функцию PO_DOC_LOCATION_TEXT перед оператором RETURN.Вы должны добавить еще один BEGIN перед вашим SELECT INTO

Я также вижу, что ваша функция PO_PROD_CODE (как она написана сейчас) всегда возвращает входное значение (s_prod_code).Он выбирает fnd_flex_values_vl.flex_value в возвращаемую переменную сразу после того, как говорит, что тот же самый flex_value должен быть равен s_prod_code, который является входным параметром вашей функции.быть как:

FUNCTION PO_PROD_CODE (s_prod_code VARCHAR2)
    RETURN VARCHAR2
IS
    v_po_prod_code_result   VARCHAR2 (100);

BEGIN
    SELECT flex_value
      INTO v_po_prod_code_result
      FROM apps.fnd_flex_values_vl
     WHERE     attribute1 IN ('BXX',
                              'EXX',
                              'GXX',
                              'HKXX',
                              'PDX',
                              'PSX',
                              'GPX')
           AND flex_value = s_prod_code; -- STILL JUST RETURNS THE INPUT PARAMETER

    RETURN v_po_prod_code_result;
END;
/

FUNCTION PO_DOC_LOCATION_TEXT (N_ORG_ID NUMBER, N_PO_HEADER_ID NUMBER)
    RETURN VARCHAR2
IS
    v_po_doc_location_text   VARCHAR2 (150);
    s_prod_code VARCHAR2(20); -- NEEDS TO HAVE SOME VALUE ASSIGNED BEFORE PASSING IT TO "PO_PROD_CODE" FUNCTION BELOW IN CODE

BEGIN
    BEGIN
        SELECT 'PO\' || PO_DIVISION_CODE || '\' || PO_PRODUCT_LINE || '\' || PO_NUM || '\' AS "DOC_TEXT"
          INTO v_po_doc_location_text
          FROM (SELECT poh.SEGMENT1 PO_NUM,
                       poh.ORG_ID,
                       poh.ATTRIBUTE14 AS "PO_PRODUCT_LINE",
                       poh.ATTRIBUTE15 AS "PO_DIVISION",
                       CASE (SELECT ffvv.attribute1 bs_group
                               FROM apps.fnd_flex_values_vl ffvv, apps.fnd_flex_value_sets ffvs
                              WHERE     ffvv.flex_value_set_id = ffvs.flex_value_set_id
                                    AND ffvs.flex_value_set_name = 'XXX_PROD_LINES'
                                    AND ffvv.enabled_flag = 'Y'
                                    AND ( (ffvv.attribute4 = 'Y' AND poh.ORG_ID = 83) OR (ffvv.attribute5 = 'Y' AND poh.ORG_ID = 87))
                                    AND ffvv.flex_value = PO_PROD_CODE (s_prod_code) --call the "PO_PROD_CODE" function get the sql feild "prod_line_code", "v_po_prod_code_result" removed because PO_PROD_CODE expects only one parameter and because only input parameters can be written here
                                                                                                           )
                           WHEN 'ABC' THEN 'AB' --FLEX_VALUE_ID,FLEX_VALUE PRO_CODE,
                           WHEN 'DEF' THEN 'DE'
                           WHEN 'GSD' THEN 'HK'
                           WHEN 'HIG' THEN 'HG'
                           WHEN 'PIG' THEN 'PG'
                           WHEN 'BCE' THEN 'BE'
                           WHEN 'GP' THEN 'HK'
                           ELSE ''
                       END
                           PO_DIVISION_CODE
                  FROM APPS.PO_HEADERS_ALL poh
                 WHERE poh.ORG_ID = N_ORG_ID AND poh.po_header_id = N_PO_HEADER_ID);
    EXCEPTION
        WHEN OTHERS
        THEN
            v_po_doc_location_text := 'PO\MO\';
    END;

    RETURN v_po_doc_location_text;
END;

Я надеюсь, что помог!

0 голосов
/ 11 февраля 2019

Это не FROM ... INTO, а INTO ... FROM:

FUNCTION PO_PROD_CODE (s_prod_code VARCHAR2) RETURN VARCHAR2 IS
   v_po_prod_code_result   VARCHAR2(100);

BEGIN 
     SELECT FLEX_VALUE 
      FROM apps.FND_FLEX_VALUES_VL           --> this is
      INTO v_po_prod_code_result             --> wrong
    WHERE  attribute1 IN ('BXX', 'EXX', 'GXX', 'HKXX', 'PDX', 'PSX', 'GPX') 
      AND FLEX_VALUE = s_prod_code ;
  RETURN v_po_prod_code_result;
END;
/

Должно быть

     SELECT FLEX_VALUE 
      INTO v_po_prod_code_result             
      FROM apps.FND_FLEX_VALUES_VL          

[РЕДАКТИРОВАТЬ]

CASE второй функции недействителен.Этот SELECT должен быть удален из него, его таблицы используются в главном предложении SELECT FROM.Примерно так (что нормально в синтаксисе, я не знаю, будет ли это работать):

FUNCTION PO_DOC_LOCATION_TEXT (N_ORG_ID NUMBER, N_PO_HEADER_ID NUMBER)
   RETURN VARCHAR2
IS
   v_po_doc_location_text  VARCHAR2 (150);
BEGIN
   SELECT    'PO\'
          || PO_DIVISION_CODE
          || '\'
          || PO_PRODUCT_LINE
          || '\'
          || PO_NUM
          || '\'
             AS "DOC_TEXT"
     INTO v_po_doc_location_text
     FROM (SELECT poh.SEGMENT1 PO_NUM,
                  poh.ORG_ID,
                  poh.ATTRIBUTE14 AS "PO_PRODUCT_LINE",
                  poh.ATTRIBUTE15 AS "PO_DIVISION",
                  CASE ffvv.attribute1
                     WHEN 'ABC' THEN 'AB' --FLEX_VALUE_ID,FLEX_VALUE PRO_CODE,
                     WHEN 'DEF' THEN 'DE'
                     WHEN 'GSD' THEN 'HK'
                     WHEN 'HIG' THEN 'HG'
                     WHEN 'PIG' THEN 'PG'
                     WHEN 'BCE' THEN 'BE'
                     WHEN 'GP' THEN 'HK'
                     ELSE ''
                  END
                     PO_DIVISION_CODE
             FROM APPS.PO_HEADERS_ALL poh,
                  apps.fnd_flex_values_vl ffvv,
                  apps.fnd_flex_value_sets ffvs
            WHERE     ffvv.flex_value_set_id = ffvs.flex_value_set_id
                  AND ffvs.flex_value_set_name = 'XXX_PROD_LINES'
                  AND ffvv.enabled_flag = 'Y'
                  AND (   (    ffvv.attribute4 = 'Y'
                           AND poh.ORG_ID = 83)
                       OR (    ffvv.attribute5 = 'Y'
                           AND poh.ORG_ID = 87))
                  AND ffvv.flex_value =
                         PO_PROD_CODE (v_po_prod_code_result, s_prod_code)
                  AND poh.ORG_ID = N_ORG_ID
                  AND poh.po_header_id = N_PO_HEADER_ID);

   RETURN v_po_doc_location_text;
EXCEPTION
   WHEN OTHERS
   THEN
      v_po_doc_location_text   := 'PO\MO\';
END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...