Неверный идентификатор в функции Oracle - PullRequest
0 голосов
/ 23 марта 2011

Это моя 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);

enter image description here

Где я делаю не так?

С наилучшими пожеланиями, Сонер

myCommand is;

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)
                     )

Ответы [ 2 ]

0 голосов
/ 23 марта 2011

Этот бит в конце вашего SQL кажется странным: WHERE A.MUS_K_ISIM IN (System.Collections.ArrayList).Если это действительно ваш текст SQL, то я думаю, что это ваша проблема.Oracle не знает, что такое System.Collections.ArrayList.

Более того, если вы пытаетесь связать реальный массив в SQL, чтобы вы могли проверить его с помощью IN - это победило 'т работа.Даже если вам удастся связать его с известным типом данных в Oracle, синтаксис IN таков, что операнд сравнивается с каждым элементом в списке идентификаторов, разделенных запятыми - Oracle не разбивает этот список на части дляyou.

Вам нужно либо связать каждый элемент списка, чтобы у вас было условие типа A.MUS_K_ISIM IN (:bind1, :bind2, :bind3), либо сопоставить ваш массив данных с вложенной таблицей или типом массива в Oracle, чтобы вы могли использовать подзапрос с IN,как A.MUS_K_ISIM IN (SELECT columnValue FROM TABLE(CAST(:bindlist AS someOracleType))).

0 голосов
/ 23 марта 2011

Я недавно столкнулся с такой проблемой.Проблема была в следующем:

У тупого оракула нет механизма обработки ошибок типа стека-трассировки, поэтому он выдает только верхнюю ошибку, которая не позволяет нам увидеть другие.

Ваша функция MV_SASI не имеет права на использование пользователем оракула.Поэтому Oracle не смог найти его и попытался запустить, как MV_SASI - это имя столбца.поэтому выдает ошибку.

Проверьте настройки предоставления и видимости функции MV_SASI.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...