重命名有单引号的列



我需要在我的oracle数据库使用pl/sql重命名列。例如,您有一个这样的表:

CREATE TABLE TEST(
id int,
"'test1" varchar(80),
"test2" varchar(80)
);

,你需要删除所有的引号。我写了匿名块,有问题:

...
FOR column_rec IN (SELECT column_name FROM USER_TAB_COLUMNS WHERE TABLE_NAME=table_rec.TABLE_NAME) LOOP
new_column_name := column_rec.COLUMN_NAME;
new_column_name := REPLACE(new_column_name, chr(34), '');
new_column_name := REPLACE(new_column_name, chr(39), '');
...
EXECUTE IMMEDIATE
'ALTER TABLE '
|| table_rec.TABLE_NAME
|| ' RENAME COLUMN '
|| column_rec.COLUMN_NAME
|| ' TO '
|| new_column_name;
...

但是如果column_rec。COLUMN_NAME只有一个单引号,这个脚本将失败,异常ORA-01756,这意味着没有结束引号。如何避免这种例外?

即使在脚本中也可以使用双引号来包装列名;例如,可以这样做:

alter table test rename column "'test1" to test1

你的脚本可以编辑为:

EXECUTE IMMEDIATE
'ALTER TABLE '
|| table_rec.TABLE_NAME
|| ' RENAME COLUMN "' /* open the quote */
|| column_rec.COLUMN_NAME
|| '" TO '            /* and close */
|| new_column_name;

还要注意,这样所有重命名的列都是大写的;如果这是你需要的,很好,否则你必须用双引号括起来,即使是新的名字:

...
|| '" TO "'                /* and close, and reopen */
|| new_column_name || '"'; /* and close again */

最新更新