我遇到连接要被称为执行立即执行的字符串的问题。任何人都知道下面的声明有什么问题。
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''';
答案 0 :(得分:4)
从构建你想要的字符串的角度来看,你错过了几个单引号。在SMTPServer
局部变量
'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);