使用过程更改数据库服务名称

时间:2018-02-07 09:23:03

标签: oracle plsql

我想创建一个过程来更改我的Oracle数据库的服务名称 我使用execute immediate但我不能使用完整的字符串,因为它有超过255个字符。

我尝试过如下,但我仍然有错误:

DECLARE
  db_domain varchar2(512);
  service_names varchar2(4000);
  service_names2 varchar2(4000):='';
  sqlstring varchar2(4000);
BEGIN

  select value into service_names from v$parameter
  where name='service_names';
  select value into db_domain from v$parameter
  where name='db_domain';

  service_names:= service_names || ', ' || 'abcdef.' || db_domain|| ','|| ' abcdefghij.'|| db_domain ||','||' abcdefghij.'|| db_domain ||',' ||' abcdefghij.'|| db_domain || ',';
  service_names2:='abcdefghij.'|| db_domain || ',' ||' abcdefghij.'|| db_domain;    
  execute immediate '''alter system set service_names = '''||service_names||''','''||service_names2||''' scope=memory;''';
END;
/

ORA-00900: invalid SQL statement
ORA-06512: at line 17

我该如何修改?谢谢!

2 个答案:

答案 0 :(得分:0)

我不是DBA。

在执行命令之前,使用DBMS_OUTPUT.PUT_LINE显示命令是(通常总是)。

如果你这样做,这就是ALTER SYSTEM的样子:

'alter system set service_names = 'kc11g, abcdef., abcdefghij., abcdefghij., abcdefghij.,','abcdefghij., abcdefghij.' scope=memory;'
                                                                                        ---
                                                                                        Here

我标记了一个看起来很可疑的地方。你觉得怎么样?

答案 1 :(得分:0)

主要问题是:

  • 动态语句不得以冒号;结尾 - 将其删除
  • 删除动态对帐单开头和结尾的引号

一定是这样的

execute immediate 'alter system set service_names = '''||service_names||''','''||service_names2||''' scope=memory';

但是,您确定服务名称吗?该语句将为您的数据库设置2个服务名称

  1. abcdef_1.dbs.internal.domain.com, abcdef.dbs.internal.domain.com, abcdefghij.dbs.internal.domain.com, abcdefghij.dbs.internal.domain.com, abcdefghij.dbs.internal.domain.com,
  2. abcdefghij.dbs.internal.domain.com, abcdefghij.dbs.internal.domain.com

    这是你的意图吗?服务名称 abcdef_1.dbs.internal.domain.com, abcdef.dbs.internal.domain.com, abcdefghij.dbs.internal.domain.com, abcdefghij.dbs.internal.domain.com, abcdefghij.dbs.internal.domain.com, 看起来非常可疑。