立即执行 oracle 字符串连接问题

Jas*_*ith 2 oracle plsql concatenation execute utl-mail

我在连接要立即执行的字符串时遇到问题。任何人都知道下面的陈述有什么问题。

EXECUTE IMMEDIATE 'ALTER SESSION SET smtp_out_server = ''||SMTPServer||''';

select smtpserver into SMTPServer from mytable;

if(SMTPServer is not null)
then
  EXECUTE IMMEDIATE 'ALTER SESSION SET smtp_out_server = ''||SMTPServer||''';
  --*****above does not work, below does work****
  EXECUTE IMMEDIATE 'ALTER SESSION SET smtp_out_server = ''10.1.1.1''';
Run Code Online (Sandbox Code Playgroud)

Jus*_*ave 6

从构建您想要的字符串的角度来看,您缺少几个单引号。SMTPServer局部变量之前需要 3 个单引号,之后需要 4 个单引号

'ALTER SESSION SET smtp_out_server = ''' || smtpServer || ''''
Run Code Online (Sandbox Code Playgroud)

就我个人而言,我发现在声明模板(使用 q 引用语法,因为它嵌入了单引号)、调用replace替换模板化值,然后调用EXECUTE IMMEDIATE. 这是更多的代码,但它通常使生活更轻松。

l_sql_stmt := q'{ALTER SESSION SET smtp_out_server = '##server##'}';
l_sql_stmt := replace( l_sql_stmt, '##server##', smtpServer );
EXECUTE IMMEDIATE l_sql_stmt;
Run Code Online (Sandbox Code Playgroud)

不过,你确定第二个语句真的有效吗? smtp_out_server不应该在没有数据库重启的情况下进行修改。我见过有人说他们已经能够使用ALTER SYSTEMat 运行时成功地修改它,但还没有看到有人尝试使用ALTER SESSION. 我会犹豫构建依赖于违反文档的行为的代码。如果您需要控制在运行时使用的 SMTP 服务器,我强烈建议使用utl_smtp包而不是utl_mail.