如果列有单引号,则重命名列

Rename column if it has single quote

我需要使用 pl/sql 重命名我的 Oracle 数据库中的列。例如你有这样的 table。

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 */