如果列有单引号,则重命名列
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 */
我需要使用 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 */