读书人

ORACLE过程

发布时间: 2012-02-08 19:52:21 作者: rapoo

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;

读书人网 >oracle

热点推荐