首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何动态声明%rowtype?

如何动态声明%rowtype?
EN

Stack Overflow用户
提问于 2016-01-26 20:55:49
回答 5查看 4K关注 0票数 1

下面是示例代码,其中我将所有表名存储在一个表(table_config)中,并尝试将每个表的一条记录插入到其临时表中,并尝试获取特定的行in以备将来需要。

所以我需要每个表行类型来让它工作,一些动态的东西。你能帮我弄一下这个吗?

代码语言:javascript
复制
DECLARE
l_row table_name%ROWTYPE;
l_rowid ROWID;
l_table_name all_tab_partitions.table_name%TYPE;
l_temp_table_name all_tab_partitions.table_name%TYPE;
BEGIN
 FOR tab IN
 (select table_name from
 Table_config)
   LOOP
    l_table_name:= tab.table_name;
    l_temp_table_name:= 'TEMP_'||l_table_name;
    SELECT * INTO l_row
    FROM l_table_name
    WHERE ROWNUM=1;
    INSERT INTO l_temp_table_name VALUES l_row
    RETURNING ROWID INTO l_rowid;
    COMMIT;
   END LOOP;
END; 

谢谢你,普拉迪普

EN

回答 5

Stack Overflow用户

发布于 2016-01-26 21:51:09

而不需要为您编写完整的答案。你为什么不这样做呢?

代码语言:javascript
复制
FOR tab IN
(select table_name from
Table_config)

EXECUTE_IMMEDIATE(
'declare
l_row '||table_name||'%ROWTYPE;
begin
INSERT INTO '||l_temp_table_name
SELECT * FROM '||l_table_name||' WHERE ROWNUM=1;
end;');

EXECUTE_IMMEDIATE ('SELECT ROWID FROM '||l_table_name)
INTO l_rowid;

END LOOP;

  • 它假定目标表一开始是空的,并且在此过程中只插入了一条记录。
票数 1
EN

Stack Overflow用户

发布于 2016-01-26 21:49:38

你不能像OldProgrammer在上面的评论中提到的那样做。

您将不得不使用动态SQL来实现您想要实现的目标。

代码语言:javascript
复制
DECLARE
temp_table VARCHAR2(255);
source_table VARCHAR2(255);
sql_stmt VARCHAR2(255);
CURSOR c1 IS
SELECT table_name FROM user_Tables;
BEGIN
   FOR c1_Rec IN c1 LOOP
      temp_table := 'TEMP_'||c1_rec.table_name;
      source_table := c1_rec.table_name;
      sql_stmt := 'INSERT INTO '||temp_table||' SELECT * FROM '||source_table||' WHERE rownum = 1';
      EXECUTE IMMEDIATE sql_stmt;
   END LOOP;
END;
/
票数 0
EN

Stack Overflow用户

发布于 2016-01-26 21:58:06

下面是解决方案。你要这个机器人做什么?如果没有它,我会简单得多,因为您不能使用returning with insert as select

代码语言:javascript
复制
DECLARE
    l_rowid ROWID;
    l_table_name all_tab_partitions.table_name%TYPE;
    l_temp_table_name all_tab_partitions.table_name%TYPE;
    v_sql1 varchar2(4000);
    v_sql2 varchar2(4000);
    BEGIN
     FOR tab IN (select table_name from Table_config) LOOP
        l_table_name:= tab.table_name;
        l_temp_table_name:= 'TEMP_'||l_table_name;
        v_sql1 := 'select rowid from ' || l_table_name || ' where rownum =1 for update';
        v_sql2 := 'insert into ' || l_temp_table_name  || ' select * from ' || l_table_name || ' where rownum = 1';
        execute immediate v_sql1 into l_rowid;
        execute immediate v_sql2;
        commit;
       END LOOP;
    END; 
    /
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35014356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档