如何在查询中引用函数参数?

时间:2014-03-28 18:24:45

标签: oracle plsql stored-functions

在声明的函数定义中,我想在select查询的WHERE子句中使用函数参数item_account_id的值。

CREATE OR REPLACE 
FUNCTION UPDATE_CURRENT_BALANCE( item_account_id IN item_account.item_account_id%TYPE)                               
RETURN boolean 
AS 
BEGIN        
    if item_data_table_id = 10 then
       select current_balance_curr_id 
       from BANK_ACCOUNT 
       where item_account_id = item_account_id;        
    end if;
  RETURN true;
END UPDATE_CURRENT_BALANCE;

1 个答案:

答案 0 :(得分:0)

您遇到了范围问题,因为参数名称与列相同。 Oracle名称解析的工作方式,这些item_account_id = item_account_id都将标识表列。即使我们添加了一个表别名并在相等操作的一侧使用它,Oracle仍然会将其评估为1 = 1

解决方案很简单:重命名参数。使用前缀很受欢迎:

CREATE OR REPLACE FUNCTION UPDATE_CURRENT_BALANCE
    ( p_item_account_id IN item_account.item_account_id%TYPE)   
RETURN boolean 
AS 
BEGIN        
    if item_data_table_id = 10 then -- the posted code has no source for this? perhaps it's another parameter?
       select current_balance_curr_id 
       from BANK_ACCOUNT 
       where item_account_id = p_item_account_id;        
    end if;
  RETURN true;
END UPDATE_CURRENT_BALANCE;   

我认为item_data_table_id是另一个在转录中丢失的参数。你也应该加上前缀:在命名约定中,一致性是一件好事。