在声明的函数定义中,我想在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;
答案 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
是另一个在转录中丢失的参数。你也应该加上前缀:在命名约定中,一致性是一件好事。