oracle 如何在现有查询的where子句中追加查询

xzabzqsa  于 2023-06-29  发布在  Oracle
关注(0)|答案(1)|浏览(127)

在Oracle表单中,我有一个查询,就像

if po_no is not null then
    str := str ||'and po_no = '||:block.po_no;
end if;

现在我想在下面的查询中添加字符串。

select po_no
   from po,
        po_det
   where po_id = p_det_id
      &str

我想在查询结束后追加字符串,但它给出了ORA-01722错误..我怎么能以正确的方式做..

pbpqsu0x

pbpqsu0x1#

str连接到查询的其余部分。
注意前导空间(AND前面):

if po_no is not null then
   str := str ||' and po_no = ' || :block.po_no;
end if;

select po_no
from po, po_det
where po_id = p_det_id || str;

你没有解释你将在哪里使用 * 动态WHERE子句 *;如果要筛选从数据块中提取的行,请考虑使用SET_BLOCK_PROPERTY内置及其ONETIME_WHERE(或DEFAULT_WHERE)属性(在Oracle Online Help system中了解有关它的详细信息)。

[编辑]

我仍然不确定这个查询中的内容是什么,但是-对我来说-看起来好像你根本不需要IF,但是使用看起来像这样的查询:

select po_no
  into v_po_no
  from po, po_det
  where po_id = p_det_id
    and (po_no = :block.po_no or po_no is null);     --> this substitutes your IF

再一次:对我来说,不清楚po_no到底是什么(列?块字段?变量?),但这或多或少是您可能需要做的。

[编辑#2]

动态SQL:

declare
  str    varchar2(500);
  result number;
begin
  str := 'select po_no from po, po_det where po_id = p_det_id ' ||
         case when po_no is not null then ' and po_no = :a'
         end;
         
  execute immediate str into result using :block.po_no;
end;

相关问题