我正在构建一个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
如何在函数中引用此页面项?
答案 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可从集合中查询,我可以使用我的所有页面项来适当地过滤数据。