Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 架构名称中包含变量的循环的SQL游标_Oracle_Loops_For Loop_Plsql_Cursor - Fatal编程技术网

Oracle 架构名称中包含变量的循环的SQL游标

Oracle 架构名称中包含变量的循环的SQL游标,oracle,loops,for-loop,plsql,cursor,Oracle,Loops,For Loop,Plsql,Cursor,ORACLE SQL非常新,刚刚发现了循环游标。无法使此基本循环正常工作。我基本上希望使用游标循环从表中检索每行迭代的一些值。我将使用这些检索到的值来创建表和执行其他简单语句 2个问题: 1) 我收到一个错误“PLS-00103:在预期以下情况之一时遇到符号“文件结束”:“我为什么会收到此错误以及如何修复它?” 2) 如何将每行迭代的列值用作变量,以便将它们用作我尝试创建的表名的一部分 我的代码如下: declare cursor c1 is select * from table; begi

ORACLE SQL非常新,刚刚发现了循环游标。无法使此基本循环正常工作。我基本上希望使用游标循环从表中检索每行迭代的一些值。我将使用这些检索到的值来创建表和执行其他简单语句

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;

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


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

如果您想动态创建表,您需要使用动态SQL。然而,在Oracle中,在运行时创建对象是极不寻常的。对于刚刚学习for循环的人来说,分配一个真正受益于动态SQL的任务是极不寻常的。这种组合给我带来了各种各样的危险信号。您能否退一步,解释一下您试图解决的业务问题,以及为什么您认为在循环中动态创建表是正确的技术解决方案?因此,对于正常查询,我完全可以。然而,这是我第一次尝试1)在SQL中使用循环,2)使用变量。这肯定不是我第一次使用for循环或变量。我来自Java和web编程背景,我的想法是用这些语言来实现。业务问题只是在一个sql脚本中根据现有表中的行条目生成x个表。虽然您已经提到了在SQL中执行此操作是多么不寻常,但我可能会用另一种语言来执行此操作。这种语言并不重要(顺便说一句,您在这里使用的是PL/SQL,而不是SQL)——问题是,无论您使用哪种语言,在Oracle中动态创建对象通常都是不受欢迎的。基于不同表中的数据创建大量表的目的是什么?现有表没有那么大,最多可以有15-20行。它不会创建大量的表。通常情况下,我会感兴趣的是为某个客户机生成一个表并以某种方式填充它。该信息存储在现有表中的一行中。但是,如果我想为另一个客户机执行此操作,我必须查看另一行并运行相同的脚本,但使用另一行的信息。非常乏味,所以我宁愿使用循环在单个脚本中同时运行它们。这是可能的吗?尝试了第一种方法,这是我得到的错误信息:关于原因有什么线索吗?PLS-00103:在预期以下情况之一时遇到符号“文件结束”:。(*@%&=-+;at in是mod restinutes而不是rem返回还是!=或~=>=
--/
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;
/
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;
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;