日期:2014-05-17  浏览次数:20736 次

ORACLE过程求助?


需求:
在某个用户的所有表中增加一个字段:如果表中已经存在这个字段,就跳过;否则增加。

我写的一段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   的东西,可惜这段代码究竟错在何处,真是一筹莫展,希望朋友们帮忙,年前解决,谢谢!

------解决方案--------------------
tmp_sql := 'alter table '||tab_name|| ' add RKRQ DATE NULL ';
------解决方案--------------------
LOOP

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