如何在DB2中执行SQL匿名块?

时间:2017-02-16 21:04:11

标签: sql oracle plsql db2 db2-luw

我想通过其数据包含'ABC'的列的模式进行搜索。在Oracle PL / SQL中,我会这样做:

DECLARE
  v_cnt integer;
BEGIN

  for i in (select tabname, colname
              from all_tab_cols --syscat.columns
             where tabschema = 'DATA'
          order by tabname, colname)
  loop 

    execute immediate '
    select count(1)
    from '||i.tabname||'
    where upper('||i.colname||') like ''%ABC%''' into v_cnt;

    if v_cnt > 0 then 
      dbms_output.put_line(i.tabname||' - '||i.colname)
    end if;

  end loop;

END;

但它位于DB2数据库中。我尝试在线搜索正确的语法,但我找不到它。 syscat.columns是all_tab_cols的oracle等价物,所以我只需要DB2中的anonoymous SQL块的正确语法。

有人会帮我解释语法吗?

2 个答案:

答案 0 :(得分:0)

首先,DB2 for LUW提供 Oracle兼容模式 - 如果为您的数据库实例启用了它,您可以直接使用Oracle PL / SQL语法,它将起作用,包括对{的引用{1}}。

如果未启用Oracle兼容性,那么DB2 SQL PL语法会有所不同。具体来说,all_tab_columns DECLARE块内部,您需要BEGIN ... END存储过程CALL。其他一切应该可以正常工作。

有关compound SQL syntax的更多信息。

答案 1 :(得分:0)

尝试这样的事情,谁知道:

BEGIN ATOMIC
DECLARE v_cnt integer;
DECLARE text VARCHAR(128);
DECLARE stmt STATEMENT;

  for i as (select tabname, colname
              from all_tab_cols --syscat.columns
             where tabschema = 'DATA'
          order by tabname, colname)
  do 


--According to Graeme Birchall this shouldn't work  
--        execute immediate '
--        select count(1)
--        from '||i.tabname||'
--        where upper('||i.colname||') like ''%ABC%''' into v_cnt;
-- db2 maybe more verbose:

   set text = 'select count(1) from '||i.tabname||' where upper('||i.colname||') like ''%ABC%''';

PREPARE stmt FROM text;
EXECUTE stmt INTO v_cnt;

        if v_cnt > 0 then 
          dbms_output.put_line(i.tabname||' - '||i.colname)
        end if;

      end for;

    END;