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

问题描述 投票:0回答:2

我从我的数据库中获取了所有以“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;
sql oracle stored-procedures oracle12c
2个回答
0
投票

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

创建一个新表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;

希望这对你有用。


0
投票

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

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;
© www.soinside.com 2019 - 2024. All rights reserved.