apex_exec.open_query_context 带有绑定变量的 where 子句

问题描述 投票:0回答:1

使用 Oracle Apex apex_data_export.download,where 子句将被忽略。输出显示 OUTPUT 列中每一行的内容。

代码在进程类型执行代码中运行,在区域之后执行。我需要使用 :P0_SUB 的值,它在页面加载之前就有一个值。 where子句是不是错了?进程如何访问:P0_SUB的值?我需要改变执行点吗?

代码

    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;

当我使用以下代码时:

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

我收到以下错误

ORA-00904: "TEST"."USER": invalid identifier

如何才能只获得一行?

oracle-apex
1个回答
0
投票

它位于 APEX_EXEC.OPEN_QUERY_CONTEXT 的文档中,但有点“字里行间”。这些参数类似于具有数据源的顶点页面区域中的参数,例如经典报告。如果源>类型是“表/视图”,则有一个属性“Where Clause”。另一方面,如果“源”>“类型”是“SQL 查询”,则没有“Where 子句”,因为 where 子句只是 sql 查询本身的一部分。文档指出: enter image description here

蓝色部分作为查询类型“TABLE”的参数,红色部分具有查询类型“SQL Query”的参数。当查询类型 =“SQL 查询”时,查询类型“TABLE”的参数将被忽略。这在参数 p_where_clause 的描述中进行了解释。

enter image description here

在您的代码中,使用了参数

p_sql_query
,因此查询类型为“SQL 查询”,这会导致
p_where_clause 
被忽略。

就像在任何 apex 区域源中一样,绑定变量可以包含在 sql 查询中,并将在运行时由 apex 引擎进行解析。在 pl/sql 代码中的任何地方对绑定变量使用串联都不是一个好习惯。

这是工作代码的示例。此示例使用页面项

P75_ENAME
,它具有 before 标头计算。代码需要经过页面处理,无论是预渲染还是提交后。

DECLARE
    l_context         apex_exec.t_context; 
    l_export          apex_data_export.t_export;
BEGIN
    l_context := apex_exec.open_query_context(
        p_location    => apex_exec.c_location_local_db,
        p_sql_query   => 'select * from emp where ename = :P75_ENAME' );
    l_export := apex_data_export.export (
        p_context         => l_context,
        p_format          =>  apex_data_export.c_format_json);

    apex_exec.close( l_context );

    apex_data_export.download( p_export => l_export );
EXCEPTION
    when others THEN
        apex_exec.close( l_context );
        raise;
END;
© www.soinside.com 2019 - 2024. All rights reserved.