遍历所有表查询指定值

oracle遍历所有表所有列中的内容  


我这里只写了:知道它对应的字段的值,如果不知道对应的字段,那么会出问题。因为存在类型转换的问题。以下供您参考。
DECLARE
  tab_name   VARCHAR(10);   --表名
  col_name   VARCHAR(10);   --字段名字
  col_values VARCHAR(10);   --字段值
  sqlStr     VARCHAR(500);  --拼写sql
  flag       int;           --判断是否存在
  recCount   int;           -- 记录数
  cursor cur is             --定义游标
    select * from user_col_comments where column_name = 'AAB034';
BEGIN
  recCount   := 0;
  col_values := '654000'; --字段值
  dbms_output.put_line('表名 ' || chr(32) || '字段 ' || chr(32) || '字段值');
  for i in cur loop
    tab_name := i.table_name;
    col_name := i.column_name;
    sqlStr   := 'select count(*)  from  ' || tab_name || ' where AAB034='||
                chr(39) || col_values || chr(39); --chr(39) 为单引号
    execute immediate sqlStr
      into flag;
    if flag > 0 then
      dbms_output.put_line('-----------------------');
      dbms_output.put_line(tab_name || chr(32) || col_name || chr(32) ||
                           col_values);
      recCount := recCount + 1;
    end if;
  end loop;
  dbms_output.put_line(chr(10)||'共有 ' || recCount || ' 条记录');

end;
答案补充
但是你总要知道数据的类型,如果不知道数据类型,只能手动修改了
set serveroutput on size 1000000 ;
游标改为:
cursor cur is 
select * from USER_TAB_COLS where data_type ='VARCHAR2'; --数据的类型
拼写sql 改为:
sqlStr := 'select count(*) from ' || tab_name || ' where '||col_name||'='||chr(39) || col_values || chr(39); 
if 改为:
while  flag > 0 loop
dbms_output.put_line('-----------------------');
dbms_output.put_line(tab_name || chr(32) || col_name || chr(32) ||col_values);
flag := flag - 1;
recCount := recCount + 1;
end loop;


不知道你是写程序用,还是找数据用。写程序的话,一步到位,可能比较复杂! 
下面附一点找数据的较笨的方法!看对你有没有用,以用户SCOTT为例: 
1.dba_tab_columns有某个用户的所以表和列等信息:select table_name,column_name from dba_tab_columns where owner='SCOTT' 
2.查看用户的表所使用的数据类型有哪些:select distinct Data_type from (select * from dba_tab_columns where owner='SCOTT') A 通过查看,就可以知道,文本型有哪些?如:是否有char, varchar2等 
3.创建一个表,用于保留那些表名和字段:CREATE TABLE SCOTT.TCOL(A VARCHAR2(50), B VARCHAR2(50)) 
4.因为SCOTT用户的字段类型较少,下面以找NUMBER类型值为1100的表名与字段在SQLPLUS下运行如下代码(如果数值多的话,可以用 in('NUMBER',...)格式。 

set serveroutput on 
delete from scott.TCOL; 
commit; 

declare 
cursor my_cursor is 
select table_name,column_name from dba_tab_columns where owner='SCOTT' and DATA_TYPE='NUMBER'; 
v_table varchar2(50); 
v_col varchar2(50); 
v_sql varchar2(4000); 
begin 
open my_cursor; 
loop 
fetch my_cursor into v_table,v_col; 
dbms_output.put_line(v_table); 
exit when my_cursor%NOTFOUND; 
v_sql:='Insert into SCOTT.TCOL(A,B) select '||''''|| v_table||''''||','||''''|| v_col||''''||' from SCOTT.'||v_table||' where '||v_col||'=1100'; 
dbms_output.put_line(v_sql); 
EXECUTE IMMEDIATE v_sql; 
commit; 
end loop; 
close my_cursor; 
end; 

5.最后执行select * from scott.tcol,就可以看到结果! 如果有用,自己再整理成一个存储过程.

declare
  m_str varchar2(300);
  m_int int;
begin
  for x in (select *
              from col
             where tname in (select tname from tab where tabtype = 'TABLE' and tname not like 'BIN%')
               and coltype in ('VARCHAR2', 'CHAR')) loop
    m_str := 'select count(*) from ' || x.tname || ' where ' || x.cname ||' like ''zhaogh%'' ';
    execute immediate m_str      into m_int;
--    dbms_output.put_line(m_str);
    if m_int > 0 then
      dbms_output.put_line(x.tname || '.' || x.cname);
    end if;
  end loop;
end;
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 假设你有一个 JavaScript 数组,并且想要倒序遍历它,并删除其中的特定,你可以使用以下代码: ```javascript const arr = [1, 2, 3, 4, 5, 3]; const targetValue = 3; for (let i = arr.length - 1; i >= 0; i--) { if (arr[i] === targetValue) { arr.splice(i, 1); } } console.log(arr); // [1, 2, 4, 5] ``` 首先,我们定义了一个数组 `arr` 和一个变量 `targetValue`,用于存储要删除的。 然后,我们使用一个 `for` 循环来倒序遍历数组 `arr`,并在每个循环中检查当前元素是否等于目标。如果是,则使用 `splice` 方法从数组中删除该元素。 最后,我们输出修改后的数组 `arr`,以检查删除操作是否成功。 注意,在这个实现中,我们使用了 `splice` 方法来删除数组中的元素。这种方法会改变原始数组,因此需要谨慎使用。如果你不想修改原始数组,可以考虑创建一个新的数组来存储删除后的结果。 ### 回答2: 在JavaScript中,可以使用`Array.prototype.reverse()`方法将数组进行倒序排列。然后,可以使用`Array.prototype.forEach()`方法遍历数组,找到并删除指定。 首先,假设我们有一个数组`arr`,要删除的为`target`。 ```javascript let arr = [1, 2, 3, 4, 5, 5, 6]; let target = 5; arr.reverse(); // 将数组倒序 arr.forEach((value, index) => { if (value === target) { arr.splice(index, 1); // 通过splice方法删除指定 } }); arr.reverse(); // 再次将数组倒序,恢复原始顺序 ``` 在上述代码中,首先我们将数组倒序排列,然后使用`forEach`方法遍历数组。在遍历过程中,如果当前等于我们要删除的,我们使用`splice`方法删除该。最后,我们再次将数组倒序排列,以恢复原始的顺序。 请注意,直接在`forEach`循环中使用`splice`会导致数组长度改变,会导致遍历过程中出现跳过元素或者重复遍历元素的情况。为了解决这个问题,我们可以使用倒序遍历的方式。 ### 回答3: 要倒序遍历并删除指定,我们可以采用以下的Javascript代码: ```javascript let arr = [1, 2, 3, 4, 3, 5, 6]; // 假设数组中包含这些 let target = 3; // 要删除的目标 for (let i = arr.length - 1; i >= 0; i--) { // 从数组最后一个元素开始往前遍历 if (arr[i] === target) { // 如果当前元素等于目标 arr.splice(i, 1); // 使用splice方法删除当前元素 } } console.log(arr); // 打印修改后的数组 ``` 在这段代码中,我们首先定义了一个包含了一些的数组`arr`,然后定义了要删除的目标`target`。然后,我们通过一个逆向的`for`循环来遍历数组。 在每次循环中,我们检查当前元素是否等于目标。如果是,我们使用`splice`方法从数组中删除当前元素。`splice`的第一个参数示要删除元素的索引,第二个参数示要删除的元素数量。 最后,我们打印出修改后的数组,即不包含指定的倒序遍历结果。 这样,我们通过倒序遍历并删除指定的方法得到了最终结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值