【问题标题】:Comma separated values to IN function in oracleoracle中IN函数的逗号分隔值
【发布时间】:2016-06-16 22:44:25
【问题描述】:

我正在尝试执行以下查询,但没有得到任何结果。

有人能告诉我我做错了什么吗?

DECLARE
  object_types VARCHAR2(200);
  v_object_types VARCHAR2(200);
  l_count number;
BEGIN
  object_types :='TABLE,VIEW';
  select ''''||regexp_replace(object_types, '( )*(,)( )*',''',''')||''''  
         into v_object_types from dual;
  dbms_output.put_line(to_char(v_object_types));
  SELECT count(*) into l_count
    FROM all_objects o where o.object_type IN ('||v_object_types||');
  dbms_output.put_line(l_count);

END;

【问题讨论】:

  • 您期待什么结果?请阅读How-to-Ask 这里是START 了解如何提高问题质量并获得更好答案的好地方。
  • 它返回计数为 0,而不是所有表和视图计数。
  • 它正在寻找 '||v_object_types||' 的文字字符串,你期望什么?

标签: oracle


【解决方案1】:
 WHERE variable IN (1,2,3) 

与您现在发送的不同

 WHERE variable IN ('1,2,3')  or
 WHERE variable IN ('||v_object_types||')

【讨论】:

【解决方案2】:

您正在尝试动态构建 SQL,但您在 IN 子句中使用了单个字符串文字 '||v_object_types||'

您可以使用集合来做到这一点:

Oracle 设置

CREATE TYPE stringlist IS TABLE OF VARCHAR2(200);
/

PL/SQL

DECLARE
  object_types   VARCHAR2(200) := 'TABLE,VIEW';
  v_object_types stringlist;
BEGIN
  SELECT TRIM( BOTH FROM REGEXP_SUBSTR( object_types, '[^,]+', 1, LEVEL ) )
  BULK COLLECT INTO v_object_types
  FROM   DUAL
  CONNECT BY LEVEL <= REGEXP_COUNT( object_types, '[^,]+' );

  FOR i IN 1 .. v_object_types.COUNT LOOP
    dbms_output.put_line( v_object_types(i) );
  END LOOP;

  SELECT count(*)
  INTO   l_count
  FROM   all_objects
  WHERE  object_type MEMBER OF v_object_types;

  dbms_output.put_line(l_count);
END;
/

或使用动态sql:

DECLARE
  object_types   VARCHAR2(200) := 'TABLE,VIEW';
  v_sql          VARCHAR2(200);
  l_count        INTEGER;
BEGIN
  v_sql := 'SELECT count(*) FROM all_objects WHERE  object_type IN ('
             || REGEXP_REPLACE( object_types, ' *(.+?) *(,|$)', '''\1''\2' )
             || ')';

  EXECUTE IMMEDIATE v_sql INTO l_count;

  dbms_output.put_line(l_count);
END;
/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-04
    • 2015-04-01
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-25
    相关资源
    最近更新 更多