[ komplikator @ 01.03.2010. 07:43 ] @
Imam jednu SP u kojoj neki selecti mogu koristiti samo IN operator. IN operator koristi CSV listu (meni treba cca. 20 članova lsite za što je IN idealan) i sve bi bilo OK kad ja tu listu funkciji ne bi trebao slati kao parametar. Ako je pošaljem kao varchar baš i neće uspjeti.

U Delphiju radim sa multiselected gridom i za označene redove trebam storu koja nešto odrađuje na bazi. Znam napraviti da stora svaki put odradi nešto za određeni ključ, no ne želim tako. Ja želim pokupiti sve ključeve za koje treba nešto odraditi i onda sam jednom pozvati storu koja će mi to odraditi u jednoj transakciji, uz manje prometa i sve ostalo što takav pristup nosi.

Dakle, moje ppitanje je, koji tip parametra slati IN operatoru? Postoji li neki UDF koji to riješava?

Unaprijed hvala!
[ komplikator @ 01.03.2010. 09:07 ] @
Pa da odgovorim sam sebi ;-)

Code:
  for execute statement ' select id, brdok from zag where id in (' || :niz || ')'

  into :id, :brdok

  do
  ...




No još uvijek tražim elegantnije i manje "'prljavo' riješenje.
[ rambo @ 01.03.2010. 11:40 ] @
Napravi novu tabelu. Pre izvršavanja tvoje SP popuni tu tabelu sa članovima liste koja ti treba za IN operator. U tvojoj SP, kao parametar za IN operator koristi SELECT koji čita elemente iz te tabele.

Primer:
Code:

SELECT A.ID, A.FirstName, A.LastName
  FROM Table1 A
  WHERE A.ID IN (SELECT B.ID FROM Table2 B)

[ schild @ 01.03.2010. 18:21 ] @
Ja koristim proceduru kojom od liste pravim tabelu, pa onda joinujem sa tom procedurom sta hocu.... Da bude jasnije:
Code:
create procedure SP_STRING_TO_TABLE (
    STR varchar(200),
    DELIM varchar(1) = ',')
returns (
    LINE varchar(25))
as
declare variable I integer = 1;
declare variable E integer = 1; /* Zadnji koji je nadjen */
declare variable LEN integer = 0; /* duzina stringa */
BEGIN
  /* TRACE-UJEM PROSLEDJENI STRING - RAZDVAJAM STAVKE ODVOJENE :DELIM */
  I=1; e=1;                          
  LEN=CHAR_LENGTH(STR);
  WHILE (I<=LEN) DO
    BEGIN
    IF ((SUBSTRING(STR from I for 1)=:DELIM) or (i=len)) THEN
       BEGIN
       --
       if (SUBSTRING(STR from I for 1)=:DELIM) then
          LINE=SUBSTRING(str from e for i-e);
       else
          LINE=SUBSTRING(str from e for i-e+1);
       --
       i=i+1; e=i;
       if ((line<>:delim) and (line<>'')) then -- ako je na kraju , da ne prikazujem
        suspend;
       END
    ELSE
      I=I+1;
    END
END

pa onda...
Code:
select id, brdok from zag z
inner join SP_STRING_TO_TABLE(:niz,';') s on s.line=z.id

[ komplikator @ 02.03.2010. 07:49 ] @
Da Schild, mislio sam na nešto takvog tipa, no nadao sam se da je netko nekad za to napravio neku UDF funkciju jer je to vjerujem jako često u uporabi.