Užití SQL ve 4D v14 -15 ! ! Úvod !
Definice dat a přístup k datům jsou kritické momenty v řízení databází. Uživatelé potřebují schopnost definovat strukturu pro ukládání dat. Uživatelé také chtějí možnost přistupovat k datům uloženým v databázi za účelem práce s daty, a dotazy na data. 4D umožňuje uživatelům všechny úrovně přístupu. 4D také podporuje využívání SQL; populárního programovacího jazyka pro přístup k databázím. Tato technická poznámka bude dá 4D a SQL vedle sebe a dotýká se použití obou při přístupu k 4D databázi.
!Dále se bude 4D způsobem myslet tradiční přístup 4D vývoje a užití databáze a SQL doplňiújící způsob na zaákladě standardů SQL, i když ten je již dnes také 4D. !Rozhodující položkou pro každou databázi je způsob, jak uživatelé definují datové struktury, a
způsob, jak přistupují k datům uloženým v databázi. 4D je relační databázový systém a IDE, který umožňuje uživatelům obě funkce. 4D nabízí jednoduché grafické rozhraní pro uživatele k vytvoření jejich struktury. Uživatelé mohou vytvářet formuláře k úpravě svých osobních údajů v přátelským a intuitivním způsobem. Dále pak, 4D poskytuje nativní jazyk dotazů na data a provádění mnoha dalších funkcí. Kromě mateřského jazyka 4D, 4D podporuje použití SQL. SQL je standardní jazyk pro relační databázový systém, který umožňuje uživatelům provádět některé databázové úlohy, ktzeré 4D povoluje.
! 4D a SQL !
4D a SQL jsou dvě různé možnosti, které vývojář / uživatel databáze může použít při vytváření a správě databáze. Je několik důležitých základních operací, jež zahrnují definování struktury databáze, manipulaci s daty v databázi, a vytváření vztahů mezi tabulkami a polí.
!Při provádění některých operací databáze, 4D poskytuje uživateli s možnosti provedení operací buď programově (jazykem); nebo prostřednictvím grafického uživatelského rozhraní. !Při provádění stejné operace v SQL, musí vždy být použity standardní příkazy jazyka. Standardní SQL příkazy jako Select, Create, Delete, Drop, a Update lze použít k provedení mnoha důležitých operací databáze.
! Definice dat (struktury) a manipulace s daty !
Mnoho z databázových operací může být rozděleno do dvou základních kategorií. Kategorie operací jsou rozděleny podle toho, co operace dělá a druhu úkolů, které vykonává. Tyto dvě kategorie jsou definice dat (struktury) a manipulace s daty.
!
Definice dat (struktury) !Definice dat zahrnuje definování toho, jak budou data uložena. Jedná se o vytváření
tabulek a polí. To je v podstatě vytváření struktury pro data. V 4D, struktura může být vytvořena prostřednictvím editoru struktury:
!
1
*
!
Editor struktury poskytuje intuitivní grafické uživatelské rozhraní umožňující vytvořit a modifikovat tabulky a pole.
!
V SQL jsou používány pro totéž příkazy k vytvoření tabulky a pole. SQL příkazy CREATE, ALTER, TRUNCATE, a DROP sev zabývají definicí dat.
!! ! Operace definice dat (struktury) ! Operace pro definice dat definují strukturu databáze. Jedná se o vytváření, úpravy a mazání tabulky v databázi, spolu s poli a datovými typy. ! Vytvoření tabulky !Prvním krokem při budování databáze je vytvoření tabulky. Tento krok zahrnuje vytvoření názevu tabulky, a definování pole a datových typů. !4D Vytvořte tabulku přes editor struktury. Neexistujeí 4D příkaz k vytvoření tabulky programově.
!SQL
Chcete-li vytvořit tabulku v SQL, použijte příkaz SQL CREATE TABLE. Příkaz umožňuje uživateli definovat název tabulky, názvy polí, typy polí a vlastnosti pole.
!Příklad vytvoření tabulky v 4D SQL: !
CREATE TABLE tabulka_1 (
ID int NOT Null,
Název Varchar(255),
Primary Key (ID)
);
Kód výše vytvoří tabulku s názvem "tabulka_1" se dvěma poli (ID a Název).Pole "ID" je číslo, které nemůže být null. "ID" je také nastaven jako primární klíč. Pole "Název" je typu alfa. Varchar (255), v SQL je to řetězec o maximální délce 255 znaků.
2
Úpravy tabulky - Alter table
!Po vytvoření tabulky, je důležité mít schopnost existující tabulky upravovat, změnit. Chcete-li to provést, musí být tabulka změněna (alter). !4D !Ve 4D, mohou být tabulky měněny opět přes editor struktury Uživatel/vývojář může
Přidávat, mazat nebo modifikovat pole. Opět v klasickém 4D jazyku neexistuje příkaz pro tyto operace.
!SQL
SQL příkaz ALTER TABLE je používán k modifikaci existující tabulky v 4D databázi pomocí SQL. Níže je několik příkladů manipulace s užítím tohoto příkazu.
!!
--přidá Pole_2 type int to Tabulka_1
ALTER TABLE Tabulka_1 ADD Pole_2 int;
–-upraví Pole_1 z Tabulka_1 aby bylo typu int
ALTER TABLE table_1 ALTER COLUMN field_1 int;
—vymaže Pole_1 z Tabulka_1
ALTER TABLE Tabulka_1 DROP COLUMN Pole_1;
! Vymazání tabulky - Drop table
!
Jiný způsob modifikace tabulky je vymazání existující tabulky. Všechna pole, indexy, triggery a omezení jsou odstraněny spolu s odstraněnou tabulkou.
!4D !Ve 4D, mohou být tabulky vymazány opět jen přes editor struktury Tabulka, spolu se svázanými formuláři je přesunuta do koše. !SQL
SQL příkaz DROP TABLE je používán k vymazání existující tabulky v 4D databázi pomocí SQL. Na rozdíl od 4D tabulka není přenesena do koše, ale je natrvalo vymazána. Na druhou stranu všechny formuláře tabulky jsou do koše přesunuty.
!!
Drop Table table_1; --vymaže tabulka_1
! Operace manipulace dat
!
Operace manipulace dat pracujís daty v databázi. Tyto operace zahrnují vytvoření dat, vymazání dat a modifikaci existujících dat.
!
Zkrácení tabulky - Truncate table
!
3
Truncate table vymaže všechny záznamy z určené tabulky. Tabulka sama však zůstane zachována, tím se liší od DROP TABLE a patří tedy do manipulace s daty.
!
4D
Zázamy mohou být vymazány z tabulky jednoduše výběrem záznamů ve výstupním formuláři a když jsou zvýrazněny klepnutím na příslušné tlačítko nebo klávesy delete/backspace. Záznamy mohou být mazány i programem 4D příkazy TRUNCATE TABLE, DELETE RECORD, nebo DELETE SELECTION.
!
Truncate Table([tabulka_1]) //vymaže všechny záznamy z tabulka_1
!
SQL
SQL příkaz TRUNCATE TABLE odstraní všechna data/záznamy určené tabulky.
! TRUNCATE TABLE table_1; --vymaže všechny záznamy z tabulka_1 ! Výběr záznamů
!Manipulace dat pracuje s daty databáze. Tyto operace zahrnují i výběř (vyhledábí)
odpovídajících záznamů. když je skupina záznamů vybrána mohou operace výběru pracovat s tímto podvýběrem.
!
4D
Ve 4D jmůže být záznam či záznamy vybrány pomocí příkazu QUERY (a další z této skupiny) nebo ALL RECORDS Použití těchto příkazů přenese tento výběr do platného výběru. Platný výběr je ve 4D držen v paměti. Všechny operace manipulace dat jsou prováděny ke změně platného výběru.
!Platný výběr může být změněn pomocí: ! • Výběrem všech záznamů pomocí ALL RECORDS •
!
Vyhledáváním záznamů příkazy QUERY, QUERY BY FORMULA, QUERY BY EXAMPLE, QUERY SELECTION atd.
Např.
Query([tabulka_1];[tabulka_1]ID=1) All Records([tabulka_1])
!
SQL
SQL mohou být záznamy vybrány za pomoci příkazu SELECT. Na rozdíl od 4D nedrží 4D SQL výběr v paměti. Chcete-li zachovat záznamy vybrané, umístěte je do proměnné 4D. To lze provést pomocí klauzule INTO.
! Níže je syntaxe pro jednoduchý výběrový výrok:
!
Select (field_1;field_2,...,field_n)
From table_name
Where
Into (:$arr_1, :$arr_2, ...,:$arr_n);
! 4
Užití:
/*vybere záznamy z table_1 ode ID=1 a umístí výsledek do 4D proměných*/
Select * From table_1 Where ID=1 Into (:$var_ID, :$var_f1, :$var_f2);
! Vytvoření záznamů
!Vytváření záznamú je podstatné pro všechny databáze Na rozdíl od ostatních operací manipulace dat výběr zde není potřeba, 4D a SQL mají různé cesty jak to udělat. ! 4D
Ve 4D záznam může být vytvořen ručně z formuláře nebo programem. K vytvoření záznamu programem se používají příkazy CREATE RECORD a SAVE RECORD.
!
//Vytvoří záznam v table_1
Create Record([table_1]) [table_1]field_1:=”abc” [table_1]field_2:=123
Save Record([table_1])
SQL
K vytvoření zaznamu pomocí 4D SQL je používán příkaz INSERT.
!
- - vytvoří záznam v tabulce table_1
INSERT INTO table_1 (field_1, Field_2) VALUES (‘abc’,123)
! Vymazání záznamů
!Další zásadní funkce v databázi je schopnost odstranit existující záznamy. Předtím, než je možné záznam vymazat, musí být záznam nejdříve vybrán. ! 4D
! Ve 4D záznamy mohou být ručně nebo programově vymazány. Záznamy lze vymazat ručně výběrem v formuláři výstupu a stisknutím klávesy Backspace / Delete. 4D může taky odstranit záznamy programově pomocí 4D příkaz DELETE RECORD.
!
//vymaže jeden záznam v table_1
Query([table_1];[table_1]field_1=”abc”)
Delete Record([table_1])
//vymaže výběr záznamů v table_1
Query([table_1];[table_1]ID>10)
Delete Selection([table_1])
! SQL
!
Vymazat záznam pomocí SQL lze ve 4D příkazem DELETE. Koncept je mírně odlišný od 4D, protože neexistuje platný záznam či výběr k provedení operace Vymazat. Místo toho záznamy , které budou vymazány jsou určeny pomocí podmínek v klausuli WHERE příkazu.
!
5
—vymaže všechny záznamy v table_1 ode field_1=’abc’
DELETE FROM table_1 WHERE field_1=‘abc’;
—vymaže všechny záznamy v table_1 kde ID>10
DELETE FROM table_1 WHERE ID>10;
Podmínka WHERE určuje, který záznam vymazat. Jestliže nenexistuje podmínka where, jsou vymazány všechny záznamy.!
! !
Úprava záznamů
!Existující záznamy mohou být také modifikovány a aktualizovány. Před tím než lze záznam aktualizovat musí být nejdřív vybrán. ! 4D
!
Ve 4D záznamy lze aktualizovat ručně nebo programově. Záznamy lze aktualizovat ručně úpravami existujících záznamů ve formulářích pro vstup / výstup. Stávající záznamy mohou být aktualizovány programově pomocí třídy dotazů QUERY, a přiřazováním hodnot každému poli. Níže jsou uvedeny příklady různých způsobů, jak aktualizovat záznamy.
!//Upraví jeden záznam v table_1
Query([table_1];[table_1]ID=1) [table_1]field_1:=”def” [table_1]field_2:=456
Save Record([table_1]) //Upraví výběr záznamů v table_1 pomocí smyčky For
Query([table_1];[table_1]ID<10)
For($i;1;Records in selection([table_1]))
[table_1]field_1:=Uppercase([table_1]field_1)
Save Record([table_1])
Next Record([table_1])
End for //Upraví výběr záznamů v table_1 pomocí Apply To Selection (Použít na výběr)
Query([table_1];[table_1]ID<10)
Apply to selection([table_1];[table_1]field_1:=Uppercase([table_1]field_1) SQL
!
Chcete-li aktualizovat záznamy pomocí SQL užíjte SQL příkazu UPDATE. Podobně jako u DELETE příkazu, koncept je zde poněkud jiný než v 4D. Protože neexistuje žádný aktuální záznam k užití UPDATE operace, záznamy jež mají být aktualizovány, jsou určeny podmínkou v klauzuli WHERE.
!
Syntaxe:
//Upraví všechny záznamy v table_1 kde field_1=’”upravovanáhodnota’
UPDATE table_name SET fieldname1=’nováhodnota’ WHERE field_1=‘upravovanáhodnota’;
Užití:
//Upraví všechny záznamy v table_1 kde field_1=’”abc’
UPDATE table_1 SET field_1=’def’ WHERE field_1 = ‘abc’
Klauzule WHERE URČÍ, ktery záznam upravit. Není-li WHERE upraví se všechny záznamy tabulky.
6
! Vztahy
!
V relační databázi, jsou vztahy důležitý pojem. Vztahy umožňují různým polím a samostatným tabulkám se propojit. To má mnoho výhod, včetně těch, které umožní, aby byla data uložena do samostatných tabulek efektivně (normalizovaně).
!
4D
Vytváření vztahů v 4D lze provést ve editoru struktury. Vztahy lze natáhnout z jednoho pole do druhého. Pole skupina k jedinci a pole jedinec ke skupině jsou dvě protilehlé možnosti.
!
SQL
V SQL koncept cizího klíče definuje vztahy. Cizí klíč tabulky je spojen s primárním klíčem jiné tabulky.Primární klíč pro tabulku je pole (nebo kombinace polí) který jednoznačně identifikuje každý záznam v tabulce. Cizí klíč jiné tabulky bude odkaz na primární klíč jiné tabulky s cílem určit, které záznamy se k němu vztahují.
!
Definici (constraint) primární klíč a cizí klíč lze vytvořit pomocí CREATE TABLE, nebo přidat pomocí ALTER TABLE.
! —Vytvoření tabulky s cizím klíčem
Create Table Employees (
ID int Primary Key,
Name VarChar(50),
Company_ID int,
CONSTRAINT Emp_Comp FOREIGN KEY (Company_ID) REFERENCES Company(ID)
);
—Úprava existující tabulky přidáním primárního klíče
Alter Table Employees ADD PRIMARY KEY (ID); --Úprava existující tabulky přidáním cizího klíče
Alter Table Employees ADD CONSTRAINT Emp_Comp FOREIGN KEY (Company_ID) REFERENCES Company(ID);
Tabulka “jedinců” a Tabulka “skupin”
!
Předpokládejme následující tabulky:
V tomto nastavení je tabulka adres považován za tabulku "jedinců". Tabulka Faktura je-považován za tabulku "skupin". Chcete-li si zapamatovat tento koncept uvažte, že ”existuje mnoho (skupina( faktur vztahující se k jedné adrese", a "každa adresa může mít skupinu faktur". Stejně tak, pole v tabulce faktury , považovány za pole "skupin", zatímco soubory v tabulce adres jsou v
7
nazývány polem "jedninců". U tabulky faktur jsou terminologii SQL pole Bill_To a Ship_To cizí klíče s odkazem na primární klíč tabulky adres (pole ID). Vztehy jsou v tomto případě samozřejmě neautomatické.
! Navazování vztahů:
! Následující operace způsobí, že se vztah bude navázán (automatický):
! • Zadávání dat
• Listování v záznamech v výstupním formuláři
• Zprávy
• Operace na výběr záznamů (dotazy, třídění, užití výrazu)
!
Když se naváže automatický vztah, související záznamy jsou načteny a vybrány. Je-li vybráno více než jeden záznam, první záznam ve výběru je natažen do paměti.
!
V některých případech v příkazech a / nebo akcích uživatele je natažen pouze záznam (do formuláře). Vztažené záznamy nejsou však automaticky vybrány. V těchto případech vztažené záznamy se musí explicitně vybrat pomocí 4D příkazů RELATE ONE nebo RELATE MANY podle souvislosti a potřebujeme zpřístupniz záznamy ve vztahu.
!
One-to-many a many-to-one vztahy
!
Vztah one-to-many “jedinec ke skupině” nastává, když se odkazuje tabulka "jedniců" na související záznamy v tabulce "skupin". Chcete-li vytvořit vztah one-to-many v 4D je používán příkaz RELATE MANY.
Stejně tak vztah many-to-one “skupina k jedinci” nastává tehdy, když tabulka "skupin" se odkazuje na související záznam v tabulce "jedninců". Chcete-li vytvořit many-to-one vztah 4D, je používán příkaz RELATE ONE.
Relate one
!
RELATE ONE naváže automatický vztah jedince ke skupině z tabulky nebo pole jedinců k tabulce či poli skupin.
!
4D
V 4D RELATE ONE (manytable) naváže všechny automatické vztahy skupin k jedinci pro tuto tabulku skupin v platném procesu; nebo hledá záznamy týkající se manuálního neautomatického vztahu RELATE ONE (manyfield) a pokud existuje, načte související záznam do paměti, a vytvoří platný záznam a platný výběr pro tuto vztaženou tabulku.
!
Chcete-li zobrazit hodnoty adresního řádku se ve je vstupním formuláři faktury, musí se použít RELATRE ONE(patřičné pole skupin), vztah je neautomatický. Kód umožní zobrazit ve vstupním formuláři faktury vztažené adresy "ulice, město, stát, a PSČ”. Kód níže je v místě polí Bill_To a Ship_To jako makro.
!
Bill_To pole:
RELATE ONE([Invoice]Bill_To)
vStreet1:=[Address]Street
vCity1:=[Address]City
vState1:=[Address]State
vZIP1:=[Address]Zip
Ship_To pole:
8
RELATE ONE([Invoice]Ship_To)
vStreet2:=[Address]Street
vCity2:=[Address]City
vState2:=[Address]State
vZIP2:=[Address]Zip
! Výsledný vstupní formulář vypadá následovně:
!
! ! ! SQL
!
V SQL, odkazujem na pole "jedinců" z tabulky "skupin", použijeme join tabulky "jedninců" na tabulku "skupin" a související pole/sloupce. Níže je syntaxe:
!
Select one_field (s)
From one_table join many_table on one_field_value=many_field_value
!
Chcete-li zobrazit související položky tabulky Adresa, musíme připojit tabulku adres s tabulkou faktury, kde adresa primární klíč (id), se rovná cizí klíč ve faktuře (Bill_To a Ship_To).
Použijte níže uvedený kód na makrech polí Bill_To a Ship_To k zobrazení souvisejícího záznamu Adresa.
!
9
Kód v Bill_To poli:
!
Begin SQL
Select * From Address join Invoice on Address.ID=Invoice.Bill_To
End SQL
//Uloží hodnoty sloupce z Address do 4D proměnných
vStreet1:=[Address]Street
vCity1:=[Address]City
vState1:=[Address]State
vZip1:=[Address]Zip
Kód v Ship_To poli:
!
Begin SQL
Select * From Address join Invoice on Address.ID=Invoice.Ship_To
End SQL
/Uloží hodnoty sloupce z Address do 4D proměnných
vStreet2:=[Address]Street
vCity2:=[Address]City
vState2:=[Address]State
vZip2:=[Address]Zip
! Relate many
!
RELATE MANY ustavuje všechny vztahy jedince k skupině vztazích pro tabulky nebo pole jedinců. Tento příkaz se používá v souvislosti s tabulkami "jedinců".
!
4D
Když je zobrazen formulář tabulky jedinců "One" (Address), související záznamy z tabulky "skupin" (faktury) jsou načteny a stalou se platným výběrem v této tabulce.
Avšak pokud je vybrán záznam pro tabulku "jedinců" (adresa) programově vztažené záznamy z tabulky "skupin" (faktury), nejsou načteny. V tomto případě, musí být použit příkaz RELATE MANY k načtení vztažených záznamů.
!
V níže uvedeném příkladu je vybrán jeden ze záznamu tabulky adres a je zobrazen ve vstupním formuláři programově. RELATE MANY se používá k načtení záznamů vztažených faktur.
!
//vyhledání, navázání relace, úpravy
QUERY([Customers];[Customers]ID=1)
RELATE MANY([Customers])
$winref:=Open form window([Customers];"Input") DIALOG([Customers];"Input")
CLOSE WINDOW($winref)
!
Spuštěním výše uvedeného kódu se zobrazí vstupní formulář se záznamem tabulky adres, kde Addres’ID je 1. Veškeré faktury související s tímto záznamem se zobrazí v podformuláři Address'Invoices.!
10
! SQL
V SQL odkazujeme na pole “Many” z pole “One” tabulky, propojíme je pomocí join tabulky “many” s tabulkou “one”. Syntaxe je níže
! !
Select many_field(s)
From many_table Join one_table on many_field_value=one_field_value;
! Níže je uveden příklad, kterým se zavádí vzteh jeden k mnoha. Jakmile se ustaví vztah, záznamy faktur ve vztažené skupině jsou zobrazeny ve vstupním formuláři tabulky jedinců (adresa). Nejprve uvede do vztahu dvě tabulky pak vybere související skupinu faktur, pokud adresa ID = 1. Nakonec umístí záznamy do polí a ty pak mohou být zobrazeny v listboxu.
! ! !
Select * From Invoice join Address
on (Invoice.Bill_To=Address.A_ID or Invoice.Ship_To=Address.ID)
Where Address.ID=1
Into :arrID, :arrBill, :arrShip,
11
Závěr To byl dvojí pohled do 4D a porovnání klasické cesty a využitím SQL z hlediska zakládání datové struktury a manipulace s daty. SQL mocný nástroj pro konečného uživatele, ale z hlediska vývojáře je nutno posoudit, kam až uživatele pustí, bez nebezpečí pro strukturu dat a integritu dat.
! Nové rysy v SQL v14 View
Integrovaný engine 4D v14 podporuje standardní SQL view. Je to virtuální tabulka, jež může být sestavena za běhu naplněna z několika pevných tabulek databáze a upravena výpočty. Když je tabulka view definována, můžeme na ni používat příkazy jazyka SQL jako třeba SELECT tak jako na pevnou tabulku. Údaje vyskytující se ve view, pohledu, jsou definovány pomocí definice dotazu na základě příkazu SELECT. Skutečné pevné tabulky použité v definici dotazu se nazývají "výchozí" tabulky. SQL view obsahuje sloupce a řádky stejně jako standardní tabulky, ale ve skutečnosti neexistují; je to jen reprezentace vzniklá při zpracování a jsou uloženy v paměti. Pouze definice pohledu je ve skutečnosti uložena v databázi. Pro ovládání view jsou používány ve 4Dv14 dva příkazy
CREATE VIEW
!
CREATE [OR REPLACE] VIEW [schema_name.]view_name [(column_list)] AS select_statement[;]
Příkaz CREATE VIIEW vytvoří SQL pohled pro prohlížení s názvem view_name (což je standardní sql_name), obsahuje sloupce definované v parametru column_list. Pokud je tabulka pouhou kopií trvalé tabulky nemusíte zatat názvy a typy sloupců. Název sloupce budete muset zadat, pokud tento sloupec je funkce nebo je odvozen z aritmetického výrazu (skalární). Rovněž je nutné zadat název sloupce, pokud chcete, aby jste vyhnuli různým sloupcům se stejným názvem (například během operace JOIN), nebo po chcete použít jiný název sloupce, než ten, ze kterého je tento odvozen. Jestliže je parametr column_list zadán, musí obsahovat stejný počet sloupců, jako select_statememt definující podmínku hledání záznamů pro pohled. Jestliže je column_list vynechán, budou mít sloupce pohledu tytéž názvy jako v podmínce hledání select_statement. View jako tabulky musí mít jedinečné názvy Jestliže předáte možnost OR REPLACE, view je automaticky přepsáno jestliže již existuje. Tato možnost muže být užitečná ke zmněně definice již existujícího view bez použití více kroků vymazat/znovuzaložit přístupová práva k objektům již definovaným pro toto view. Když možnost OR REPLACE není předána a snažíme se vytvořit view s již existujícím názvem vrátí se chyba. schema_name je také standardní sql_name a můžete ho použít k označení názvu schématu, který obsahuje pohled. Pokud npředáte schema_name, nebo předáte název schématu, který neexistuje, pohled je automaticky přiřazen do výchozího schématu, který se nazývá "DEFAULT_SCHEMA".
12
select_statement označuje příkaz SELECT, který definune definice dotaz pohledu. Select_statement je stejný jako standardní SELECT v 4D, ale s těmito výjimkami: •
nelze použít příkazy INTO, LIMIT nebo OFFSET. Omezení, ofset nebo přiřazení proměnných v 4D, ale mohou být provedena v SELECT při volání/použití pohledu.
•
nelze použít klauzuli GROUP BY.
•
pohledy jsou v režimu pouze pro čtení a nelze je aktualizovat.
Definice view je "statická", a není aktualizována pokud je zdrojová tabulka upraví nebo i odstraní. Konkrétně žádný sloupec přidáný později do tabulky se nezobrazí v pohledu založeném na této tabulce. Stejně tak, pokud se pokusíte o přístup k sloupcům odstraněném z tabulky pomocí (nové) definice pohledu, způsobí to chybu. Nicméně, pohled odkazující se na odstraněné zdrojové view bude i nadále pracovat. Ve skutečnosti, když vytvoříte pohled, převede se jakýkoliv odkaz view do odkazů na zdrojové tabulky. Pohledy mají globální dosah. Jakmile je pohled vytvořen pomocí CREATE VIEW, lze k němu přistupovat pomocí všech částí aplikace (4D remote pomocí SQL, externí databáze vytvořené pomocí příkazu CREATE DATABASE, jiné databáze pomocí příkazu login SQL, atd.). A kdykoliv, dokud není odstraněn pomocí příkazu DROP VIEW.
Příklady Je definována tabulka Lidé obsahující následující sloupce!
!
ID
INT64
FIRST_NAME
VARCHAR(30)
LAST_NAME
VARCHAR(30)
DEPARTMENT
VARCHAR(30)
SALARY
INT
Dále je několik příkladů!
!
•
view s žádnými omezeními:
CREATE VIEW FULLVIEW AS SELECT * FROM PEOPLE;
•
view s "horizontalním" omezením na obeah tabulky. Když např. chcete zobrazit pouze lidi z dapartementu Marketing:
CREATE VIEW HORIZONTALVIEW (ID, FirstName, LastName, Salary) AS
SELECT ID, FIRST_NAME, LAST_NAME, SALARY FROM PEOPLE
WHERE DEPARTMENT = 'Marketing';
•
složené view:
CREATE VIEW AGGREGATEVIEW (FirstName, LastName AnnualSalary) AS
SELECT FirstName, LastName, SALARY*12 FROM PEOPLE;
•
pohled s "vertikálním" omezením na počet sloupců. Když např. nechcete zobrazit sloupec SALARY:
13
CREATE VIEW VERTICALVIEW (ID, FirstName, LastName, Department) AS
SELECT ID, FIRST_NAME, LAST_NAME, DEPARTEMENT FROM PEOPLE;
Když je view již definováno můžete jeu používat jako standardní tabulku. Např. chcete získat všechny lidi jejichž výplata je větší než 5,000 Euro a chceme je zobrazit v listboxu:
SELECT * FROM FULLVIEW
WHERE SALARY < 5000
INTO :aID, :aFirstName, :aLastName, :aDepartment, :aSalary;
Další příklad, chcete získat každou osobu v department Marketing, jejichž jmého je "Michael":
SELECT ID, LastName, Salary FROM HORIZONTALVIEW
WHERE FirstName='Michael'
INTO :aID, :aLastName, :aSalary;
!
DROP VIEW
DROP VIEW [IF EXISTS] [schema_name.]view_name[;] Příkaz DROP VIEW vymaže view s názvem view_name z databáze. Když je předáno omezení IF EXISTS neudělá nic a nevrátí chybu, pokud view již neexistuje.
schema_name je standardní sql_name a můžete ho použít k označení názvu schématu, který obsahuje pohled. Pokud npředáte schema_name, nebo předáte název schématu, který neexistuje, pohled je automaticky přiřazen do výchozího schématu, který se nazývá “DEFAULT_SCHEMA".
Nové možnosti v ALTER TABLE Příkaz SQL ALTER TABLE nyní přijímá nové možnosti: ! [Trailing] (používá se s klíčovým slovem ADD): vynutí si vytvoření sloupce jež má být vytvořen po posledním existujícím sloupci tabulky v souboru struktury. Tato volba je užitečná když sloupce obsahující data byly vymazány z tabulky (aniž by byla smazána data), aby se zabránilo že existující data jsou předána do nově definovaného sloupce. ! povolení / zakázání žurnálování pro tabulky ! povolení / zakázání "AutoIncrement" možnost pro typ LongInt pole ! zapnutí / vypnutí volby "Auto UUID" pro alfa pole typu UUID.
ALTER TABLE sql_name
{ADD column_definition [PRIMARY KEY] [TRAILING]| DROP sql_name |
ADD primary_key_definition |
DROP PRIMARY KEY |
ADD foreign_key_definition |
DROP CONSTRAINT sql_name |
[{ENABLE | DISABLE} REPLICATE] |
[{ENABLE | DISABLE} LOG] |
[{ENABLE | DISABLE} AUTO_INCREMENT] |
[{ENABLE | DISABLE} AUTO_GENERATE] |
SET SCHEMA sql_name}
14
Příkaz vrátí chybu:
! Když je volitelný parametr ENABLE LOG přijat a žádný platný primární klíč není definován,
! pokud se pokusíte změnit nebo odstranit definici primárního klíče tabulky bez zakázání žurnálování pomocí DISABLE LOG.
Ve verzi v14R3
ALTER DATABASE {ENABLE | DISABLE} {INDEXES | CONSTRAINTS | TRIGGERS}!
Příkaz umožňuje povolit/zakázat triggery pro všechny tabulky v aktuální databázi pro aktuální relace (tj pro všechny uživatele a procesy dokud databáze není restartována).!
!
Optimalizace v14R4
SQL SELECT DISTINCT"
! Příkaz funguje rychleji o 80%! !
Begin SQL! SELECT DISTINCT Names FROM Employees INTO :$Emp;! End SQL!
!
Optimalizace v14R5
SQL GROUP BY/ORDED BY"
!
Spuštění SELECT pomocí Group by, pokud jsou použity pro jednotlivé tabulky je asi desetkrát rychleji než dříve. Složitější případy, zejména s tabulkami v relaci, byly také optimalizovány pro běh až desetkrát rychlejší.!
15