需求:
在某个用户的所有表中增加一个字段:如果表中已经存在这个字段,就跳过;否则增加。我写的一段PL SQL代码:注意:CREATE OR REPLACE  PROCEDURE "ADD_DATETIME" 
(user_name IN VARCHAR2)
AS
    tmp_sql  VARCHAR(100);
tab_name VARCHAR(64);
CURSOR records_cursor IS 
SELECT table_name FROM all_tables WHERE owner=user_name;
fields records_cursor%ROWTYPE;



BEGIN
FOR fields IN records_cursor 
LOOP tab_name := fields.table_name;
tmp_sql  := 'alter table '||tab_name||' add RKRQ DATE NULL;';
/*此处由于PL SQL的规矩不是很懂,暂时把条件都注释掉了
if( not exists(select * from all_tab_columns where OWNER=owner_name and TABLE_NAME=tab_name and COLUMN_NAME='RKRQ'))
then
   tab_name := '';
   
   */ execute immediate tmp_sql;

/*end if; */
END LOOP;

commit;
END;



以上代码编译通过了,就是无法运行,运行时候就是弹出信息:
SQL> execute ADD_DATETIME('DEMO');ERROR 位于第 1 行:
ORA-00911: 无效字符
ORA-06512: 在"DEMO.ADD_DATETIME", line 23
ORA-06512: 在line 1
注意行号就是在execute immediate tmp_sql;
最近几天都在恶补Oracle 的东西,可惜这段代码究竟错在何处,真是一筹莫展,希望朋友们帮忙,年前解决,谢谢!

解决方案 »

  1.   

    tmp_sql  := 'alter table '||tab_name||' add RKRQ DATE NULL';
      

  2.   

    谢谢bobfang!您的意思是最后的那个分号不要?刚试过了,问题依旧。
      

  3.   

    LOOPtab_name := fields.table_name;
    tmp_sql  := 'alter table '||tab_name||' add RKRQ DATE NULL';
    dbms_output.put_line (tmp_sql);
    --看看tmp_sql的具体值,然后直接把tmp_sql的具体值拷贝出来,单独执行是否还有问题?
      

  4.   

    出错的ORA-00911  ORA-06512 解决了,请问条件如何设置呢?
    就是要筛选掉已经存在字段的表:/*此处由于PL SQL的规矩不是很懂,暂时把条件都注释掉了*/
    if( not exists(select * from all_tab_columns where OWNER=owner_name and                                                                                            TABLE_NAME=tab_name and COLUMN_NAME='RKRQ'))
    then
        execute immediate tmp_sql;
    end if;上面这个写好像不能使用
      

  5.   

    declare v_A integer;
    begin
       select count(*) into v_i from user_tab_columns where table_name=表名
      and column_name=列名;
      if v_i<=0 then
       增加列
    end if;
    end;
      

  6.   

    to bobfang(匆匆过客)、icedut(冰):
    你们眼力过人,这个问题就在这里,至于为何还报错,是因为已经有部分表中间已经存在 RKRQ 这个字段了,多谢二位!to yuyu1980() :
    这2个都是可以用的。如果可以,希望能帮忙解决上面的条件问题,谢谢
    我有个思路:想把条件判断放在过程之外,这样就不会
    PLS-00204:EXISTS只能在SQL语句中使用
    的错误提示了
      

  7.   

    select count(*) into v_count from all_tab_columns where OWNER=owner_name and TABLE_NAME=tab_name and COLUMN_NAME='RKRQ'
    if v_count= 0 then
        execute immediate tmp_sql;
    end if;
      

  8.   

    oracle 里面不能用EXISTS要select count(*) into v_i from user_tab_columns where table_name=表名
      and column_name=列名;
    判断一下是否存在
    不存在着增加
      

  9.   

    祝icedut(冰) 、yuyu1980()、bobfang(匆匆过客) 
    新年愉快!