Код, который вы опубликовали, недействителен (не компилируется), а приведенное вами объяснение неверно. Хотя это упрощенная версия , я бы предпочел, чтобы вы опубликовали точную информацию.
Вы сказали, что оператор 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;