在PL / SQL中引用页面项时出现ORA-01403

时间:2019-01-14 21:52:50

标签: oracle plsql oracle-apex

我正在构建一个Oracle ApEx页面来显示数据图表。数据作为输入输入到表中,但是实际计算的指标可能会有所不同,具体取决于所查看的KPI(AVG(VALUE_1); SUM(VALUE_1)/ SUM(VALUE_2);等等);以及这些计算结果存储在单独的表中。由于我希望使用交互时一切都是动态的,因此我使用了返回SQL查询的PL / SQL函数体源。这是简化版

DECLARE
    SQL_STMT      VARCHAR2 (32767);
    CALC_CLAUSE   VARCHAR2 (4000);
BEGIN
    SELECT CALCULATION
      INTO CALC_CLAUSE
      FROM KPI_TYPES
     WHERE ID = 101;

    --when the value itself is entered, the results display as intended

    SQL_STMT := 'SELECT DATE, ' || CALC_CLAUSE || ' KPI_VALUE
    FROM DATA_VALUES
    WHERE TYPE_ID = :P_KPI
    GROUP BY DATE';

    RETURN SQL_STMT;
END;

如上所述,当手动输入KPI的ID时,此功能可以正常运行,但我希望此功能是动态的。我有一个选择列表页面项(P_KPI)供用户选择查看的KPI。实际上,它的值是从带有验证的上一页设置的,因此它永远不能为null。

当我更新CALC_CLAUSE条件时:

WHERE ID = :P_KPI

我收到以下错误:

ORA-01403: no data found

如何在函数中引用此页面项?

2 个答案:

答案 0 :(得分:2)

您发布的代码无效(无法编译),并且您给出的解释错误。尽管它是的简化版本,但如果您发布了准确的信息,我还是希望提供。

您说SQL语句是

SELECT DATE, '||CALC_CLAUSE||' KPI_VALUE
FROM DATA_VALUES ...

CALC_CLAUSE看起来像

WHERE ID = :P_KPI

所以整个查询看起来像

SELECT DATE, WHERE ID = :P_KPI KPI_VALUE
FROM DATA_VALUES ...

那根本没有意义。到底CALC_CLAUSE是什么?应该不是AVG(VALUE_1)或类似的东西吗?


:P_KPI项开始,其值似乎为NULL:在屏幕上看到它并不重要-它应处于会话状态。最简单的方法是提交页面,所以-您做到了吗?

尝试创建一个存储的函数(在数据库中,而不在Apex中),并将其P_KPI值作为参数传递。然后测试您得到的结果。使用动态SQL时,最好DBMS_OUTPUT.PUT_LINE生成的语句(在您的示例中为SQL_STMT),将其复制/粘贴到SQL * Plus(或您使用的任何其他工具, (例如SQL Developer),然后查看其是否正常运行。

例如:

CREATE OR REPLACE FUNCTION f_stmt (par_kpi IN NUMBER)
   RETURN VARCHAR2
IS
   sql_stmt      VARCHAR2 (32767);
   calc_clause   VARCHAR2 (4000);
BEGIN
   SELECT calculation
     INTO calc_clause
     FROM kpi_types
    WHERE id = par_kpi;

   sql_stmt :=
         'SELECT DATE, '
      || calc_clause
      || ' KPI_VALUE '
      || ' FROM DATA_VALUES '
      || ' WHERE TYPE_ID = '
      || par_kpi
      || ' GROUP BY DATE';

   DBMS_OUTPUT.put_line (sql_stmt);

   RETURN sql_stmt;
END;

答案 1 :(得分:0)

从Littlefoot建议的存储功能开始,我能够使用此解决方案:

http://vincentdeelen.blogspot.com/2014/02/interactive-report-based-on-dynamic-sql.html

我有一个页面处理,该处理使用动态查询字符串创建一个集合。现在,图表区域SQL可从集合中查询,我可以使用我的所有页面项来适当地过滤数据。