我的 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 (...
可能是什么问题?我没有看到任何严重的语法违规。
这似乎是错误的:
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
可以从中提取)。