plsql中的条件字符串,如sprintf

时间:2016-09-08 01:58:01

标签: plsql

编写以下代码会给我错误说:

  

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;

4 个答案:

答案 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;
/