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过程 - 选择所有表,然后循环遍历这些表的记录的主要内容,如果未能解决你的问题,请参考以下文章