Usando Oracle Apex apex_data_export.download, a cláusula where é ignorada. A saída mostra o conteúdo de cada linha na coluna OUTPUT.
O código é executado em um tipo de processo execute code, execução após regiões. Preciso usar o valor de :P0_SUB que tem um valor antes da página ser carregada. A cláusula where está errada? Como o valor de :P0_SUB é acessado pelo processo? Preciso alterar o ponto de execução?
O código
l_context := apex_exec.open_query_context(
p_location => apex_exec.c_location_local_db,
p_sql_query => 'select output from TFA_USER',
p_where_clause => 'SUB = ' ||:P0_SUB);
l_export := apex_data_export.export (
p_context => l_context,
p_format => apex_data_export.c_format_json,
p_file_name => 'test' );
apex_exec.close( l_context );
apex_data_export.download( p_export => l_export );
EXCEPTION
when others THEN
apex_exec.close( l_context );
raise;
APEX_JSON.free_output;
QUANDO EU USO O SEGUINTE CÓDIGO:
l_context := apex_exec.open_query_context(
p_location => apex_exec.c_location_local_db,
p_sql_query => 'select OUTPUT from TFA_USER where SUB = ' || :P0_SUB);
Recebo o seguinte erro
ORA-00904: "TEST"."USER": invalid identifier
Qual é a maneira de obter apenas uma linha?
Está na documentação de APEX_EXEC.OPEN_QUERY_CONTEXT , mas meio que "entre as linhas". Os parâmetros são semelhantes aos parâmetros em uma região de página apex com uma fonte de dados, como um relatório clássico. Se o Source > Type for "Table/View", há um atributo "Where Clause". Por outro lado, se o Source > Type for "SQL Query", não há "Where Clause", pois a cláusula where seria apenas parte da própria consulta sql. A documentação afirma:
A seção azul tem parâmetros para o tipo de consulta "TABLE" e a seção vermelha tem parâmetros para o tipo de consulta "SQL Query". Os parâmetros para o tipo de consulta "TABLE" são ignorados quando o tipo de consulta = "SQL Query". Isso é explicado na descrição do parâmetro p_where_clause.
No seu código, o parâmetro
p_sql_query
é usado, então o tipo de consulta é "Consulta SQL", o que faz comp_where_clause
que seja ignorado.Assim como em qualquer fonte de região apex, variáveis bind podem ser incluídas na consulta sql e serão analisadas pelo mecanismo apex em tempo de execução. Não é uma boa prática em nenhum lugar do código pl/sql usar concatenação para variáveis bind.
Aqui está um exemplo de código funcional. Este exemplo usa um item de página
P75_ENAME
que tem um cálculo de cabeçalho anterior. O código precisa passar por um processo de página, seja Pré-Renderização ou Após Envio.