您的位置:首页 > 数据库 > Oracle

oracle查询一个字符串所在表

2017-01-14 22:07 253 查看
我先建了一个表

create table data_table 

(tablename varchar2(40),

clo varchar2(40),

data varchar2(40),

exe_date date);

declare c varchar2(30);

  begin

  -- Call the procedure

  c :='AAFUNCT110900000066';

  p_data (c);

end;

 

--select count(*) from data_table

 

创建或修改存储过程

create or replace procedure p_data

(

 in_data in varchar2 --输入的参数,就是上边我输入的abc

)

is

--设置变量,你看名字应该基本都能看懂

  v_tablename   varchar2(40);

  v_cloumn_name varchar2(40);

  --v_date_type   varchar2(40);

  v_count     int;

  v_sql       varchar2(2000);

  v_data_type varchar2(40);

  --按照如下条件取出游标,其中USERS是表空间,那个地方你可以改

  cur_data SYS_REFCURSOR;

 

begin--判断是数字

  if Lower(in_data) = Upper(in_data) then

  v_sql :=' select A.TABLE_NAME, A.COLUMN_NAME, A.data_type from USER_TAB_COLUMNS A, TABS B WHERE A.TABLE_NAME = B.TABLE_NAME'

     ||' AND B.tablespace_name like ''NNC_%'' and (A.data_type = ''NUMBER'') ORDER BY A.TABLE_NAME, A.COLUMN_NAME;'; --USERS

  open cur_data for v_sql;--打开游标

  loop

    fetch cur_data

      into v_tablename, v_cloumn_name, v_data_type;

    exit when cur_data%notfound;

    --取出游标里的各个变量,拼成动态sql语句,

  

      if v_data_type = 'NUMBER' then

       v_sql := 'select count(*) from ' || v_tablename || ' where ' || v_cloumn_name || ' = ' ||in_data;

      end if;

    execute immediate v_sql

      into v_count;

    --如果查询出来的条数大于,则将查询中的表名,字段名和输入的内容插入到我建的那个表中

    if v_count > 0 then

      v_sql := 'insert into data_table values (''' || v_tablename ||

              ''',''' || v_cloumn_name || ''',''' || in_data ||

              ''',sysdate)';

      execute immediate v_sql;

      commit;

    end if;

  end loop;

  close cur_data;

  else--不是数字

   v_sql :=' select A.TABLE_NAME, A.COLUMN_NAME, A.data_type from USER_TAB_COLUMNS A, TABS B WHERE A.TABLE_NAME = B.TABLE_NAME'

     ||' AND B.tablespace_name like ''NNC_%'' and (A.data_type = ''VARCHAR2'') ORDER BY A.TABLE_NAME, A.COLUMN_NAME'; --USERS

  open cur_data for v_sql;--打开游标

  loop

    fetch cur_data

      into v_tablename, v_cloumn_name, v_data_type;

    exit when cur_data%notfound;

    --取出游标里的各个变量,拼成动态sql语句,

      if v_data_type = 'VARCHAR2' then

       v_sql := 'select count(*) from ' || v_tablename || ' where instr(' || v_cloumn_name || ',''' || in_data || ''')>0';

      else

       v_sql := 'select count(*) from data_table where 1=2';

      end if;

    execute immediate v_sql into v_count;

    --如果查询出来的条数大于,则将查询中的表名,字段名和输入的内容插入到我建的那个表中

    if v_count > 0 then

      v_sql := 'insert into data_table values (''' || v_tablename || ''',''' || v_cloumn_name || ''',''' || in_data || ''',sysdate)';

      execute immediate v_sql;

      commit;

    end if;

  end loop;

  close cur_data;

  end if;

--end;

end p_data;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐