10.5 Çalışma kipi ve dil çevirisi

<< İç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]
KipAnlamı
PRECOMPILEYalnız metin üretir, hiçbir şey çalıştırmaz
EXECUTENormal motor
CONVERT TO <hedef>Deyimleri o lehçenin metni olarak yeniden üretir
CONVERT TO <hedef> STRICTAynı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.

Kip kilidi

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$
;
Hedeflerin durumu

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.

Çevrilemeyen işlevsel kod

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:

  • Karşılığı hiç olmayan yapılar her zaman hata verir: Firebird'de CREATE/ALTER/DROP SCHEMA ve ON COMMIT DROP, üretilmeyen hedeflerde CREATE COLLATION.
  • Yoruma indirilen işlevsel yapılar (örneğin PostgreSQL'de 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.
  • IVEDI'ye özgü deyimler sessizce atlanır, 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.
  • Çevrim anında bulunamayan bir nesnenin DROP … IF EXISTS'i yorum olarak geçer; STRICT ile hata verir.

10.5.1 IVEDI_ONLY nesneler

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:

  • depoya DDL'i inmez: Firebird / PostgreSQL / ODBC veritabanında fiziksel karşılığı yoktur;
  • metin çevriminde (#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):

  • Tablo, domain, istisna, dizi, harmanlama, kolon ve parametre IVEDI_ONLY olamaz; bunlar her zaman depoya gider (IVEDI_ONLY_NOT_ALLOWED, SQLSTATE 0A000).
  • IVEDI_ONLY olmayan bir nesne IVEDI_ONLY bir nesneye başvuramaz, çünkü depoda ve çevrilmiş metinde o nesne yoktur (IVEDI_ONLY_REFERENCE, SQLSTATE 0A000). Ona başvuran nesne de IVEDI_ONLY yapılır.
  • Nitelik 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.
Firebird ve 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 ; ^
Adlar tırnaksız üretilir

Ü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.

10.5.2 Karşılığı olmayan deyimler

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.

DeyimPostgreSQL çıktısı
ALTER SEQUENCEALTER SEQUENCE; bütün yan tümceler birebir
ALTER DOMAINALTER DOMAIN … SET/DROP DEFAULT | RENAME TO; SET ATTRIBUTES atlanır
ALTER VIEW … ASCREATE OR REPLACE VIEW (PostgreSQL'de gövdeyi ALTER VIEW değiştirmez); RENAME TO birebir; SET ATTRIBUTES atlanır
ATTRIBUTES ( … ) (her bildirimde), ALTER … SET ATTRIBUTESBildirimdeki öznitelikler üretilmez (IVEDI'ye özel, katalogda durur); yalnız SET ATTRIBUTES içeren ALTER atlanır
ALTER ROLE, ALTER SCHEMARENAME TO; AUTHORIZATION → OWNER TO
ALTER TRIGGER … ACTIVE|INACTIVEALTER TABLE … ENABLE|DISABLE TRIGGER (olay tetikleyicisinde ALTER EVENT TRIGGER)
ALTER TRIGGER … POSITION nALTER 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 TYPEYalnı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 … PASSWORDYorum: katalogda yalnız tuzlu SHA-256 özeti durur (SHA256:<tuz>:<hex>), düz metin parola üretilemez ve basılmaz
ALTER INDEX … ACTIVE|INACTIVEYorum: PostgreSQL'de bir dizin devre dışı bırakılamaz
CREATE PACKAGEYorum: PostgreSQL'de paket yoktur
CREATE DIRECTORY, CREATE CREDENTIALYorum: karşılığı yok
CREATE DATABASE LINKYorum: en yakın yapı postgres_fdw'dir ve tek deyimle kurulmaz
CREATE SYNONYMAtlanır: başvurular zaten derleyicide hedefe çözülür
SET CATALOG, SET NAMES, SET AUTODDL, SET SQL DIALECT, SET TERM, CONNECT, DISCONNECTYorum