[英]Invalid Identifier in Oracle Function
這是我的SQL
;
select a.hesap_no,
a.teklif_no1 || '/' || a.teklif_no2 as teklif,
a.mus_k_isim as musteri,
b.marka,
c.sasi_no,
c.sasi_durum,
d.tas_mar,
nvl(risk_sasi(a.teklif_no1, a.teklif_no2, c.urun_sira_no, c.sira_no), 0) as risk,
nvl(mv_sasi(a.teklif_no1, a.teklif_no2, c.sira_no, c.urun_sira_no, sysdate), 0) as mv
from s_teklif a,
s_urun b,
s_urun_detay c,
koc_ktmar_pr d
where a.teklif_no1 || a.teklif_no2 = b.teklif_no1 || b.teklif_no2
這是我的MV_SASI
函數;
create or replace
FUNCTION MV_SASI
(
TEK1 IN VARCHAR2,
TEK2 IN NUMBER,
SIRA IN NUMBER,
USIRA IN NUMBER,
DT IN DATE
)
RETURN NUMBER IS MV number;
fat number;
adet number;
pd number;
pds number;
kt date;
ktv number;
dtv number;
frk number;
yfrk number;
TKM VARCHAR2(10);
BEGIN
SELECT COUNT(*)
INTO adet
FROM S_URUN_DETAY
WHERE (SASI_DURUM IS NULL OR SASI_DURUM IN ('A','R'))
AND TEKLIF_NO1 = TEK1
AND TEKLIF_NO2 = TEK2;
SELECT SUM(CASE WHEN B.SASI_DURUM IS NULL OR B.SASI_DURUM IN ('A','R') THEN A.KDV_FIYAT ELSE 0 END)
INTO fat
FROM S_URUN A,S_URUN_DETAY B
WHERE A.TEKLIF_NO1 = tek1
AND A.TEKLIF_NO2 = tek2
AND A.TEKLIF_NO1 = B.TEKLIF_NO1
AND A.TEKLIF_NO2 = B.TEKLIF_NO2
AND A.SIRA_NO = B.URUN_SIRA_NO;
SELECT KULLAN_TARIH
INTO kt
FROM S_TEKLIF
WHERE TEKLIF_NO1 = tek1
AND TEKLIF_NO2 = tek2 ;
yfrk:= EXTRACT(YEAR FROM dt) - EXTRACT(YEAR FROM kt);
ktv := EXTRACT(MONTH FROM kt);
dtv := EXTRACT(MONTH FROM dt);
frk := yfrk * 12 + (dtv-ktv);
IF frk <= 0 THEN
pd := fat * 0.85;
ELSE
pd := fat*0.85 - (fat * 0.0101 * frk);
END IF;
SELECT NVL(ROUND((CASE WHEN SASI_DURUM IS NULL OR SASI_DURUM IN ('A','R') THEN pd / adet ELSE 0 END),2),0)
INTO pds
FROM S_URUN_DETAY
WHERE TEKLIF_NO1 = TEK1
AND TEKLIF_NO2 = TEK2
AND URUN_SIRA_NO = USIRA
AND SIRA_NO = SIRA;
RETURN pds;
END;
但是在我的頁面上,這一行代碼出現了錯誤;
OracleDataReader dr = myCommand.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
我在哪里做錯了?
最好的問候,Soner
myCommand是;
select a.hesap_no,
a.teklif_no1 || '/' || a.teklif_no2 as teklif,
a.mus_k_isim as musteri,
b.marka,
c.sasi_no,
c.sasi_durum,
d.tas_mar,
nvl(risk_sasi(a.teklif_no1, a.teklif_no2, c.urun_sira_no, c.sira_no), 0) as risk,
nvl(mv_sasi(a.teklif_no1, a.teklif_no2, c.sira_no, c.urun_sira_no, sysdate), 0) as mv
from s_teklif a,
s_urun b,
s_urun_detay c,
koc_ktmar_pr d
where a.teklif_no1 || a.teklif_no2 = b.teklif_no1 || b.teklif_no2
and a.teklif_no1 || a.teklif_no2 = c.teklif_no1 || c.teklif_no2
and b.sira_no = c.urun_sira_no
and b.distributor = d.dist_kod
and b.marka = d.marka_kod
and b.urun_kod = d.tas_kod
and a.hesap_no in (select a.hesap_no
from s_teklif a
where a.mus_k_isim in (system.collections.arraylist)
)
我前不久遇到了這樣的問題。 問題是:
愚蠢的oracle沒有stacktrace類型的錯誤處理機制,因此它只給出最主要的錯誤,這使我們無法看到其他錯誤。
您的函數MV_SASI沒有oracle用戶可以使用的授予。 因此,Oracle找不到它並嘗試像MV_SASI是列名一樣運行它。 所以它給出了錯誤。
檢查MV_SASI功能的授予和可見性設置。
SQL末尾的這一位似乎很奇怪: WHERE A.MUS_K_ISIM IN (System.Collections.ArrayList)
。 如果這確實是您的實際SQL文本,那么我認為這是您的問題。 Oracle不知道System.Collections.ArrayList
是什么。
而且,如果您要執行的操作是將實際的數組列表綁定到SQL中,以便可以使用IN
對其進行測試-那將無法工作。 即使您成功地將它綁定到Oracle中的已知數據類型, IN
的語法也是如此,可以將操作數與以逗號分隔的標識符列表中的每個元素進行比較-Oracle不會為您拆分該列表。
您需要綁定列表中的每一項,以便具有類似A.MUS_K_ISIM IN (:bind1, :bind2, :bind3)
,或者將arraylist映射到Oracle中的嵌套表或varray類型,以便可以使用子查詢隨着,像A.MUS_K_ISIM IN (SELECT columnValue FROM TABLE(CAST(:bindlist AS someOracleType)))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.