表table1(id,name1)
表table2(id,name2)在增加表table1中一条记录的时候,根据生成的ID,同时在表table2中增加一列,列前加'A'标志。我写了触发器出错。帮忙分析一下:
由于我的columnname是动态的,所以要用到变量,目前我用固定的变量测试都会出错的。
-------------------------------------------------------------------------------
最初的写法:
BEGIN
  if new.id is not null then
     alter table table2 add column 'A'+new.id NUMERIC(10,2);
  end if;  RETURN NULL;
END;
-------------------------------------------------------------------------------
后来的写法:
DECLARE
       columnname varchar;
BEGIN
    columnname:='1';
  if new.id is not null then
     alter table table2 add column columnname NUMERIC(10,2);
  end if;  RETURN NULL;
END;-------------------------------------------------------------------------------
都要出错??? 无法编译过去,但是用固定的一个列名是可以的,是否不能用变量???

解决方案 »

  1.   

    对象名不能用变量.
    需动态构造SQL语句
    S_SQL:='alter table table2 add column'||columnname||'NUMERIC(10,2)';
    EXECUTE S_SQL;
      

  2.   

    这种要求一般要求动态执行SQL语句,用字符串累加得到SQL语句,
    EXEC SQL END DECLARE SECTION;
    stmt:='alter table table2 add column'||columnname||'NUMERIC(10,2)';
    EXEC SQL PREPARE mystmt FROM :stmt;
     ...
    EXEC SQL EXECUTE mystm
    EXEC SQL DEALLOCATE PREPARE mystm;
    类似MYSQL的PREPARE、EXECUTE
      

  3.   

    刚才的问题参照上面已经解决了,但是又出现一个类似的问题,同样是在构造sql语句,然后执行,出现如下提示:
    ERROR: EXECUTE of SELECT ... INTO is not implemented yet
    我查了一下,但是E文不是很好,看得有些糊涂,帮解释下 http://archives.postgresql.org/pgsql-bugs/2008-05/msg00215.php就是说用构造的语句来执行下面的语句会出错,是版本原因?无法升级的情况下,有解决办法么?
    S_SQL:='select count(*) into ...';
    EXECUTE S_SQL;这是我的语句:
    DECLARE
           S_SQL varchar;
           A_SQL varchar;
           p_count integer;
           columnname varchar;
    BEGIN
        /* New function body */
      p_count:=0;
      if old.id is not null then
         columnname:='A'||old.id;
         S_SQL:='select count(*) into p_count from rlzy.tb_salary_detail where ' || columnname ||' is not null limit 1;';
         --raise exception 'S_SQL';
         EXECUTE S_SQL;
         if (p_count>0) then
            A_SQL:='alter table rlzy.tb_salary_detail drop column' || columnname || ';';
            EXECUTE A_SQL;
         end if;
      end if;  RETURN old;
    END;
      

  4.   

    你的版本还不支持SELECT ... INTO
      

  5.   

    那怎么处理?有动态执行SQL语句的简单例子么?
      

  6.   

    怎么处理?有动态执行SQL语句的简单例子么?
    2楼的就是只有用游标了,
    S_SQL:='select * from rlzy.tb_salary_detail where ' || columnname ||' is not null limit 1;';
    用游标打开记录集,判断是否有记录