需求:
在某个用户的所有表中增加一个字段:如果表中已经存在这个字段,就跳过;否则增加。
我写的一段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;