Plsql 如果列有单引号,请重命名该列

Plsql 如果列有单引号,请重命名该列,plsql,oracle11g,Plsql,Oracle11g,我需要使用pl/sql重命名oracle数据库中的列。例如,您有这样的表 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=ta

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

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\u rec.column\u 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 */

即使在脚本中,也只需使用双引号来包装列的名称;例如,这项工作:

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