【问题标题】:Oracle Stored Function not returning result as sql stringOracle 存储函数未将结果作为 sql 字符串返回
【发布时间】:2015-12-10 06:00:06
【问题描述】:

我有以下 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

【问题讨论】:

  • 请提供数据,即创建和插入语句。您可以发布 SQL Fiddle 测试用例。
  • 嗨 Lalit 为什么需要创建和插入语句?我是否应该为您提供一个选择查询结果的示例,我将结果存储到变量 V_SYSTEM_SQL_CHECK 中?
  • 好吧,您通过查询获得的 V_KPI_TYPE_ID 似乎与 12 或 18 不匹配。
  • 嗨 Thorsten,当我在 sql developer 中调试我的代码时,以及当我在 BUILT_EMAIL_ALERT_BODY 中使用 IN_KPI_LOG_ID 提供参数时,它会将值返回为 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 交叉连接 (select count() as cnt from SDR_O2 where id > to_char(SYSTIMESTAMP - INTERVAL '1' HOUR, 'YYYYMMDDHH24MISS')||'0000' ) o
  • 添加 DBMS_OUTPUT.PUT_LINE('KPI_TYPE_ID in first if ' || V_KPI_TYPE_ID);在第一个 IF 条件之后。删除 SYSTEM_SQL_CHECK 输出。不需要

标签: oracle plsql stored-functions


【解决方案1】:

修改代码中的以下行

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

同时使用 to_char 函数(即 sql)修改为 BODY 分配的任何位置。

【讨论】:

    【解决方案2】:

    只需使用

      IF (V_KPI_TYPE_ID = 12 OR V_KPI_TYPE_ID = 18) THEN
    

    如果仍然没有返回结果,请告诉我

    【讨论】:

    • 在 if 和 else 部分中添加 dbms_output.put_line,并打印 V_KPI_TYPE_ID 的值以查看它返回的内容。
    • 另外你是如何输入 V_KPI_TYPE_ID 的值的?我没有看到它作为输入出现或在代码中的任何地方设置。
    • 很抱歉在编辑我的代码时忘记提出问题。请检查我编辑的问题。我尝试调试我的代码,V_KPI_TYPE_ID 正确返回为 18
    • 但它是在第一个 IF 块还是 else 块中出现。请尝试 dbms_output.put_line 并检查。
    • 我编辑了我的代码并使用 dbms_output.put_line 并将结果返回为: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
    猜你喜欢
    • 2013-12-29
    • 1970-01-01
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    • 2015-02-05
    • 1970-01-01
    • 2020-03-26
    • 2012-06-12
    相关资源
    最近更新 更多