Oracle 函数中缺少表达式

问题描述 投票:0回答:1

我的 PL SQL 函数有问题

function isConditionsForChargeChanged(adj_date varchar2, acc_num varchar2) return integer
is
  res integer;
begin
  SELECT CASE when EXISTS (
select DISTINCT 1
from custhasproduct@rbm_dblink chp
join custproductdetails@rbm_dblink cpd on chp.customer_ref = cpd.customer_ref and chp.product_seq = cpd.product_seq
join custproducttariffdetails@rbm_dblink cptd on cptd.customer_ref = cpd.customer_ref and cptd.product_seq = cpd.product_seq
join custproductstatus@rbm_dblink cps on cps.customer_ref = chp.customer_ref and cps.product_seq = chp.product_seq
join tariff@rbm_dblink tr on tr.tariff_id = cptd.tariff_id and tr.catalogue_change_id in (select catalogue_change_id from cataloguechange where catalogue_status=3)
join custoverrideprice@rbm_dblink cop on cop.customer_ref = cpd.customer_ref and cop.product_seq = cpd.product_seq 
where cpd.account_num = acc_num
and ((extract (month from cps.effective_dtm) = extract (month from to_date(adj_date, 'YYYY-MM-DD'))
and extract (year from cps.effective_dtm) = extract (year from to_date(adj_date, 'YYYY-MM-DD'))
AND cps.product_status in ('SU', 'OK', 'TX'))                                                           /* Проверка изменения активности услуги в данном отчетном периоде */   
OR (extract (month from cptd.START_DAT) = extract (month from to_date(adj_date, 'YYYY-MM-DD'))
and extract (year from cptd.START_DAT) = extract (year from to_date(adj_date, 'YYYY-MM-DD')) AND cptd.END_DAT IS NULL) /* Проверка на смену тарифа в данном отчетном периоде*/
OR (extract (month from cop.START_DAT) = extract (month from to_date(adj_date, 'YYYY-MM-DD'))
and extract (year from cop.START_DAT) = extract (year from DATE to_date(adj_date, 'YYYY-MM-DD')) AND COP.END_DAT IS NULL))  /* Проверка на переопределение цены в данном отчетном периоде */
) 
THEN 0  
else 1 end into res
from dual;
return res;
END isConditionsForChargeChanged;

错误信息: PL/SQL: ORA-00936: 缺少第 190 行第 46 行表达式 PL/SQL:SQL 语句忽略第 181 行第 3 行

第190行第46位(用(?)标记):

...and ((extract (month from cps.effective_dtm) (?)= extract (month from to_date(adj_date, 'YYYY-MM-DD'))...

第181行第3位(用(?)标记):

...(?)SELECT CASE when EXISTS (...

可能是什么问题?我没有看到任何严重的语法违规。

oracle plsql
1个回答
0
投票

这似乎是错误的:

AND EXTRACT (YEAR FROM cop.START_DAT) = EXTRACT (YEAR FROM DATE to_date ( adj_date , 'YYYY-MM-DD'))
                                                           ----

删除

DATE
关键字(在上面的代码中划线),假设
adj_date
yyyy-mm-dd 格式的
string
,然后将其转换为有效的
date
数据类型值,以便
year
可以从中提取)。

© www.soinside.com 2019 - 2024. All rights reserved.