Oracle过程 - 选择所有表,然后循环遍历这些表的记录

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle过程 - 选择所有表,然后循环遍历这些表的记录相关的知识,希望对你有一定的参考价值。

我从我的数据库中获取了所有以“FULLTEXTLOOKTABLE_%”开头的表。现在我想循环所有这些表。从这些表中选择每个记录并将数据存储在4个变量中。然后使用这4个变量中的数据删除表中的特定行Insert into table。

我想这样做是因为列中的数据插入不匹配,我不能改变列名,所以我必须正确地截断表重新插入。

我写的代码到现在为止:

create or replace PROCEDURE "Update"(name_in IN varchar2 )
AS 
  iID       NUMBER(10,0); 
  FullTextDetails     VARCHAR2(4000 BYTE); 
  Regex VARCHAR2(4000 BYTE); 
  MinMatch   NUMBER(10,0); 
BEGIN
  FOR c IN ( SELECT table_name FROM user_tables WHERE table_name LIKE 'FULLTEXTLOOKTABLE_%' )
  LOOP
    // Loop Throgh all records of c.table_name
    // insert the data into iID, FullTextDetails,Regex,MinMatch
    //Delete that row 
    //Insert it again using the data in variables
  END LOOP;
END;
答案

您可以在表级执行此操作,而不是逐个记录处理。

创建一个新表tab_dest,其结构与源表tab_src相同,包括如下数据 -

CREATE TABLE TAB_DEST AS
SELECT * FROM TAB_SRC;

将源表截断为 -

TRUNCATE TABLE TAB_SRC;

将记录从TAB_DEST插回到TAB_SRC,指定列顺序 -

INSERT INTO TAB_SRC(COL1, COL2, COL3)
SELECT COL1, COL3 AS COL2, COL2 AS COL3
FROM TAB_DEST;

希望这对你有用。

另一答案

你可以尝试这样的东西,但是这样,你需要创建一个返回引用光标的过程

create or replace PROCEDURE "Update"(name_in IN varchar2 )
AS 
  iID       NUMBER(10,0); 
  FullTextDetails     VARCHAR2(4000 BYTE); 
  Regex VARCHAR2(4000 BYTE); 
  MinMatch   NUMBER(10,0); 
  TYPE cur_type IS REF CURSOR;
  tmp_cursor cur_type;
BEGIN
  FOR c IN ( SELECT table_name FROM user_tables WHERE table_name LIKE 'FULLTEXTLOOKTABLE_%' )
  LOOP
    tmp_cursor := prc_that_returns_ref_cursor(table_name);
    //Delete the data from table
    FOR tmp_cursor_rec IN tmp_cursor LOOP
        //Insert it again using the data in tmp_cursor_rec.column name
    END LOOP;
END;

以上是关于Oracle过程 - 选择所有表,然后循环遍历这些表的记录的主要内容,如果未能解决你的问题,请参考以下文章

如何循环遍历表的所有行? (MySQL)

来自异常块 Oracle 的控制循环语句

循环遍历表和字段列表并混合它们

MySQL存储过程循环遍历变量并插入临时表

Oracle 存储过程 - 创建游标后我可以清空临时表吗

oracle spatial 空间查询时要遍历所有表么?