【问题标题】:how to add a column in a table with a name that is stored in a temporary variable如何在表中添加名称存储在临时变量中的列
【发布时间】:2012-08-24 11:32:50
【问题描述】:

我想在每次循环运行时在表中添加一列。我创建了一个临时变量,它将为循环中的每次迭代采用不同的名称。现在我想在我的表中添加一个同名的列。我试过这样的东西,部分代码显示在oracle sql developer中:

DECLARE V_COUNT VARCHAR (10) := ZIP_COD
BEGIN
ALTER TABLE ABCD 
ADD V_COUNT varchar(10);

update ABCD b
set b.V_COUNT = (select d.ZIP_cod
from ORA_DMSTORE d
where b.id_dmstore = d.id_dmstore);
END;

这显示错误“通常是 PL/SQL 编译错误”。 我不知道如何摆脱它。请帮忙

【问题讨论】:

  • 您使用的是什么数据库产品?
  • 我是在oracle数据库上做的
  • 您为什么要这样做?这听起来像一个可怕的模型。您必须使用动态 SQL 来执行此操作,并且在您需要查询值的任何时候。为什么不使用单独的表格来保存这些值?或者只是加入ora_dmstore,因为您似乎已经拥有id 加入的价值?如果您的目标是隐藏“复杂性”,您可以有这样的看法。

标签: oracle loops plsql alter-table temporary


【解决方案1】:

首先,你不能在PL/SQL中使用ALTER TABLE ..,你必须使用dbms_sqlexecute immediate

而且列名不能以数字开头,因此您需要某种前缀,在我的示例中为 n

所以一种可能的解决方案是:

DECLARE 
 V_COUNT VARCHAR (10) := ZIP_COD;
BEGIN
 EXECUTE IMMEDIATE 'ALTER TABLE ABCD ADD (n'||V_COUNT||' varchar(10))';

 EXECUTE IMMEDIATE '
 update ABCD b 
   set b.n'||V_COUNT||' = (select d.ZIP_cod
                             from ORA_DMSTORE d
                            where b.id_dmstore = d.id_dmstore)
 ';
END;
/

【讨论】:

  • 如果要添加到新列中的值存储在临时变量中怎么办?我会用它作为更新 ABCD b 设置 b.n'||V_COUNT||' = ||临时变量||
  • 或多或少,您缺少引用:set b.n'||V_COUNT||' = '||temp_variable 并注意 temp_variable 的类型转换(即日期到 char 或类似的。在这种情况下最好使用绑定变量:@ 987654328@
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-23
  • 1970-01-01
  • 2016-06-18
  • 2017-09-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多