Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PL/SQL中的where条件下,在新查询中使用IN子句使用INTO创建的动态变量_Sql_Oracle_Plsql - Fatal编程技术网

如何在PL/SQL中的where条件下,在新查询中使用IN子句使用INTO创建的动态变量

如何在PL/SQL中的where条件下,在新查询中使用IN子句使用INTO创建的动态变量,sql,oracle,plsql,Sql,Oracle,Plsql,我从中得到l_过滤器为'016','018','011','014'。现在我想在下面的查询中动态地使用IN子句中的这个l_过滤器值 从网格中选择a、b 其中,l_过滤器中的过滤器_值; 如何在PL/SQL中执行此操作?您可以使用正则表达式: DECLARE l_filter varchar2(100); BEGIN SELECT filter INTO l_filter FROM dashboard WHERE id=TARGET_ID_1; 这不是特别有效,但它不需要任何

我从中得到l_过滤器为'016','018','011','014'。现在我想在下面的查询中动态地使用IN子句中的这个l_过滤器值

从网格中选择a、b 其中,l_过滤器中的过滤器_值; 如何在PL/SQL中执行此操作?

您可以使用正则表达式:

DECLARE
l_filter varchar2(100);

BEGIN
   SELECT filter INTO l_filter
   FROM dashboard
   WHERE id=TARGET_ID_1;
这不是特别有效,但它不需要任何PL/SQL或动态SQL

也就是说,您可能希望将筛选器存储为表中的行,这样您就可以将所有内容连接在一起,而不必复杂化。

使用LIKE:

声明 l_过滤器varchar2100; 当前系统参考光标; 网格。a%类型; b网格。b%类型; 开始 选择过滤器 进入l_过滤器 从仪表板 式中,id=目标_id_1; 开放 选择a、b 来自网格 式中“,”|| SUBSTRl|u filter,2,LENGTHl|u filter-2 | |“,”与“%”类似,“| filter|u value |,%”; 环 把cur带进a,b; 未找到cur%时退出; DBMS_OUTPUT.PUT_LINEa | |','| | b; 端环; 封闭电流; 终止 /
dbfiddle

以下是我如何理解这个问题的

首先是样本数据:

select g.a, g.b
from grid g
where exists (select 1
              from dashboard d.
              where d.id = TARGET_ID_1 and
                    regexp_like(d.filter_value, '^(' || replace(d.filter, '''', ''), ',', '|') || ')$')
             );
返回refcursor的函数;本例中的关键是将筛选值拆分为行,以便将其用作子查询行15-18:

SQL> select * from dashboard;

        ID FILTER
---------- -----------------------
         1 '016','018','011','014'
         2 '111', '222'

SQL> select * from grid;

         A          B FIL
---------- ---------- ---
       100        200 016
       101        201 011
       200        400 xxx

SQL>

谢谢你,戈登。这是一个固定的输出->l_过滤器为'016','018','011','014'。如何将其转换为行格式?有什么建议吗?过滤器总是varchar2的列表吗?在这种情况下,最好将过滤器存储为一个嵌套表或varchar的varray
SQL> create or replace function f_get (target_id_1 in dashboard.id%type)
  2    return sys_refcursor
  3  is
  4    l_filter    varchar2(100);
  5    rc          sys_refcursor;
  6  begin
  7    select filter
  8      into l_filter
  9      from dashboard
 10      where id = target_id_1;
 11
 12    open rc for
 13      select g.a, g.b
 14      from grid g
 15      where g.filter_value in (select regexp_substr(replace(l_filter, chr(39), ''), '[^,]+', 1, level)
 16                               from dual
 17                               connect by level <= regexp_count(l_filter, ',') + 1
 18                              );
 19
 20    return rc;
 21  end;
 22  /

Function created.
SQL> select f_get(1) from dual;

F_GET(1)
--------------------
CURSOR STATEMENT : 1

CURSOR STATEMENT : 1

         A          B
---------- ----------
       100        200
       101        201


SQL>