需求:
在某个用户的所有表中增加一个字段:如果表中已经存在这个字段,就跳过;否则增加。我写的一段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 的东西,可惜这段代码究竟错在何处,真是一筹莫展,希望朋友们帮忙,年前解决,谢谢!
在某个用户的所有表中增加一个字段:如果表中已经存在这个字段,就跳过;否则增加。我写的一段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';
dbms_output.put_line (tmp_sql);
--看看tmp_sql的具体值,然后直接把tmp_sql的具体值拷贝出来,单独执行是否还有问题?
就是要筛选掉已经存在字段的表:/*此处由于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;上面这个写好像不能使用
begin
select count(*) into v_i from user_tab_columns where table_name=表名
and column_name=列名;
if v_i<=0 then
增加列
end if;
end;
你们眼力过人,这个问题就在这里,至于为何还报错,是因为已经有部分表中间已经存在 RKRQ 这个字段了,多谢二位!to yuyu1980() :
这2个都是可以用的。如果可以,希望能帮忙解决上面的条件问题,谢谢
我有个思路:想把条件判断放在过程之外,这样就不会
PLS-00204:EXISTS只能在SQL语句中使用
的错误提示了
if v_count= 0 then
execute immediate tmp_sql;
end if;
and column_name=列名;
判断一下是否存在
不存在着增加
新年愉快!