SQL游标FOR循环,带有模式名称中的/变量

时间:2014-10-21 19:55:48

标签: oracle loops for-loop plsql cursor

ORACLE SQL非常新,刚刚发现了Cursor FOR LOOP。无法使这个基本循环工作。我基本上想要使用游标循环从表中检索每行迭代的一些值。我将使用这些检索的值来创建表并执行其他简单的语句。

2个问题:

1)当出现以下情况之一时,我收到错误“PLS-00103:遇到符号”文件结束“:;”为什么我会收到此错误以及如何解决?

2)如何将每行迭代的列值用作变量,因此我可以将它们用作我尝试创建的表名的一部分?

我的代码如下:

declare
cursor c1 is
select *
from table;

begin

for row in c1 loop

create table table.$row.column <---Wrong syntax I know. I don't know how to put this in a variable

end loop;
end;

编辑:这是我正在运行的实际代码:

--/
begin

for a_group in (select groupid
from ent_merged_20141007.group_metadata)

loop

execute immediate 'CREATE TABLE' || a_group.groupid || 'REST OF STATEMENT HERE';

end loop;
end;
/

1 个答案:

答案 0 :(得分:2)

从技术上讲,你可以做这样的事情(我使用隐式游标循环而不是显式游标循环只是为了代码简洁和个人偏好 - 你可以使用显式游标做同样的事情)。

BEGIN
  FOR t IN (SELECT table_name
              FROM some_table)
  LOOP
    EXECUTE IMMEDIATE 'CREATE TABLE ' || t.table_name || ' <<add the rest of your DDL>>';
  END LOOP;
END;

您可以在VARCHAR2变量中构建DDL语句并执行该语句

DECLARE
  l_sql_stmt VARCHAR2(32000);
BEGIN
  FOR t IN (SELECT table_name
              FROM some_table)
  LOOP
    l_sql_stmt := 'CREATE TABLE ' || t.table_name || '  <<add the rest of your DDL>>';
    EXECUTE IMMEDIATE l_sql_stmt;
  END LOOP;
END;

也就是说,在Oracle中,动态创建对象通常是不受欢迎的。您确实希望在安装应用程序的时间点修复架构中的对象集。带有元数据的表可以告诉应用程序动态构建其他表,这通常是一种不受欢迎的体系结构。如果要为不同的客户端构建不同的表,我强烈建议构建一个带有client_id列的表(可能具有适当的VPD策略),或者至少为每个客户端创建单独的模式。

相关问题