SQL comutunu procedure içinde nasıl çalıştırırım.
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
- 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.
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.
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.
bu procedure gelen parametrelere göre sql calistiriyor. sanırım işine yarar.
kullanımı:
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
Kod: Tümünü seç
if(INSERTING) then
EXECUTE PROCEDURE MAXNO ('ALANADI', 'TABLOADI') RETURNING_VALUES (TABLOADI.ALANADI);
- Yusuf AYDIN
- Üye
- Mesajlar: 69
- Kayıt: 02 Oca 2004 05:45
- Konum: Antalya
durumumu şöyle özetleyeyim.
DELPHI rutini
PROCEDURE ise
execute immediate ifadesinide SQL.HLP içinden buldum. IBExpert içinde çalışmıyor.
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;
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
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
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
- Yusuf AYDIN
- Üye
- Mesajlar: 69
- Kayıt: 02 Oca 2004 05:45
- Konum: Antalya
İ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
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
- Yusuf AYDIN
- Üye
- Mesajlar: 69
- Kayıt: 02 Oca 2004 05:45
- Konum: Antalya
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;
- Yusuf AYDIN
- Üye
- Mesajlar: 69
- Kayıt: 02 Oca 2004 05:45
- Konum: Antalya