Сохраненная функция Oracle не возвращает результат в виде строки sql

Ниже у меня есть хранимая процедура Oracle, которая работает нормально и возвращает результат для условия IF (V_KPI_TYPE_ID = 13). Но когда я использовал условие IF ((V_KPI_TYPE_ID = 12) OR (V_KPI_TYPE_ID = 18)), он не возвращает никакого результата. Я пытаюсь отладить свой код и пытаюсь запустить запрос выбора, где я помещаю результат в переменную V_SYSTEM_SQL_CHECK и возвращаю значение, и запрос выбора работает нормально. Возвращаемое значение этой переменной будет строкой sql. И я использую тип данных varchar2 для хранения этой строки sql. Поэтому я думаю, что тип данных, который я использую, заключается в том, чтобы хранить строку sql в переменной, неверен, но не уверен

FUNCTION BUILD_ALERT_EMAIL_BODY
(
  IN_ALERT_LOGS_TIMESTAMP IN TIMESTAMP
, IN_ALERT_LOGS_LOG_DESC IN VARCHAR2
, IN_KPI_LOG_ID IN NUMBER
) RETURN VARCHAR2 AS
BODY VARCHAR2(4000) := '';    
V_SYSTEM_SQL_CHECK VARCHAR2(3000) := '';
V_SOAP_SERVICE_NAME VARCHAR2(100) := '';

BEGIN
Select KPI_DEF_ID INTO V_KPI_DEF_ID FROM KPI_LOGS WHERE KPI_LOG_ID = IN_KPI_LOG_ID;  

Select KT.KPI_TYPE_ID INTO V_KPI_TYPE_ID FROM RATOR_MONITORING_CONFIGURATION.KPI_DEFINITION KD JOIN RATOR_MONITORING_CONFIGURATION.KPI_TYPE KT ON KD.KPI_TYPE = KT.KPI_TYPE_ID WHERE KD.KPI_DEF_ID = V_KPI_DEF_ID;

DBMS_OUTPUT.PUT_LINE('KPI_TYPE_ID:' || V_KPI_TYPE_ID);

Select KT.CHECK_SQL INTO V_SYSTEM_SQL_CHECK FROM RATOR_MONITORING_CONFIGURATION.KPI_DEFINITION KD JOIN RATOR_MONITORING_CONFIGURATION.SYSTEM_SQL_CHECK KT ON KD.SYSTEM_SQL_CHECK_ID = KT.SYSTEM_SQL_CHECK_ID WHERE KD.KPI_DEF_ID = V_KPI_DEF_ID;

DBMS_OUTPUT.PUT_LINE('SYSTEM_SQL_CHECK' || V_SYSTEM_SQL_CHECK);

Select SP.SOAP_SERVICE_NAME INTO V_SOAP_SERVICE_NAME FROM RATOR_MONITORING_CONFIGURATION.KPI_DEFINITION KD JOIN RATOR_MONITORING_CONFIGURATION.SOAP_SERVICE SP ON KD.SOAP_SERVICE_ID = SP.SOAP_SERVICE_ID WHERE KD.KPI_DEF_ID = V_KPI_DEF_ID;

    BODY := to_char(IN_ALERT_LOGS_TIMESTAMP,'DD.MM.YYYY HH24:MI') || Chr(13) || Chr(10);       

IF ((V_KPI_TYPE_ID = 12) OR (V_KPI_TYPE_ID = 18)) THEN
    BODY := BODY || 'SQL USED:' || V_SYSTEM_SQL_CHECK || Chr(13) || Chr(10);
  ELSE IF (V_KPI_TYPE_ID = 13) THEN 
    BODY := BODY || 'SOAP_SERVICE:' || Chr(13) || Chr(10);
    BODY := BODY || V_SOAP_SERVICE_NAME || Chr(13) || Chr(10);        
  END IF;
END IF;

BODY := BODY || 'ALERT_DESCRIPTION:' || to_char(IN_ALERT_LOGS_LOG_DESC);

    RETURN BODY;
END BUILD_ALERT_EMAIL_BODY;

Когда я отлаживаю свой код, он возвращает правильный результат, как показано ниже:

KPI_TYPE_ID:18
SYSTEM_SQL_CHECK:select CASE WHEN (o.cnt = 0) THEN 0 ELSE round((r.cnt / o.cnt)*100,3) END from (select count(*) as cnt from rate_errors where id > to_char(SYSTIMESTAMP - INTERVAL '1' HOUR, 'YYYYMMDDHH24MISS') ||'0000' ) r cross join
     (select count(*) as cnt
      from SDR_O2
      where id > to_char(SYSTIMESTAMP - INTERVAL '1' HOUR, 'YYYYMMDDHH24MISS')||'0000'
    ) o

person Andrew    schedule 14.09.2015    source источник
comment
Пожалуйста, предоставьте данные, т.е. создайте и вставьте заявления. Вы можете опубликовать тестовый пример SQL Fiddle.   -  person Lalit Kumar B    schedule 14.09.2015
comment
Привет, Лалит, зачем тебе создавать и вставлять заявление? Должен ли я предоставить вам пример результата запроса Select, где я сохраняю результат в varialbe V_SYSTEM_SQL_CHECK?   -  person Andrew    schedule 14.09.2015
comment
Ну, похоже, V_KPI_TYPE_ID, который вы получаете с запросом, просто не соответствует 12 или 18.   -  person Thorsten Kettner    schedule 14.09.2015
comment
Привет, Торстен, когда я отлаживаю свой код в sql-разработчике и во время отладки, когда я предоставляю параметр в BUILT_EMAIL_ALERT_BODY с IN_KPI_LOG_ID, тогда его значение возвращается как KPI_TYPE_ID: 18 SYSTEM_SQL_CHECK: выберите CASE WHEN (o.cnt = 0) THEN 0 ELSE round ((r. cnt / o.cnt)*100,3) END from (выберите count() как cnt из rate_errors, где id › to_char(SYSTIMESTAMP - INTERVAL '1' HOUR, 'YYYYMMDDHH24MISS') ||'0000' ) r cross join (выберите count() как cnt из SDR_O2, где id › to_char(SYSTIMESTAMP - INTERVAL '1' HOUR, 'YYYYMMDDHH24MISS')||'0000' ) o   -  person Andrew    schedule 14.09.2015
comment
Добавьте DBMS_OUTPUT.PUT_LINE('KPI_TYPE_ID сначала, если ' || V_KPI_TYPE_ID); после первого условия IF. Удалите выходные данные SYSTEM_SQL_CHECK. Не требуется   -  person Utsav    schedule 14.09.2015
comment
когда я пытаюсь использовать DBMS_OUTPUT.PUT_LINE('KPI_TYPE_ID:' || V_KPI_TYPE_ID) внутри, если тогда он не возвращает никакого результата   -  person Andrew    schedule 14.09.2015
comment
да. так что как-то это не происходит в условии if. Вы уверены, что KT.KPI_TYPE_ID - это число, а не varchar?   -  person Utsav    schedule 14.09.2015
comment
да Utsav KPI_TYPE_ID — это число, и его всегда возвращается числовое значение.   -  person Andrew    schedule 14.09.2015
comment
Как я уже сказал, он возвращает результат для V_KPI_TYPE_ID = 13.   -  person Andrew    schedule 14.09.2015
comment
привет, utsav, теперь я понял ошибку... когда я комментирую sql для soap_service, он работает для system_sql_check. Когда я комментирую код для system_sql_check, он работает для soap_service и возвращает результат. Но не знаю, как это исправить.   -  person Andrew    schedule 14.09.2015
comment
Я могу попробовать воссоздать ваш код позже в нерабочее время. Давайте посмотрим, если кто-то найдет способ исправить до тех пор. Пожалуйста, обновите, если вы подойдете ближе   -  person Utsav    schedule 14.09.2015
comment
Да Уцав спасибо. Теперь я понял, что проблема в том, что если еще условие точно.   -  person Andrew    schedule 14.09.2015


Ответы (2)


просто используйте

  IF (V_KPI_TYPE_ID = 12 OR V_KPI_TYPE_ID = 18) THEN

Дайте мне знать, если он по-прежнему не возвращает результат

person Utsav    schedule 14.09.2015
comment
добавьте dbms_output.put_line внутрь частей if и else и распечатайте значения V_KPI_TYPE_ID, чтобы увидеть, что он возвращает. - person Utsav; 14.09.2015
comment
Также как вы вводите значение V_KPI_TYPE_ID? Я не вижу, чтобы это входило в качестве ввода или устанавливалось где-либо в коде. - person Utsav; 14.09.2015
comment
Извините, редактируя свой код, я забыл поставить вопрос. Пожалуйста, проверьте мой отредактированный вопрос. Я пытаюсь отладить свой код, и V_KPI_TYPE_ID возвращает правильное значение 18. - person Andrew; 14.09.2015
comment
Но приходит ли он в первом блоке IF или в другом блоке. Попробуйте dbms_output.put_line и проверьте, пожалуйста. - person Utsav; 14.09.2015
comment
я отредактировал свой код и использую dbms_output.put_line, и он возвращает результат как: ) END from (выберите count() как cnt из rate_errors, где id › to_char(SYSTIMESTAMP - INTERVAL '1' HOUR, 'YYYYMMDDHH24MISS') ||'0000' ) r cross join (выберите count() как cnt из SDR_O2, где id › to_char(SYSTIMESTAMP - INTERVAL '1' HOUR, 'YYYYMMDDHH24MISS')||'0000' ) o - person Andrew; 14.09.2015
comment
когда я пытаюсь использовать DBMS_OUTPUT.PUT_LINE('KPI_TYPE_ID:' || V_KPI_TYPE_ID) внутри, если тогда он не возвращает никакого результата - person Andrew; 14.09.2015

Измените строку ниже в вашем коде

BODY := to_char(IN_ALERT_LOGS_TIMESTAMP,'DD.MM.YYYY HH24:MI') || Chr(13) || Chr(10);    

вот так и попробуй

BODY := 'to_char(' || IN_ALERT_LOGS_TIMESTAMP || ',''DD.MM.YYYY HH24:MI'')' || Chr(13) || Chr(10);

Также измените везде, где BODY назначается с помощью функции to_char, которая является sql.

person JyothiKumar    schedule 14.09.2015