SP icinde string çözümleme

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

SP icinde string çözümleme

Mesaj gönderen gkimirti »

bir tablonun serino diye bir alanı var ve icinde
'1778746-1605500-1612521-1710298-1756607-1756608'
seklinde kayıtlar var.

elimde POS,LEN SPleri ve substr UDF si var.
bunları kullanarak (yada daha efektif) bu stringleri nasıl row data ya
çeviririm. yani yukardaki satırı parametre olarak girip

1778746
1605500
1612521
1710298
1756607
1756608

seklinde bir sonuc almak istiyorum
ÜŞENME,ERTELEME,VAZGEÇME
onaydin

Mesaj gönderen onaydin »

Kod: Tümünü seç

CREATE PROCEDURE P_STRING_BICIMLENDIR (
  METIN VarChar(355))
 returns (
  OZELLIK_NO VarChar(10),
  DEGER VarChar(10))
AS
declare variable P integer;
declare variable L integer ;
declare variable TMP varchar(100);

begin
select DONEN FROM POS('|',:METIN) into :P;
while(P > 3) do
begin

 select substr(:METIN,1,:P-1 ) from RDB$DATABASE  into :TMP;
 select substr(:METIN,:P+1,strlen(:METIN)) from RDB$DATABASE into :METIN  ;

 select DONEN FROM POS(';',:TMP) into :L;

 select cast(substr(:TMP,1,:L-1)as varchar(10)) from RDB$DATABASE into OZELLIK_NO;
 select cast(substr(:TMP,:L+1,strlen(:TMP))as varchar(10))  from RDB$DATABASE into :DEGER  ;

 select DONEN FROM POS('|',:METIN) into :P;

 suspend;
end
end
onaydin

Mesaj gönderen onaydin »

Bende hazırı vardı oradan :)
String formatı 1;11|8;88|9;99| ....
formatında gidiyor son karakter | ile bitiyor
benzer bir şekilde parçalanabilir.

--
sizinkinde '-' adedi sabit ise döngü kurmanıza gerek yok
bunun için sadece
; karakterine yapılan işlemini yapmanız yeterli
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selamlar,

Aslında alakalı değil ama bir şey dikkatimi çekti :)

Kod: Tümünü seç

 select substr(:METIN,1,:P-1 ) from RDB$DATABASE  into :TMP;
 select substr(:METIN,:P+1,strlen(:METIN)) from RDB$DATABASE into :METIN  ;
 select DONEN FROM POS(';',:TMP) into :L;
yerine

Kod: Tümünü seç

  TMP = SubStr(:METIN,1, :P-1) ;
  METIN = SubStr(:METIN), :P+1, StrLen(:METIN)) ;
  L = POS(';',:TMP) ;
kullanılmıyor mu? (Sanırım kullanılması gerekiyor gibime geliyor ama deneyen var mı? Ya da neden SELECT kullanarak yaptınız? Aralarında fark var mı?

Kolay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

abi SubStr UDF bunda problem yok ama digerleri sp oldugu icin select ile kullanılmadıgında (mesela burada POS)
An error was found in the application program input parameters for the SQL statement.
Dynamic SQL Error.
SQL error code = -804.
Function unknown.
POS.
seklinde hata veriyor.
ÜŞENME,ERTELEME,VAZGEÇME
onaydin

Mesaj gönderen onaydin »

Muhtemelen ben bunu hazırlarken önce pos u kullanmıştım
çalışmayınca select içinde kullanmıştım diğerlerinide aynı şekilde yapmışım.
Ama aklımda vardı bu, sizin yazdığınız doğrusu tabiki.
onaydin

Mesaj gönderen onaydin »

hatta pos u bu şekilde kullanmamak için bugün bi udf araştırması yaptım
http://rfunc.sourceforge.net/
rFunc isimli bu dosya strpos isimli bir fonksiyon içeriyor.
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

düzenlenmis hali

Kod: Tümünü seç

CREATE PROCEDURE P_STRING_BICIMLENDIR (
    METIN VARCHAR(355))
RETURNS (
    DEGER VARCHAR(10))
AS
DECLARE VARIABLE P INTEGER;
DECLARE VARIABLE SEP VARCHAR(1);
BEGIN
    SEP='-';
    --SON KARAKTER AYIRAC DEGILSE AYIRAC EKLENIR
    IF (CAST(SUBSTR(:METIN,STRLEN(METIN),1) AS VARCHAR(1))<>SEP) THEN
         METIN=METIN || SEP;

    SELECT DONEN FROM POS('-',:METIN) INTO :P;
    WHILE(P <> 0) DO
    BEGIN
         --string ayıklanır
         DEGER= SUBSTR(:METIN,1,:P-1 );
         --ayıklanan string cıkartılır.
         METIN=SUBSTR(:METIN,:P+1,STRLEN(:METIN));
         --ayırac tekrar aranır
         SELECT DONEN FROM POS('-',:METIN) INTO :P;
         SUSPEND;
    END
END
iyi guzel calısıyor,sagolasın onur
SEP ile ayırac degistirilebilinir,

ornek olarak 1234-345677-97544-32245 verince

DEGER
1234
345677
97544
32245

elde ediliyor..
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Ben POS'u da bir an UDF olarak görmüşüm :) Ehiii tabiki o zaman SELECT kullanmak gerekiyor.

Hadi kolay gele
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
SieS
Üye
Mesajlar: 166
Kayıt: 17 Haz 2003 10:41
Konum: Konya

Mesaj gönderen SieS »

Merhaba Arkaşlar, tam olmasada bu işlemin tersini yapmak istiyorum.
Bir triger içerisindeki string alanları birleştirip tekbir değişkene aktarmak istiyorum. Delphide kullandımğımız gibi burdada yapmak istedim ama hata verdi heralde yanlış yapıyorum. Yardımcı olabilirmisiniz.

Teşekkür ederim.

Yapmak istediğim olay...

Aciklama = m_no + ' Nolu makbuz ile ' + musteri_adi + musteri_soyadı + ' dan yapilan tahsilat';

Aciklama değişkeni
' 525 nolu makkbuz ile ali veliden yapılan tahsilat' şeklinde olacak.
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

stringleri || ile birleştirebilirsin. mesela OUT_ACIKLAMA adli bir parametre olsun.

SELECT AD,SOYAD,NO FROM MUSTERILER WHERE MUSTERIID = 1
INTO :OUT_AD,OUT_SOYAD,OUT_NO;

OUT_ACIKLAMA = OUT_NO || ' Nolu makbuz ile ' || OUT_AD || ' ' || OUT_SOYAD || ' adlı kişiden yapılan tahsilat.';
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
SieS
Üye
Mesajlar: 166
Kayıt: 17 Haz 2003 10:41
Konum: Konya

Mesaj gönderen SieS »

Teşekkürler .
Ben + kullandığım için çalışmamış || kullanınca oldu .

Allah Razı Olsun
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selamlar,

SQL'de + işareti yok, bunun yerine || kullanılıyor (Arkadaşımız da yanıtını vermiş)

Bu da çoook eskilerden kalma bir nane :) Eskilerden + işareti matematiksel bir ifade olarak kullanılırdı ve programlama dillerinin bir kısmı kabul etmezdi. Bunun yerine string birleştirici ifadeler kullanılırdı :) (Eski günler aklıma geldi bir an :)

Örneğin pascal'ın eski versiyonlarında da + yerine Concatanate isimli bir string birleştirici fonksiyon vardı, o kullanılırdı :)

Kolay Gelsin.
Not : Sadece ek bilgi amaçlı verdim.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Cevapla