SQL comutunu procedure içinde nasıl çalıştırırım.

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
Yusuf AYDIN
Üye
Mesajlar: 69
Kayıt: 02 Oca 2004 05:45
Konum: Antalya

SQL comutunu procedure içinde nasıl çalıştırırım.

Mesaj gönderen Yusuf AYDIN »

Delphi 7 , Firebird kullanıyorum.

Hazırladığım program işçinden SQL komutu ile insert ve update işlemini yapmam gerekiyor.

Ama öyle table varki. SQL komutunun uzunluğu field isimleri ve değişkenleri ile birlikte 255 karakteri geçiyor.

Aklıma gelen çözüm ise varchar 250 lik 4 params hazırladım. Bunlarıda bir procedurde tek string içinde birleştirmek ve çalıştırmaktı. Ama bu oluşturduğum string ifadesini komut olarak çalıştıramıyorum.

Yani , Procedure içine params yolu ile verilen SQl komutunu nasıl çalıştıra bilirim. Bu ifade execute bir işlem olacaktır.

NOT:
EXECUTE IMMEDIATE ifadesi var ama çalıştıramadım.

Bu konuda daha önceden uğraşmış veya çözüm üretmiş arkadaşladan yardım rica ediyorum.
Kullanıcı avatarı
mikser
Üye
Mesajlar: 120
Kayıt: 30 Haz 2003 09:54
Konum: Ankara

Mesaj gönderen mikser »

bu procedure gelen parametrelere göre sql calistiriyor. sanırım işine yarar.

Kod: Tümünü seç

CREATE PROCEDURE MAXNO (
    FIELDNAME VARCHAR(100),
    TABLENAME VARCHAR(100))
RETURNS (
    SONNO INTEGER)
AS
BEGIN
 if( FIELDNAME = '' or TABLENAME = '') then
  exit;

 EXECUTE STATEMENT 'SELECT MAX(' || FIELDNAME || ') FROM ' || TABLENAME INTO :SONNO;

 if (SONNO is null) then SONNO = 1;
 else SONNO = SONNO + 1;
 suspend;
END
kullanımı:

Kod: Tümünü seç

if(INSERTING) then
    EXECUTE PROCEDURE MAXNO ('ALANADI', 'TABLOADI') RETURNING_VALUES (TABLOADI.ALANADI);
Kullanıcı avatarı
Yusuf AYDIN
Üye
Mesajlar: 69
Kayıt: 02 Oca 2004 05:45
Konum: Antalya

Mesaj gönderen Yusuf AYDIN »

durumumu şöyle özetleyeyim.
DELPHI rutini

Kod: Tümünü seç

  CDS_SQL.Close;
  CDS_SQL.SQL.Clear;
  CDS_SQL.SQL.Add('Execute PROC_COMMIT (:Params1, :Params2, :Params3')
  CDS_SQL.Params[0].Value := 'INSERT INTO TABLE (FIELD1, FIELD2.... FIELD20)';
  CDS_SQL.Params[1].Value := ' Values (100, '101', .....,200)';
  CDS_SQL.Params[1].Value := '';
  CDS_SQL.Execute;
PROCEDURE ise

Kod: Tümünü seç

CREATE PROCEDURE PROC_COMMIT (
    PARAMS1 VARCHAR(250) CHARACTER SET WIN1254,
    PARAMS2 VARCHAR(250) CHARACTER SET WIN1254,
    PARAMS3 VARCHAR(250) CHARACTER SET WIN1254)
AS
DECLARE VARIABLE CALIS VARCHAR(1000) CHARACTER SET WIN1254;
begin
  CALIS = '';
  CALIS = :params1 || :params2 || :params3;
  execute immediate :calis;
end
execute immediate ifadesinide SQL.HLP içinden buldum. IBExpert içinde çalışmıyor.
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

insert yada update yapan bir procedure hazırlayıp parametrelerini ayarlarsanız rahatlıkla kullanabilirsiniz...
IbExpert full surumunde bu tarz procedureleri (SUID procedure) otomatik olusturuyor...
ornegin

Kod: Tümünü seç

CREATE PROCEDURE CARI_IU (
  ID INTEGER,
  CARIKOD VARCHAR(10),
  UNVANI VARCHAR(100),
  YETKILI VARCHAR(50),
  ADRES VARCHAR(100),
  TELNO VARCHAR(20),
  VD VARCHAR(20),
  VN VARCHAR(20),
  AKTIF SMALLINT)
AS
BEGIN
  IF (EXISTS(SELECT ID FROM CARI WHERE (ID = :ID))) THEN
    UPDATE CARI
    SET CARIKOD = :CARIKOD,
        UNVANI = :UNVANI,
        YETKILI = :YETKILI,
        ADRES = :ADRES,
        TELNO = :TELNO,
        VD = :VD,
        VN = :VN,
        AKTIF = :AKTIF
    WHERE (ID = :ID);
  ELSE
    INSERT INTO CARI (
        ID,
        CARIKOD,
        UNVANI,
        YETKILI,
        ADRES,
        TELNO,
        VD,
        VN,
        AKTIF)
    VALUES (
        :ID,
        :CARIKOD,
        :UNVANI,
        :YETKILI,
        :ADRES,
        :TELNO,
        :VD,
        :VN,
        :AKTIF);
END
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
Yusuf AYDIN
Üye
Mesajlar: 69
Kayıt: 02 Oca 2004 05:45
Konum: Antalya

Mesaj gönderen Yusuf AYDIN »

İlgi gösteren arkadaşlara teşekkür ederim,

Sayın gkimirti,

Ama 35 table var IP üzerinden uzaktaki servera yazmam gereken bunların bir kısmı kısa bir kısmı ise çok uzun, SQL cümlesi ile çözmeliyim. Yoksa işin içinden çıkamıyorum.

Direkt table da kullanamıyorum, sistem çok yavaşlıyor. Ve aktarılacak kayıt sayısı ise 1000 veya daha fazla olacağı için kasmasın diye SQL cümlesi ile halletmeliyim.

Şu EXECUTE IMMEDIATE ifadesi çok ilginç nette bisürü örnek var. ama IBExpertte procedure içinde yada SQL içinde yemiyor, Canımı sıkan bu çünki çözüm orada ama bulamıyorum..

ÖRNEK çok fazla var ama bir kaçını vereyim.
http://www.databasejournal.com/features ... iate.htm
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

istedigin execute statement olmasın
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
Yusuf AYDIN
Üye
Mesajlar: 69
Kayıt: 02 Oca 2004 05:45
Konum: Antalya

Mesaj gönderen Yusuf AYDIN »

SQL Referance içinden help ekranı
Prepares a dynamic SQL (DSQL) statement, executes it once, and discards it. Available in SQL.

Syntax EXECUTE IMMEDIATE [TRANSACTION transaction]
{:variable | 'string'} [USING SQL DESCRIPTOR xsqlda];

Argument Description
TRANSACTION transaction Specifies the transaction under which execution occurs
:variable Host variable containing the SQL statement to execute
'string' A string literal containing the SQL statement to execute
USING SQL DESCRIPTOR Specifies that values corresponding to the statement's parameters should be taken from the specified XSQLDA
xsqlda XSQLDA host-language variable


Description EXECUTE IMMEDIATE prepares a DSQL statement stored in a host-language variable or in a literal string, executes it once, and discards it. To prepare and execute a DSQL statement for repeated use, use PREPARE and EXECUTE instead of EXECUTE IMMEDIATE.

The TRANSACTION clause can be used in SQL applications running multiple, simultaneous transactions to specify which transaction controls the EXECUTE IMMEDIATE operation.
The SQL statement to execute must be stored in a host variable or be a string literal. It can contain any SQL data definition statement or data manipulation statement that does not return output.
USING DESCRIPTOR enables EXECUTE IMMEDIATE to extract the values of a statement's parameters from an XSQLDA structure previously loaded with appropriate values.

Example The following embedded SQL statement prepares and executes a statement in a host variable:

EXEC SQL
EXECUTE IMMEDIATE :insert_date;
Kullanıcı avatarı
Yusuf AYDIN
Üye
Mesajlar: 69
Kayıt: 02 Oca 2004 05:45
Konum: Antalya

Mesaj gönderen Yusuf AYDIN »

gkimirti ve Freeman 'e teşekkürler.

Çözüm :
yukarıda ki Procedure örneğinde
execute immediate :CALIS yerine execute statement :CALIS konulunca problem kalmadı.

İlgi ve alaka gösteren herkese teşekkürler.
Cevapla