|
<< İç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> …| Özellik | EXECUTE STATEMENT | EXECUTE EMBEDDED |
|---|---|---|
| Derleme yolu | Üst seviye derleyici | Yalnızca PSQL blok derleyicisi |
| DDL çalıştırabilir | evet | hayır — sözdizimi hatası |
| Çağıranın yerel değişkenleri | hayır (ayrı kapsam) | evet |
| Birden çok deyim | evet | evet |
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).
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.
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 metni | Bağ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;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.? parametreleri bağlanır; adlandırılmış parametre
(ad := ifade) dış kaynakta kabul edilmez (UNSUPPORTED_FEATURE).FOR EXECUTE STATEMENT …
ON EXTERNAL … INTO … DO satırlar üzerinde döner (AUTONOMOUS ile birleşmez).PostgreSQL çevrimi. #MODE CONVERT TO POSTGRESQL deyimi dblink eklentisiyle
yazar (eklenti hedef veritabanında kurulu olmalıdır: CREATE EXTENSION dblink):
| Kaynak | PostgreSQL metni |
|---|---|
| sonuçsuz deyim | PERFORM dblink_exec(<bağlantı>, <metin>) |
INTO a, b | SELECT t.c1, t.c2 INTO a, b FROM dblink(…) AS t(c1 <a'nın tipi>, c2 <b'nin tipi>) |
FOR … INTO a, b DO | FOR a, b IN SELECT * FROM dblink(…) AS t(…) LOOP |
? parametreleri | format(replace(replace(<metin>, '%', '%%'), '?', '%L'), p1, …) |
AS USER u PASSWORD p | bağlantı dizesine ' user=' || u || ' password=' || p |
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.