gpt4 book ai didi

oracle - 如何创建 "dynamic"WHERE 子句?

转载 作者:行者123 更新时间:2023-12-04 17:13:36 26 4
gpt4 key购买 nike

第一:谢谢!

我完成了我的另一个项目和一个大惊喜:现在一切正常:-)
感谢一些对 SO 有帮助的思想家!

所以我在这里进行下一个项目。

我想得到这样的东西:

SELECT * FROM tablename WHERE field1=content AND field2=content2 ...

正如您所注意到的,这可能是一个很长的 where 子句。
tablename 是一个不会改变的静态属性。 field1 , field2 , ... (!) 并且内容可以更改。

所以我需要一个选项来在递归函数中在 PL/SQL 中构建 SQL 语句。
我真的不知道要搜索什么,所以我在这里要求链接甚至要搜索的单词..

请不要开始争论递归函数是否真的需要或它的缺点 - 这是 不是 有问题;-)

如果你能帮助我创建一个类似 SQL-String 的东西,它稍后将能够成功地进行 SELECT,这将是非常好的!

我能够通过递归函数并每次制作更长的字符串,但我无法从中制作 SQL 语句..

哦,还有一件事:
我通过 xmlType(xmldom.domdocument 等)获取字段和内容我可以从 xmltype 获取字段和内容,例如在 clob 中

最佳答案

目的是从 WHERE 子句中的可变数量的过滤器中动态组装一条语句。我不确定递归适合所有这些,所以我将只使用一个数组来处理参数:

SQL> create type qry_param as object
2 (col_name varchar2(30)
3 , col_value varchar(20))
4 /

Type created.

SQL> create type qry_params as table of qry_param
2 /

Type created.

SQL>

该表被传递给一个函数,该函数围绕数组循环。对于数组中的每个条目,它以 = ' ' 的格式将一行附加到 WHERE 子句。可能您需要更复杂的过滤——不同的运算符、显式数据类型转换、绑定(bind)变量——但这是一般的想法。
SQL> create or replace function get_emps
2 (p_args in qry_params )
3 return sys_refcursor
4 as
5 stmt varchar2(32767);
6 rc sys_refcursor;
7 begin
8 stmt := ' select * from emp';
9 for i in p_args.first()..p_args.last()
10 loop
11 if i = 1 then
12 stmt := stmt || ' where ';
13 else
14 stmt := stmt || ' and ';
15 end if;
16 stmt := stmt || p_args(i).col_name
17 ||' = '''||p_args(i).col_value||'''';
18 end loop;
19 open rc for stmt;
20 return rc;
21 end get_emps;
22 /

Function created.

SQL>

最后,为了执行这个查询,我们需要填充一个数组类型的局部变量并将结果返回给一个引用游标。
SQL> var l_rc refcursor
SQL> declare
2 l_args qry_params := qry_params
3 (qry_param('DEPTNO', '50')
4 , qry_param('HIREDATE', '23-MAR-2010'));
5 begin
6 :l_rc := get_emps(l_args);
7 end;
8 /

PL/SQL procedure successfully completed.


SQL> print l_rc

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
8041 FEUERSTEIN PLUMBER 7839 23-MAR-10 4250 50
8040 VERREYNNE PLUMBER 7839 23-MAR-10 4500 50

SQL>

编辑

在他们问题的最后一段中,OP 说他们正在使用 XML 来通过标准。此要求不会显着改变我最初实现的形式。循环只需要驱动一个 XPath 查询而不是一个数组:
SQL> create or replace function get_emps
2 (p_args in xmltype )
3 return sys_refcursor
4 as
5 stmt varchar2(32767);
6 rc sys_refcursor;
7 begin
8 stmt := ' select * from emp';
9 for i in (select * from xmltable (
10 '/params/param'
11 passing p_args
12 columns
13 position for ordinality
14 , col_name varchar2(30) path '/param/col_name'
15 , col_value varchar2(30) path '/param/col_value'
16 )
17 )
18 loop
19 if i.position = 1 then
20 stmt := stmt || ' where ';
21 else
22 stmt := stmt || ' and ';
23 end if;
24 stmt := stmt || i.col_name
25 ||' = '''||i.col_value||'''';
26 end loop;
27 open rc for stmt;
28 return rc;
29 end get_emps;
30 /

Function created.

SQL>

可以看出,这个版本返回的结果和以前一样……
SQL> var l_rc refcursor
SQL> declare
2 l_args xmltype := xmltype
3 ('<params>
4 <param>
5 <col_name>DEPTNO</col_name>
6 <col_value>50</col_value>
7 </param>
8 <param>
9 <col_name>HIREDATE</col_name>
10 <col_value>23-MAR-2010</col_value>
11 </param>
12 </params>');
13 begin
14 :l_rc := get_emps(l_args);
15 end;
16 /

PL/SQL procedure successfully completed.

SQL> print l_rc

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
8041 FEUERSTEIN PLUMBER 7839 23-MAR-10 4250 50
8040 VERREYNNE PLUMBER 7839 23-MAR-10 4500 50

SQL>

关于oracle - 如何创建 "dynamic"WHERE 子句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2514254/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com