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

时间:2015-07-15 21:12:36

标签: 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''';

2 个答案:

答案 0 :(得分:4)

从构建你想要的字符串的角度来看,你错过了几个单引号。在SMTPServer局部变量

之后,您需要使用3个单引号和4个单引号
'ALTER SESSION SET smtp_out_server = ''' || smtpServer || ''''

就我个人而言,我发现在你声明一个模板(使用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;

你确定第二个陈述确实有效吗? smtp_out_server不应该是modifiable without a database restart。我见过人们说他们已经能够在运行时使用ALTER SYSTEM成功修改它,但没有看到有人试图用ALTER SESSION来做。我会犹豫是否构建依赖于与文档相关的行为的代码。如果您需要控制在运行时使用的SMTP服务器,我强烈建议您使用utl_smtp包而不是utl_mail

答案 1 :(得分:0)

提供替换参数的EXECUTE IMMEDIATE语句并不是很好,因为对于optmizer,它每次都是一个完全不同的语句,因此它为每个语句准备了另一个执行计划。 您应该在EXECUTE IMMEDIATE子句中使用绑定。

示例:

Intent intent;
if (etOp == 11) {
  intent   = new Intent(this, AnotherActivity.class);
}
else {
    intent = new Intent(this, ThirdActivity.class);
}
startActivity(intent);