8.7 Dinamik SQL

<< İçindekileri Görüntülemek İçin Tıklayın >>

Yer:  Teknik Kılavuzlar > IVEDI SQL Kullanıcı Kılavuzu > 8. Yordamsal dil (PSQL) >

8.7 Dinamik SQL

EXEC[UTE] STATEMENT <metin ifadesi> …
EXEC[UTE] EMBEDDED [STATEMENT] <metin ifadesi> …
ÖzellikEXECUTE STATEMENTEXECUTE EMBEDDED
Derleme yoluÜst seviye derleyiciYalnızca PSQL blok derleyicisi
DDL çalıştırabilirevethayır — sözdizimi hatası
Çağıranın yerel değişkenlerihayır (ayrı kapsam)evet
Birden çok deyimevetevet

Ayrıştırılan tam yazım:

EXECUTE STATEMENT ( <metin> )
  [ ( <ifade>, … [EXCESS] <ad> := <ifade>, … ) ]
  [ON EXTERNAL [DATA SOURCE] <ifade>]
  [AS USER <ifade>] [PASSWORD <ifade>] [ROLE <ifade>]
  [WITH CALLER PRIVILEGES]
  [WITH {AUTONOMOUS | COMMON} [TRANSACTION]]
  [INTO <hedefler>]

INTO uygulanır: dinamik metin bir sonuç kümesi üretmeli (SELECT ya da RETURNS'lü EXECUTE BLOCK), tek satırı hedeflere yazar — satır yoksa hedefler değişmez, ikinci satır MULTIPLE_ROWS_SELECTED, sütun sayısı uyuşmazsa INVALID_PARAMETER, sonuç kümesi üretmeyen deyim NOT_A_RESULTSET_STATEMENT. Değerler hedefin bildirilmiş tipine çevrilir. Birden çok satır için FOR EXECUTE STATEMENT … INTO … DO kullanılır (gövde her satır için çalışır; WITH AUTONOMOUS TRANSACTION ile birleşmez).

Dikkat

WITH CALLER PRIVILEGES ve WITH AUTONOMOUS/COMMON TRANSACTION uygulanmıştır. Yerel çalıştırmada parametre listesi (konumsal ve := ile adlandırılmış) ayrıştırılır ama bağlanmaz. Dış veri kaynağında (aşağıda) konumsal ? parametreleri bağlanır.

Dış veri kaynağı: ON EXTERNAL

ON EXTERNAL [DATA SOURCE] <kaynak> yazılan deyimin metni IVEDI'de derlenmez: dış veritabanının kendi lehçesinde, olduğu gibi oraya gönderilir. AS USER, PASSWORD ve ROLE bağlantının kimliğidir.

Kaynak metniBağlanılan yer
'sunucu[/port]:yol', 'yol'Firebird (öneksiz varsayılan)
'host=… port=… dbname=… [user=…] [password=…]'PostgreSQL (libpq biçimi)
'firebird:…', 'postgresql:…', 'sqlite:…'önekin söylediği sağlayıcı
'ivedi:sunucu[:port]/veritabanı'başka bir ajanın /ivedi ucu
EXECUTE STATEMENT ('SELECT CARI_ISLEM_NO FROM CARIISLM WHERE TAKIP_NO = ?') (:bordro)
  ON EXTERNAL conn.service_url AS USER conn.kullanici_adi PASSWORD sifre
  INTO :cari_islem_no;
  • İşlem: WITH COMMON TRANSACTION (öntanımlı) dış işi çağıranın işlemine bağlar — yerel COMMIT onu da kalıcı yapar, yerel ROLLBACK onu da geri alır; aynı işlem içinde aynı kaynak ve kimliğe giden deyimler aynı dış işlemi paylaşır. İki aşamalı commit yoktur: yerel commit başarılı olduktan sonra dış commit denenir, düşerse hata verilir. Bir savepoint'e geri dönmek dış işi geri almaz. WITH AUTONOMOUS TRANSACTION dış işi deyimin sonunda commit eder.
  • Parametreler: konumsal ? parametreleri bağlanır; adlandırılmış parametre (ad := ifade) dış kaynakta kabul edilmez (UNSUPPORTED_FEATURE).
  • INTO tek satırı hedeflere yazar (satır yoksa hedefler değişmez); FOR EXECUTE STATEMENT … ON EXTERNAL … INTO … DO satırlar üzerinde döner (AUTONOMOUS ile birleşmez).
  • Bağlantılar süreç başına havuzdan alınır ve işlem bitince havuza döner.

PostgreSQL çevrimi. #MODE CONVERT TO POSTGRESQL deyimi dblink eklentisiyle yazar (eklenti hedef veritabanında kurulu olmalıdır: CREATE EXTENSION dblink):

KaynakPostgreSQL metni
sonuçsuz deyimPERFORM dblink_exec(<bağlantı>, <metin>)
INTO a, bSELECT t.c1, t.c2 INTO a, b FROM dblink(…) AS t(c1 <a'nın tipi>, c2 <b'nin tipi>)
FOR … INTO a, b DOFOR a, b IN SELECT * FROM dblink(…) AS t(…) LOOP
? parametreleriformat(replace(replace(<metin>, '%', '%%'), '?', '%L'), p1, …)
AS USER u PASSWORD pbağlantı dizesine ' user=' || u || ' password=' || p
Sınır

dblink yalnız PostgreSQL'e bağlanır ve her çağrıyı uzak tarafta kendi işleminde commit eder: PostgreSQL çıktısında dış iş yerel işlemle birlikte geri alınmaz (COMMON davranışı yoktur). INTO'da satır yoksa hedefler NULL olur. ROLE yazılamaz (hata). Uzak veritabanı Firebird ise deyimi içeren yordam IVEDI_ONLY yapılır: IVEDI motoru Firebird'e doğrudan bağlanır.

Dinamik metnin içinde yükselen istisnalar çağıranın işleyicisine ulaşır.