|
<< İçindekileri Görüntülemek İçin Tıklayın >> Yer: Teknik Kılavuzlar > IVEDI SQL Kullanıcı Kılavuzu > 10. Önişlemci > 10.5 Çalışma kipi ve dil çevirisi |
#MODE PRECOMPILE
#MODE EXECUTE
#MODE CONVERT TO {STANDARDSQL | FIREBIRD | POSTGRESQL | CSHARPORM} [STRICT]| Kip | Anlamı |
|---|---|
PRECOMPILE | Yalnız metin üretir, hiçbir şey çalıştırmaz |
EXECUTE | Normal motor |
CONVERT TO <hedef> | Deyimleri o lehçenin metni olarak yeniden üretir |
CONVERT TO <hedef> STRICT | Aynısı, ama yoruma indirilen her yapı hata verir |
STRICT yalnız o yönergenin parçasıdır: yazılmayan bir
#MODE CONVERT TO <hedef> onu kaldırır; #MODE EXECUTE ve
#MODE PRECOMPILE de kaldırır.
Bağlantının kipini onu kuran katman belirlemişse (dil sunucusu bağlantısı gibi) istemciden gelen metin
kipi değiştiremez: kipi değiştiren bir #MODE hata verir, bağlantının zaten içinde olduğu kipi
isteyen yönerge ise etkisiz kalır. #MODE PRECOMPILE kilitli bağlantıda her zaman reddedilir.
CONVERT TO kipi, aynı SQL'i başka bir motora taşımanın yoludur. Örnek:
#mode convert to postgresql
execute block
as
i integer;
begin
i = 5;
i = i + 1;
end;çıktısı:
do
$execute_block$
<<v_>>
declare
i integer;
begin
v_.i = 5;
v_.i = v_.i + 1;
end
$execute_block$
;POSTGRESQL ve FIREBIRD üretilen ve doğrulanan hedeflerdir: ikisinin de
çıktısı gerçek bir sunucuda koşturularak sınanır. STANDARDSQL metin üretir ama bir sunucuda
sınanmaz. CSHARPORM ayrıştırıcı tarafından kabul edilir ama koşucuları yoktur.
Firebird'e özgü: şema yoktur (Firebird 5), bu yüzden adlar şemasız üretilir ve
CREATE SCHEMA çevrilemez; LOCAL TEMPORARY tablo GLOBAL TEMPORARY
olarak üretilir; ON COMMIT DROP karşılıksızdır ve hata verir.
Hedef lehçede karşılığı olmayan bir işlevsel deyim sessizce geçilmez. Ham metin
geçişinde bir uyumsuzluğu hedef veritabanının kendisi yakalar; çevrimde araya motor girer ve işleyen bir
komutu yoruma çevirmek, o uyumsuzluğu ikisinin de yakalayamayacağı tek yer hâline getirir.
Hedefe göre değişen kod NATIVE_SQL(POSTGRESQL '…', FIREBIRD '…') ile, yalnız
IVEDI'de anlamlı olan nesne ATTRIBUTES (IVEDI_ONLY = TRUE) ile yazılır.
Deyimin hangi sınıfa girdiği çıktıyı belirler:
CREATE/ALTER/DROP SCHEMA ve ON COMMIT DROP, üretilmeyen hedeflerde
CREATE COLLATION.CREATE EXCEPTION, CREATE PACKAGE, IN AUTONOMOUS TRANSACTION,
ALTER USER … PASSWORD, SET CATALOG, CONNECT) öntanımlı olarak
yorum olarak geçer; STRICT ile hata verir ve hiçbir metin üretmez.
Hata SQLSTATE 0A000 ile gelir ve neyin kaybolduğunu söyler.STRICT olsun olmasın: yorum
yazılmaz, hata verilmez. Bunlar IVEDI'ye özgü meta veri (SET ATTRIBUTES, COMMENT …
FOR LOCALE, BEGIN/END LEVEL, CREATE SYNONYM) ve nesnesi
IVEDI_ONLY olan her deyimdir.DROP … IF EXISTS'i yorum olarak geçer;
STRICT ile hata verir.ATTRIBUTES (IVEDI_ONLY = TRUE) ile yaratılan yordam, işlev, tetikleyici, görünüm, paket ve nesne
tipi yalnız IVEDI kataloğunda yaşar ve yalnız IVEDI motoru tarafından kullanılır:
#MODE CONVERT TO …, STRICT dâhil) onu yaratan, değiştiren,
düşüren, yorumlayan ya da ona hak veren deyimler ve ona başvuran üst düzey deyimler (EXECUTE
PROCEDURE, SELECT, INSERT …) hiç yazılmaz;EXECUTION STORAGE veritabanında da motor çalıştırır: çağrı depoya devredilmez; IVEDI_ONLY
tetikleyici, satırı IVEDI yazdığında tetiklenir (depoya doğrudan bağlanan istemcide tetiklenmez);VERIFY LEVEL onu doğrulamaz, sayısını bir NOT satırında bildirir.create function kdv_orani(tarih date) returns numeric(5,2) attributes (ivedi_only = true) as
begin
return 20;
end;
create procedure fiyat_hesapla(tutar numeric(18,2)) returns (sonuc numeric(18,2))
attributes (ivedi_only = true) as
begin
sonuc = tutar * (1 + kdv_orani(current_date) / 100);
suspend;
end;
create view v_ozet (id, toplam) attributes (ivedi_only = true) as select id, tutar from siparis;
create trigger siparis_iz for siparis after insert attributes (ivedi_only = true) as
begin
insert into siparis_log (id) values (new.id);
end;
create package yardimci attributes (ivedi_only = true) as
function kisalt(s varchar(100)) returns varchar(20);
end;Yazım yeri: yordam ve işlevde parametre ve RETURNS'ten sonra, görünümde AS'tan
önce, tetikleyicide olaydan sonra, paket ve nesne tipinde addan sonra. Nitelik öznitelik tablosunda değil,
nesnenin tip bayrağında (IVD$TYPE_FLAGS, 0x00200000) tutulur. Bir paketin ya da tipin üyeleri ve
bir görünümün tetikleyicileri sahibinin niteliğini taşır.
Kurallar (derlemede denetlenir, reddedilen nesne kataloğa girmez):
IVEDI_ONLY_NOT_ALLOWED, SQLSTATE 0A000).IVEDI_ONLY_REFERENCE, SQLSTATE 0A000). Ona başvuran nesne de IVEDI_ONLY
yapılır.SET ATTRIBUTES ile açılıp kapatılamaz; yeniden tanımda (CREATE OR ALTER,
ALTER … AS) ATTRIBUTES (IVEDI_ONLY = TRUE) yeniden yazılır. Nesnenin nerede
yaşadığını değiştirmek için nesne düşürülüp yeniden yaratılır.SET TERM
Bir PSQL gövdesi ; içerir; bu yüzden isql'e verilecek bir dosyada deyim sonlandırıcısı
değiştirilir. SET TERM IVEDI'nin tanıdığı bir deyimdir: kaynakta yazılır, Firebird hedefinde
karşılığı üretilir. Üretilen metin de onu izler: SET TERM ^ ; yazıldıktan sonraki deyimler
^ ile biter. Kural isql'inkiyle aynıdır: SET TERM deyiminin kendisi eski
sonlandırıcıyla biter.
set term ^ ;
create procedure p1(x integer) returns (n integer) as begin n = x + 1; suspend; end^
set term ; ^
Üretilen metinde nesne adları tırnaksız yazılır: PostgreSQL hedefinde küçültülerek,
Firebird hedefinde olduğu gibi. Böylece üretilen metin, aynı ada tırnaksız atıfta bulunan elle yazılmış
metinle yan yana durabilir; katlama her iki tarafta da aynı yönde çalışır. Tırnak yalnız ad tanımlayıcı
olarak yazılamıyorsa (örneğin tire içeren tr-x-icu) ya da ayrılmış bir sözcükse konur.
Bir deyimin hedef lehçede karşılığı yoksa sessizce düşmez: yerine, nedenini söyleyen bir
yorum üretilir (STRICT ile hata). Böylece çevrilmiş betiği okuyan kişi neyin
taşınmadığını görür. Aşağıdaki tablo, PostgreSQL hedefinin ne yaptığını özetler.
| Deyim | PostgreSQL çıktısı |
|---|---|
ALTER SEQUENCE | ALTER SEQUENCE; bütün yan tümceler birebir |
ALTER DOMAIN | ALTER DOMAIN … SET/DROP DEFAULT | RENAME TO; SET ATTRIBUTES atlanır |
ALTER VIEW … AS | CREATE OR REPLACE VIEW (PostgreSQL'de gövdeyi ALTER VIEW değiştirmez); RENAME TO birebir; SET ATTRIBUTES atlanır |
ATTRIBUTES ( … ) (her bildirimde), ALTER … SET ATTRIBUTES | Bildirimdeki öznitelikler üretilmez (IVEDI'ye özel, katalogda durur); yalnız SET ATTRIBUTES içeren ALTER atlanır |
ALTER ROLE, ALTER SCHEMA | RENAME TO; AUTHORIZATION → OWNER TO |
ALTER TRIGGER … ACTIVE|INACTIVE | ALTER TABLE … ENABLE|DISABLE TRIGGER (olay tetikleyicisinde ALTER EVENT TRIGGER) |
ALTER TRIGGER … POSITION n | ALTER TRIGGER … RENAME TO: PostgreSQL'de konum özniteliği yoktur, aynı olayın tetikleyicileri ada göre alfabetik koşar; üretilen ad bu yüzden konumu beş basamakla içerir (<ad>_00010) ve konumu değiştirmek adı değiştirmektir |
ALTER TRIGGER … RENAME TO | İki deyim: tetikleyici ve gövdesini taşıyan fonksiyon ayrı ayrı yeniden adlandırılır |
POST_EVENT '<ad>' | NOTIFY "<ad>"; iki motorda da olay COMMIT'te teslim edilir. Parametreli biçim çevrilmez |
CREATE TYPE | Yalnız üye değişkenlerden oluşan tip CREATE TYPE … AS (…) bileşik tipine çevrilir; metodu, kurucusu, iç içe tipi ya da INHERIT FROM'u olan tip yoruma çevrilir |
ALTER USER … PASSWORD | Yorum: katalogda yalnız tuzlu SHA-256 özeti durur (SHA256:<tuz>:<hex>), düz metin parola üretilemez ve basılmaz |
ALTER INDEX … ACTIVE|INACTIVE | Yorum: PostgreSQL'de bir dizin devre dışı bırakılamaz |
CREATE PACKAGE | Yorum: PostgreSQL'de paket yoktur |
CREATE DIRECTORY, CREATE CREDENTIAL | Yorum: karşılığı yok |
CREATE DATABASE LINK | Yorum: en yakın yapı postgres_fdw'dir ve tek deyimle kurulmaz |
CREATE SYNONYM | Atlanır: başvurular zaten derleyicide hedefe çözülür |
SET CATALOG, SET NAMES, SET AUTODDL, SET SQL DIALECT, SET TERM, CONNECT, DISCONNECT | Yorum |