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

Posted

技术标签:

【中文标题】SQL 游标 FOR 循环,模式名称中带有 / 变量【英文标题】:SQL Cursor FOR Loop w/ variables in schema name 【发布时间】:2014-10-21 19:55:48 【问题描述】:

对 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;
/

【问题讨论】:

如果要动态创建表,则需要使用动态 SQL。然而,在 Oracle 中,在运行时创建对象是极不寻常的。对于刚刚学习 for 循环的人来说,分配一个真正受益于动态 SQL 的任务是非常不寻常的。这种组合给我带来了各种各样的危险信号。您能后退一步,解释一下您要解决的业务问题,以及为什么您认为在循环中动态创建表是正确的技术解决方案吗? 所以当涉及到正常查询时,我完全没问题。然而,这是我第一次尝试 1) 在 SQL 中使用循环,2) 使用变量。这当然不是我第一次使用 for 循环或一般变量。我来自 Java 和 Web 编程背景,我本来想用这些语言来做这件事。 业务问题只是在一个sql脚本中根据现有表中的行条目生成x#表。虽然现在你已经提到用 SQL 做是多么不寻常,但我可能会用另一种语言来做 语言无关紧要(顺便说一下,您在这里使用的是 PL/SQL,而不是 SQL)——问题在于,无论您使用哪种语言,在 Oracle 中动态创建对象通常都令人不悦。重新使用。根据不同表中的数据创建大量表的目的是什么? 现有表没有那么大,可能最多 15-20 行。它不会创建大量表。通常会发生的是我有兴趣为某个客户生成一个表格并以某种方式填充它。该信息存储在现有表中的一行中。但是,如果我想为另一个客户做这件事,我必须查看另一行并运行相同的脚本,但使用另一行的信息。非常乏味,所以我宁愿使用循环在单个脚本中一次运行它们。这可能吗? 【参考方案1】:

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

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 策略),或者至少为每个客户端创建单独的架构。

【讨论】:

尝试了第一种方法,这是我得到的错误信息:关于为什么的任何线索? PLS-00103:在预期以下情况之一时遇到符号“文件结尾”:. ( * @ % & = - + ; at in is mod 余数 not rem return 返回 or != or ~= >= and or like like2 like4 likec between使用 || 批量成员子集

以上是关于SQL 游标 FOR 循环,模式名称中带有 / 变量的主要内容,如果未能解决你的问题,请参考以下文章

sqlserver中怎样使用游标for循环

sqlserver中怎样使用游标for循环

使用 FETCH 的 PL/SQL 游标 FOR 循环

sql 游标如何循环

SQL 中循环for循环游标

SQL中的循环for循环游标