我想创建一个过程来更改我的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
我该如何修改?谢谢!
答案 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个服务名称
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,
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,
看起来非常可疑。