我有一个由 3 列组成的表:系统、模块和块。表被填充在一个接受系统、模块和块的过程中,然后它检查三重奏是否在表中:
select count(*) into any_rows_found from logs_table llt
where system=llt.system and module=llt.module and block=llt.block;
Run Code Online (Sandbox Code Playgroud)
如果表中已有包含这三个值的行,则不要将它们写入表中,如果没有,则将它们写入。问题是,如果表具有值 'system=a module=b block=c' 并且我查询值 'does the table has system=a module=d block=e' 它返回 yes,或者,准确地说,any_rows_found=1。仅当我发送表中没有其值之一的三重奏组时才显示值 1,例如:'system=g module=h and block=i'。我的查询有什么问题?
问题在于此:
where system = llt.system
Run Code Online (Sandbox Code Playgroud)
两个systems是一样的,就好像你放了一样where 1 = 1,所以Oracle有点糊涂了(谢谢你)。
该怎么办?将过程的参数重命名为 egpar_system以便查询变为
where llt.system = par_system
Run Code Online (Sandbox Code Playgroud)
另一种选择(更糟糕的是,在我看来)是在参数名称之前加上过程名称。如果过程的名称是 eg p_test,那么你就会有
where llt.system = p_test.system
Run Code Online (Sandbox Code Playgroud)