当前位置: 首页 > 知识库问答 >
问题:

如何使用变量在动态查询中指定IN子句?

柳涵映
2023-03-14

在PL/SQL中,可以使用连接指定In运算符的值:

v_sql := 'select field1
from table1
where field2 in (' || v_list || ')';

是否可以使用变量执行相同的操作?

v_sql := 'select field1
from table1
where field2 in (:v_list)'; 

如果是这样,如何?

编辑:参考Marcin的回答,我如何从结果表中选择?

declare

cursor c_get_csv_as_tables is
select in_list(food_list) food_list
from emp_food
where emp_type = 'PERM';

cursor c_get_food_list (v_food_table varchar2Table)is
select *
from v_food_table;

begin
    for i in c_get_csv_as_tables loop
        for j in c_get_food_list(i.food_list) loop
            dbms_output.put_line(j.element);
        end loop;
    end loop;
end;

我得到以下错误:

ORA-06550: line 10, column 6:
PL/SQL: ORA-00942: table or view does not exist
ORA-06550: line 9, column 1:
PL/SQL: SQL Statement ignored
ORA-06550: line 15, column 34:
PLS-00364: loop index variable 'J' use is invalid
ORA-06550: line 15, column 13:
PL/SQL: Statement ignored

共有3个答案

公良修竹
2023-03-14

绑定变量可以在 Oracle SQL 查询中使用“in”子句。

10g有效;我不知道其他版本。

绑定变量为varchar,最多4000个字符。

示例:绑定包含逗号分隔值列表的变量,例如。

: bindvar=1,2,3,4,5

select * from mytable
  where myfield in
    (
      SELECT regexp_substr(:bindvar,'[^,]+', 1, level) items
      FROM dual
      CONNECT BY regexp_substr(:bindvar, '[^,]+', 1, level) is not null
    );
高弘光
2023-03-14

不幸的是,不能像这样绑定列表,但是可以使用表函数。读这个

下面是一个基于您的代码的用法示例:

declare

cursor c_get_csv_as_tables is
select in_list(food_list) food_list
from emp_food
where emp_type = 'PERM';

cursor c_get_food_list (v_food_table varchar2Table)is
select column_value food
from TABLE(v_food_table);

begin
    for i in c_get_csv_as_tables loop
        for j in c_get_food_list(i.food_list) loop
            dbms_output.put_line(j.food);
        end loop;
    end loop;
end;

我在这里使用了column_value伪列

傅阳
2023-03-14

像在@Sathya link中,你可以绑定varray(我举了@科多的例子):

CREATE OR REPLACE TYPE str_tab_type IS VARRAY(10) OF VARCHAR2(200);
/
DECLARE
  l_str_tab str_tab_type;
  l_count NUMBER;
  v_sql varchar2(3000);
BEGIN
  l_str_tab := str_tab_type();
  l_str_tab.extend(2);
  l_str_tab(1) := 'TABLE';
  l_str_tab(2) := 'INDEX';

  v_sql := 'SELECT COUNT(*) FROM all_objects WHERE object_type IN (SELECT COLUMN_VALUE FROM TABLE(:v_list))';

  execute immediate v_sql into l_count using l_str_tab;

  dbms_output.put_line(l_count);
END;
/

更新:第一个命令可以替换为:

CREATE OR REPLACE TYPE str_tab_type IS TABLE OF VARCHAR2(200);
    /

然后打电话:

l_str_tab.extend(1);

当你添加一个值时

 类似资料:
  • 问题内容: 我想使用表变量而不是临时表,但是我的主要查询构造是动态的。动态查询用单引号引起来,所以我该如何从@TableVariable中获取数据。我不想删除动态查询,因为稍后会添加一些参数。 例如,以下是错误代码,其中我已将表变量写入动态查询中..... 在这方面帮助我。 提前致谢。 问题答案: 试试这个 :

  • 我有一个apollo包装的组件,它应该为我的组件提供来自github graphql v4 api的响应数据。我打算使用应用程序另一部分的字符串(SEARCH\u QUERY)来用于我的gql查询,但github不断返回未定义的字符串。我在关注阿波罗官方文件http://dev.apollodata.com/react/queries.html#graphql-选项。我看不出我做错了什么。 这个没

  • 问题内容: 为什么以下SQL不能给我任何东西 虽然 吸引我的行 问题答案: 您可以根据需要执行一些动态SQL,但我认为这并不是真正的竞争。

  • 问题内容: 如何动态传递变量参数 TypeError:必须为str,而不是int 尽管我转换为字符串有任何想法,但遇到了以上错误? 有没有其他的方式来传递参数? 问题答案: 通过通过关键字arguments提供参数来使用参数化sql 。数据库适配器将为您完成参数的正确引用,并且代码将较不容易受到SQL注入攻击。(有关不正确引用的非参数化sql可能引起您的麻烦的类型,请参阅Little Bobby

  • 问题内容: 有没有办法从mySQL的子查询中指定父查询字段? 例如: 我已经用PHP编写了一个基本的公告板类型程序。 在数据库中,每个帖子都包含:id(PK)和parent_id(父帖子的ID)。如果帖子本身是父项,则其parent_id设置为0。 我正在尝试编写一个mySQL查询,该查询将查找每个父级帖子以及父级拥有的子级数。 棘手的是,第一个 ID 不知道它应该引用子查询之外的第二个 ID 。

  • 问题内容: 我有一个html表,可将mySQL数据库表中的所有内容加载。我有与该mySQL表的列相关的下拉菜单-当用户选择下拉菜单之一时,它将使用AJAX查询数据库。 我需要弄清楚如何动态构建查询,因为有时下拉列表将为空(即,它们不想按该列进行过滤)。 做这个的最好方式是什么? 目前我有这样的事情: 您可以想象这是行不通的,因为如果这些字段中的任何一个为空,查询都会失败(或者不返回任何内容)。 显