编写以下代码会给我错误说:
PL / SQL:语句被忽略 PLS-00382:表达式类型错误:
代码:
if ( l_vol = 0 )
then
l_cndtn_string := 'l_wgt > l_wgt_limit';
else
l_cndtn_string := '(l_wgt > l_wgt_limit) and (l_vol > l_vol_limit)';
end if;
if ( l_cndtn_string )
then
l_isis_task := 'PO';
else
l_isis_task := 'TO';
end if;
答案 0 :(得分:0)
If statement评估boolean expression。在你的例子中
if ( l_cndtn_string )
l_cndtn_string
不是布尔表达式而是character expression,并且它们之间没有隐式转换。
请自己帮忙并检查Expressions。
我不知道你的逻辑是什么,但下面的例子展示了一种将字符表达式转换为布尔表达式的方法:
if l_cndtn_string is not null -- a boolean expression
then
null;
else
null;
end if;
答案 1 :(得分:0)
您想要动态条件构建。在db.getCollection('BackgroundTasks').find({ Status: 1, $where: function() {
if (this.Settings.hasOwnProperty("ID")){
return this.Settings.ID== "606d7afb-3dce-4533-8f8d-6411715e5b47";
}
return false;
}
})
中,与其他编译语言一样,很难做到。
试试这样:
plsql
答案 2 :(得分:0)
在预期df = pd.read_csv('output.csv')
list(set(df.Description))
g = list(df['Description'].unique())
print(g)
布尔表达式之后,不是字符串 - 这就是为什么你得到PLS-00382错误。你当然可以尝试使用动态sql动态评估你的表达式,但实际上你想要的就像这样简单:
IF
答案 3 :(得分:0)
哦,只有在阅读了其他答案后,才意识到这个问题是关于什么的。我决定保留我原来的答案,因为关于if语句中字符表达的观点仍然正确。
其他答案是正确的,通过动态PL / SQL建立基于字符串评估的逻辑并不是一个好主意。他们也提出了正确的解决方案,但恕我直言甚至更好的方法存在。
通常当我在PL / SQL中有多个条件时,我给条件命名。请参阅下面的示例说明该技术。名称使代码自我记录,并且是代码可读性的巨大改进,因为现在这种情况通常都是人类语言。
declare
v_volume number := 0;
v_weight number := 1;
v_weight_limit constant number := 10;
v_volume_limit constant number := 10;
v_has_volume constant boolean := v_volume > 0;
v_exceed_weight_limit constant boolean := v_weight > v_weight_limit;
v_exceed_volume_limit constant boolean := v_volume > v_volume_limit;
begin
-- no guarantee the logic is the same than in question
-- but just illustrates the coding style
if v_has_volume
and v_exceed_weight_limit
and v_exceed_volume_limit
then
null; -- something
else
null; -- something else
end if;
end;
/