游标中的动态SQL

时间:2010-08-21 22:51:05

标签: sql oracle plsql

我的动态sql下面改变一个表&根据查询的输出创建列是错误的。

查询:

DECLARE
   CURSOR c1 is select distinct WP_NO from temp;
   cnum VARCHAR2(255);

BEGIN

  FOR cnum in c1 
  LOOP
    EXECUTE IMMEDIATE 'Alter table temp_col add (:1 varchar2(255))' using cnum;
  END LOOP;  

  COMMIT;

END;

错误:

  

PLS-00457:表达式必须是SQL类型

2 个答案:

答案 0 :(得分:4)

这是因为bind variables are not allowed in DDL statements

考虑在不使用绑定变量的情况下尝试:

DECLARE
  CURSOR c1 is select distinct WP_NO from temp;
  cnum VARCHAR2(255);
BEGIN
  FOR cnum in c1 
  LOOP
    EXECUTE IMMEDIATE 'Alter table temp_col add ('|| cnum ||' varchar2(255))';
  END LOOP;  

  COMMIT;
END;

答案 1 :(得分:-1)

您与 cnum 符号存在冲突,您可以将其用作局部变量和游标的当前行。

你可能想要这个:

DECLARE
   CURSOR c1 is select distinct WP_NO from temp;

BEGIN

  FOR current_row in c1 
  LOOP
    EXECUTE IMMEDIATE 'Alter table temp_col add (:1 varchar2(255))' using current_row.WP_NO;
  END LOOP;  

  COMMIT;

END;

如您所见,您无需声明在for循环中使用的 current_row 变量。