簡體   English   中英

Oracle函數中的無效標識符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM