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

时间:2018-05-18 06:27:47

标签: sql oracle stored-procedures oracle12c

我从我的数据库中获得了以" FULLTEXTLOOKTABLE _%"开头的所有表格。 现在我想循环所有这些表。 从这些表中选择每个记录并将数据存储在4个变量中。 然后删除表中的特定行 使用这4个变量中的数据插入表中。

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

我写的代码是:

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;

2 个答案:

答案 0 :(得分: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;

希望这适合你。

答案 1 :(得分: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;