Sql Oracle函数中的标识符无效

Sql Oracle函数中的标识符无效,sql,database,oracle,function,Sql,Database,Oracle,Function,这是我的SQL 这是我的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 n

这是我的SQL

这是我的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;
我哪里做错了

向你问好,索纳

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用户使用。所以甲骨文找不到它,并试图运行它,就像MV_SASI是一个列名一样。所以它给出了错误


检查MV_SASI func的授权和可见性设置。

SQL末尾的这一点似乎很奇怪:其中A.MUS_K_ISIM位于System.Collections.ArrayList中。如果这确实是您的实际SQL文本,那么我认为这是您的问题。Oracle不知道System.Collections.ArrayList是什么

此外,如果您试图将一个实际的arraylist绑定到SQL中,这样您就可以使用IN-对其进行测试,这是行不通的。即使您成功地将其绑定到Oracle中的已知数据类型,in的语法也会将操作数与以逗号分隔的标识符列表中的每个元素进行比较—Oracle不会为您将该列表拆分


您需要绑定列表中的每一项,以便在:bind1、:bind2、:bind3中具有类似于a.MUS_K_ISIM的条件,或者将arraylist映射到Oracle中的嵌套表或varray类型,以便在中使用子查询,就像从TABLECAST中选择columnValue:bindlist作为someOracleType中的A.MUS_K_ISIM一样。

@Ali但此sql正在工作从Dual中选择NVLMV_SASI'K07',348,1,1,SYSDATE,0是否与应用程序使用的用户一起运行?我还发现了另一个函数:RISK_SASI。@我控制这两个函数,但它们没有错误。你确定你使用的用户与应用程序使用的用户完全相同吗?这样你就可以在你问题中的整个查询中运行它,我的意思是与应用程序使用的用户一起运行,而你在TOAD中没有错误?或者你得到了同样的错误?你能通过运行像select MV_SASI…这样的查询来排除MV_SASI是问题吗。。。。输入值。。。。双重身份?
 OracleDataReader dr = myCommand.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
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)
                     )