Příručka aplikace Base 7.3
Dodatek B
Porovnání HSQLDB a Firebird
Datové typy a funkce
Tento dokument je chráněn autorskými právy © 2022 týmem pro dokumentaci LibreOffice. Přispěvatelé jsou uvedeni níže. Dokument lze šířit nebo upravovat za podmínek licence GNU General Public License (https://www.gnu.org/licenses/gpl.html), verze 3 nebo novější, nebo the Creative Commons Attribution License (https://creativecommons.org/licenses/by/4.0/), verze 4.0 nebo novější.
Všechny ochranné známky uvedené v této příručce patří jejich vlastníkům.
Pulkit Krishna |
Steve Fanning |
Olivier Hallot |
Randolph Gamo |
Robert Großkopf |
Pulkit Krishna |
Jost Lange |
Hazel Russman |
Jochen Schiffers |
Jean Hollis Weber |
|
|
Jakékoli připomínky nebo návrhy k tomuto dokumentu prosím směřujte do fóra dokumentačního týmu na adrese https://community.documentfoundation.org/c/documentation/loguides/ (registrace je nutná) nebo pošlete e-mail na adresu: loguides@community.documentfoundation.org.
Poznámka
Vše, co napíšete do fóra, včetně vaší e-mailové adresy a dalších osobních údajů, které jsou ve zprávě napsány, je veřejně archivováno a nemůže být smazáno. E-maily zaslané do fóra jsou moderovány.
Vydáno Srpen 2022. Založeno na LibreOffice 7.3 Community.
Jiné verze LibreOffice se mohou lišit vzhledem a funkčností.
Některé klávesové zkratky a položky nabídek jsou v systému macOS jiné než v systémech Windows a Linux. V následující tabulce jsou uvedeny nejdůležitější rozdíly, které se týkají informací v této knize. Podrobnější seznam se nachází v nápovědě aplikace.
Windows nebo Linux |
Ekvivalent pro macOS |
Akce |
Výběr v nabídce Nástroje > Možnosti |
LibreOffice > Předvolby |
Otevřou se možnosti nastavení. |
Klepnutí pravým tlačítkem |
Ctrl + klepnutí a/nebo klepnutí pravým tlačítkem v závislosti na operačním systému počítače |
Otevře se místní nabídka. |
Ctrl (Control) |
⌘ (Command) |
Používá se také s dalšími klávesami. |
Alt |
⌥ (Option) |
Používá se také s dalšími klávesami. |
Ctrl+Q |
⌘ + Q |
Ukončí LibreOffice |
Tabulky v tomto dodatku jsou převzaty z příruček pro HSQLDB a Firebird.
Informace pro interní HSQLDB jsou stejné jako v dodatku A této knihy.
Dodatečná interní databáze Firebird je klasifikována jako experimentální.
V tabulkách je nejprve uvedeno srovnání funkcí, zejména funkcí, které jsou na fórech oblíbené, jako např.:
Přidání určitého počtu dní k datu (DATEADD)
Hodnoty z více datových řádků seskupené do jednoho datového řádku (LIST)
jsou v současné době k dispozici pouze v externí databázi Firebird, ale ne v interní verzi.
Ve vestavěných databázích jsou k dispozici následující funkce. Jednu nebo dvě funkce lze použít pouze při volbě Spustit SQL příkaz přímo. V tomto režimu nelze dotazy upravovat.
Funkce, které pracují s grafickým uživatelským rozhraním, jsou označeny [funguje v grafickém uživatelském rozhraní]. Funkce, které fungují pouze v přímých příkazech SQL, jsou označeny [nefunguje v grafickém uživatelském rozhraní].
Upozornění
Protože se zde jedná o čísla s pohyblivou řádovou čárkou, dbejme na nastavení polí v dotazech. Většinou je omezeno zobrazování desetinných míst, což může v některých případech vést k neočekávanému chování. Například ve sloupci 1 může být uvedeno 0,00, ale ve skutečnosti obsahuje 0,001 a ve sloupci 2 1000. Pokud je sloupec 3 nastaven tak, aby zobrazoval sloupec 1 * sloupec 2, zobrazí se ve skutečnosti 1.
Tabulka 1: Číselné funkce
HSQLDB |
Firebird |
|||
Syntaxe |
Popis |
Syntaxe |
Popis |
|
ABS(d) |
Vrací absolutní hodnotu čísla. [funguje v grafickém uživatelském rozhraní] |
ABS(d) |
|
|
ACOS(d) |
Vrací arkuskosinus. [funguje v grafickém uživatelském rozhraní] |
ACOS(d) |
|
|
ASIN(d) |
Vrací arkussinus. [funguje v grafickém uživatelském rozhraní] |
ASIN(d) |
|
|
ATAN(d) |
Vrací arkustangens. [funguje v grafickém uživatelském rozhraní] |
ATAN(d) |
|
|
ATAN2(a,b) |
Vrací arkustangens prostřednictvím souřadnic. 'a' je hodnota osy x, 'b' je hodnota osy y. |
ATAN2(x,y) |
|
|
BITAND(a,b) |
"a“ i "b" jsou uvedeny formou binárního zápisu. Musí mít na stejné pozici '1', aby výsledek byl '1'. |
BIN_AND(x,y [,z...]) |
|
|
BITOR(a,b) |
"a“ i "b" jsou uvedeny formou binárního zápisu. Aby výsledek pro danou pozici byl „1“, musí být na stejné pozici v "a" nebo v "b" hodnota „1“. |
BIN_OR(x,y [,z...]) |
|
|
|
|
BIN_SHL(n,exp) |
n · 2 exp [funguje v grafickém uživatelském rozhraní] |
|
|
|
BIN_SHR(n,exp) |
n / 2 exp |
|
|
|
BIN_XOR(x,y [,z...]) |
"a“ i "b" jsou uvedeny formou binárního zápisu. Aby výsledek pro danou pozici byl „1“, musí být na stejné pozici v "a" nebo v "b" hodnota „1“. |
|
CEILING(d) |
Určuje nejmenší celé číslo, které není menší než d. [funguje v grafickém uživatelském rozhraní] |
CEIL(d) CEILING(d) |
|
|
COS(d) |
Vrací kosinus. [funguje v grafickém uživatelském rozhraní] |
COS(radians) |
Radiány lze také znázornit pomocí úhlu (zde pro jednotkovou kružnici): |
|
|
|
COSH(d) |
Vrací hyperbolický kosinus. |
|
COT(d) |
Vrací kotangens. [funguje v grafickém uživatelském rozhraní] |
COT(d) |
|
|
DEGREES(d) |
Převádí radiány na stupně. [funguje v grafickém uživatelském rozhraní] |
|
|
|
EXP(d) |
Vrací hodnotu d-té mocniny čísla e ( e: (2.718...) ). [funguje v grafickém uživatelském rozhraní] |
EXP(d) |
|
|
FLOOR(d) |
Vrací největší celé číslo, které není větší než d. [funguje v grafickém uživatelském rozhraní] |
FLOOR(d) |
|
|
LOG(d) |
Vrací přirozený logaritmus se základem 'e'. |
LN(d) |
|
|
LOG10(d) |
Vrátí logaritmus o základu 10. [funguje v grafickém uživatelském rozhraní] |
LOG10(d) |
|
|
|
|
LOG(base,d) |
Vrátí logaritmus čísla d při základu base. |
|
MOD(a,b) |
Vrací zbytek jako celé číslo, které vznikne dělením 2 celých čísel. |
MOD(a,b) |
|
|
PI() |
Vrací π (3.1415...) [funguje v grafickém uživatelském rozhraní] |
PI() |
|
|
POWER(a,b) |
ab , POWER (2,3) = 8, protože 2^3 = 8 |
POWER(x,y) |
|
|
RADIANS(d) |
Převádí stupně na radiány. [funguje v grafickém uživatelském rozhraní] |
|
|
|
EDGE() |
Vrátí náhodné číslo x větší nebo rovno 0,0 a menší než 1,0. [funguje v grafickém uživatelském rozhraní] |
EDGE( ) |
|
|
ROUND(a,b) |
Zaokrouhluje číslo a na b číslic za desetinnou čárkou. [funguje v grafickém uživatelském rozhraní] |
ROUND(d [, místa]) |
Zaokrouhluje po zadaném počtu číslic od desetinné čárky. |
|
ROUNDMAGIC (d) |
Řeší problémy se zaokrouhlováním způsobené čísly s pohyblivou řádovou čárkou. 3,11 – 3,1 – 0,01 nemusí být přesně 0, ale v grafickém uživatelském rozhraní se zobrazuje jako 0. ROUNDMAGIC ji změní na skutečnou hodnotu 0. [funguje v grafickém uživatelském rozhraní] |
|
|
|
SIGN(d) |
Vrací –1, pokud je 'd' menší než 0; 0, pokud je 'd' rovno 0; a 1, pokud je 'd' větší než 0. [funguje v grafickém uživatelském rozhraní] |
SIGN(d) |
|
|
SIN(A) |
Vrací sinus úhlu v radiánech. |
SIN(radians) |
|
|
|
|
SINH(d) |
Vrací hyperbolický sinus. |
|
SQRT(d) |
Vrací druhou odmocninu. [funguje v grafickém uživatelském rozhraní] |
SQRT(d) |
|
|
TAN(A) |
Vrací tangens úhlu v radiánech. |
TAN(radians) |
|
|
|
|
TANH(d) |
Vrací hyperbolický tangens. |
|
TRUNCATE (a,b) |
Ořízne znaky „a“ až „b“ za desetinnou čárkou. TRUNCATE(2.37456.2) = 2.37 [funguje v grafickém uživatelském rozhraní] |
TRUNC(d[,jobs]) |
Nastaví na 0 po zadaném počtu číslic od desetinné čárky. |
Tabulka 2: Textové funkce
Tabulka 3: Funkce data a času
HSQLDB |
Firebird |
||
Syntaxe |
Popis |
Syntaxe |
Popis |
|
|
DATEADD ( n DAY TO date ) DATEADD (DAY, n, date) |
n je celé číslo a pro odčítání může být i záporné. |
DATEDIFF (string, datetime1, datetime2) |
Rozdíl mezi dvěma daty nebo časy. Položka v řetězci rozhoduje o tom, v jaké jednotce se rozdíl zobrazí: ms“ = „milisekunda“, „ss“ = „sekunda“, „mi“ = „minuta“, „hh“ = „hodina“, „dd“ = „den“, „mm“ = „měsíc“, „yy“ = „rok“. Lze použít dlouhou i krátkou verzi řetězce. [funguje v grafickém uživatelském rozhraní] |
DATEDIFF ( DAY FROM date TO date ) DATEDIFF (DAY, date, date) |
Viz DATEADD. |
EXTRACT ({YEAR|MONTH |DAY|HOUR| MINUTE| SECOND} FROM <date or time value>) |
Může nahradit mnoho funkcí data a času. Vrátí rok, měsíc, den atd. z hodnoty data nebo denního času. |
EXTRACT ({YEAR| MONTH | WEEK | DAY | WEEKDAY | YEARDAY | HOUR | MINUTE | SECOND | MILLISECOND } FROM <hodnota data nebo času>) |
WEEKDAY Sunday = 0 YEARDAY January 1st = 0 WEEK 1. týden: min. 4 dny v roce |
DAY(date) |
Vrátí den v měsíci (1-31). [funguje v grafickém uživatelském rozhraní] |
|
|
DAYNAME (date) |
Vrátí anglický název dne. [funguje v grafickém uživatelském rozhraní] |
|
|
DAYOFMONTH (date) |
Vrací den v měsíci (1-31), synonymum pro DAY(). [funguje v grafickém uživatelském rozhraní] |
|
|
DAYOFWEEK (date) |
Vrátí den v týdnu jako číslo (1 znamená neděli.) [funguje v grafickém uživatelském rozhraní] |
|
|
DAYOFYEAR (date) |
Vrátí den v roce (1-366). [funguje v grafickém uživatelském rozhraní] |
|
|
HOUR(time) |
Vrátí hodinu (0-23). [funguje v grafickém uživatelském rozhraní] |
|
|
MINUTE(time) |
Vrátí minutu (0-59). [funguje v grafickém uživatelském rozhraní] |
|
|
MONTH(date) |
Vrátí měsíc (1-12). [funguje v grafickém uživatelském rozhraní] |
|
|
MONTHNAME (date) |
Vrátí anglický název měsíce. [funguje v grafickém uživatelském rozhraní] |
|
|
QUARTER (date) |
Vrátí čtvrtletí roku (1-4). [funguje v grafickém uživatelském rozhraní] |
|
|
SECOND(time) |
Vrátí sekundy času (0-59). [funguje v grafickém uživatelském rozhraní] |
|
|
WEEK(date) |
Vrátí týden v roce (1-53). [funguje v grafickém uživatelském rozhraní] |
|
|
YEAR(date) |
Vrátí rok ze zadaného data. [funguje v grafickém uživatelském rozhraní] |
|
|
Tabulka 4: Funkce připojení k databázi
HSQLDB |
Firebird |
||
Syntaxe |
Popis |
Syntaxe |
Popis |
DATABASE() |
Vrací cestu a název databáze patřící k tomuto připojení. [funguje v grafickém uživatelském rozhraní] |
|
|
|
|
CURRENT_TRANSACTION |
SELECT CURRENT_T RANSACTION FROM RDB $ DATABASE vrátí jedinečný identifikátor transakce jako celé číslo. |
|
|
CURRENT_CONNECTION |
SELECT CURRENT_CONNECTION FROM RDB $ DATABASE vrátí celočíselnou hodnotu pro aktuální připojení. |
|
|
CURRENT_ROLE |
SELECT CURRENT_ROLE FROM RDB $ DATABASE odráží roli aktuálního uživatele. Pokud není definována žádná role, výsledkem je NONE. |
|
|
RDB $ SET_CONTEXT ('<namespace>', '<název proměnné>', value | NULL ) |
Namespace: USER_SESSION | USER_TRANSACTION Název proměnné může mít maximálně 80 znaků a value může mít maximálně 255 znaků. |
CURRENT_USER |
Standardní funkce SQL, synonymum funkce USER(). Je třeba poznamenat, že zde nejsou závorky. [funguje v grafickém uživatelském rozhraní] |
CURRENT_USER |
|
USER() |
Vrací uživatelské jméno tohoto připojení. Uživatelské jméno je důležité, pokud má být databáze převedena do externí databáze. |
USER |
|
IDENTITY() |
Vrací poslední hodnotu pole automatická hodnota, které bylo vytvořeno v aktuálním spojení. Používá se při programování maker k vytvoření cizího klíče pro jinou tabulku z primárního klíče vytvořeného pro jednu tabulku. [funguje v grafickém uživatelském rozhraní] |
GEN_ID (název generátoru, <krok>) |
Automatické hodnoty se vytvářejí pomocí generátoru. Velikost kroku by zde měla být uvedena jako 1. V zásadě je ale možná jakákoliv celočíselná hodnota. new.rec_id = gen_id (gen_recnum, 1); |
Tabulka 5: Systémové funkce
HSQLDB |
Firebird |
|||
Syntaxe |
Popis |
Syntaxe |
Popis |
|
IFNULL (exp, value) |
Pokud má parametr exp hodnotu NULL, je vrácena hodnota parametru value, jinak je vrácena hodnota parametru exp. Místo toho lze jako rozšíření použít také COALESCE (). Parametry exp a value musí mít stejný datový typ. |
|
|
|
CASE WHEN (exp, v1, v2) |
Pokud má parametr exp hodnotu true, vrátí se v1, jinak v2. Místo toho lze použít také CASE WHEN. |
IIF (<podmínka>, v1, v2) |
|
|
CONVERT (term, type) |
Převede term na jiný datový typ uvedený v type. |
|
|
|
CAST (term AS type) |
Synonymum pro CONVERT () |
CAST (term AS type) |
From |
To |
Číselné typy |
Číselné typy [VAR] CHAR |
|||
[VAR] CHAR |
[VAR] CHAR |
|||
DATE |
[VAR] CHAR |
|||
TIMESTAMP |
[VAR] CHAR |
|||
COALESCE (expr1, expr2, expr3, ...) |
Pokud expr1 není NULL, zobrazí se expr1, jinak se zkontroluje expr2, pak expr3 atd. Všechny výrazy musí mít alespoň podobný datový typ. Jedná se o alternativní reprezentaci celých čísel a čísel s plovoucí desetinnou čárkou, nikoli však také data nebo hodnoty času. |
COALESCE (expr1, expr2 [, expr3 ...] |
|
|
NULLIF (v1, v2) |
Pokud se v1 rovná v2, vrátí se null, jinak se vrátí hodnota v1. Hodnoty v1 a v2 musí být typově srovnatelné. |
NULLIF (v1, v2) |
|
|
CASE v1 WHEN v2 THEN v3 [ELSE v4] END |
Pokud se v1 rovná v2, provede se v3. V opačném případě se provede v4 nebo NULL, pokud není definováno ELSE. |
DECODE ( test expression , expression , result [, expression2 , Earnings2 ...] [, default expression ]) |
DECODE (UPPER ("gender"), 'M', 'male', 'F', 'female', 'unknown') |
|
CASE WHEN expr1 THEN v1 [WHEN expr2 THEN v2] [ELSE v4] END |
Pokud má expr1 hodnotu true, je vrácena hodnota v1 [Volitelně lze zadat další případy]. V opačném případě je reprodukováno v4 nebo NULL, pokud není formulováno ELSE. |
|
DECODE (EXTRACT ( WEEK DAY FROM "date"), 0 , ' Sunday ', 1 , ' Monday ', ' etc. ') |
|
|
|
GEN_UUID () |
Vrátí jedinečné ID jako 16bajtovou sadu znaků. |
|
|
|
HASH (s) |
Vrací hodnotu hash libovolně dlouhého řetězce. Hodnoty hash stejných řetězců znaků musí být stejné. |
|
|
|
MAXVALUE (expr [, expr ...]) |
Vrací maximální hodnotu seznamu hodnot. Pracuje s řetězci, číselnými hodnotami, daty nebo časovými hodnotami. |
|
|
|
MINVALUE (expr [, expr ...]) |
Vrací minimální hodnotu seznamu hodnot. Pracuje s řetězci, číselnými hodnotami, daty nebo časovými hodnotami. |
Tabulka 6: Agregační funkce (zejména s GROUP BY)
HSQLDB |
Firebird |
||
Syntaxe |
Popis |
Syntaxe |
Popis |
|
|
MAX (expr) |
Maximální hodnota pole v tabulce. |
|
|
MIN (expr) |
Minimální hodnota pole v tabulce. |
|
|
LIST ( [ALL | DISTINCT] 's' , [ ' s2'] ) |
Připojí pole několika datových záznamů k jednomu poli s odpovídajícím termínem připojení „s2“. [funguje v grafickém uživatelském rozhraní] |
Tabulka 7: Proměnné (v závislosti na počítači)
HSQLDB |
Firebird |
||
Proměnná |
Popis |
Proměnná |
Popis |
CURRENT_TIME |
Synonymum pro CURTIME (), standard SQL. |
CURRENT_TIME |
Čas v hodinách, minutách a sekundách. |
CURTIME () |
Vrací aktuální čas. [funguje v grafickém uživatelském rozhraní] |
|
|
CURRENT_TIMESTAMP |
Synonymum pro NOW (), standard SQL. |
CURRENT_TIMESTAMP [(přesnost)] |
Zadání času s datem a milisekundami. SELECT CURRENT_TIMESTAMP (2) FROM RDB $ DATABASE |
NOW () |
Vrátí aktuální datum a čas společně jako časové razítko. Místo toho lze použít také CURRENT_TIMESTAMP. [funguje v grafickém uživatelském rozhraní] |
CAST ('NOW' AS DATE | TIME | TIMESTAMP) nebo DATE 'NOW' |
Samotné 'NOW' je chápáno jako řetězec. Vhodným převodem se z něj stane datum, čas nebo časové razítko (každé s 1/1000 s). Zkrácená forma v grafickém uživatelském rozhraní nefunguje. |
CURRENT_DATE |
Synonymum pro CURDATE (), standard SQL. [funguje v grafickém uživatelském rozhraní] |
CURRENT_DATE |
|
CURDATE () |
Vrací aktuální datum. [funguje v grafickém uživatelském rozhraní] |
|
|
Tabulka 8: Operátory a příkazy
HSQLDB |
Firebird |
||
Operátor nebo příkazy |
Popis |
Operátor nebo příkazy |
Popis |
'str1' || 'str2' || 'str3' or 'str1' + 'str2' + 'str3' |
Spojí str1 + str2 + str3; jednodušší alternativa ke CONCAT. [funguje v grafickém uživatelském rozhraní] |
's1' || ' s 2 ' [ ||' s3 '... ] |
Připojí s1, s2 atd. k novému řetězci [funguje v grafickém uživatelském rozhraní] |
|
|
ALL |
|
|
|
ANY / SOME |
|
|
|
IN ( ) |
|
|
|
IS [NOT] DISTINCT FROM |
Výsledkem je „ano“ nebo „ne“. |
|
|
NEXT VALUE FOR název sekvence |
Viz GEN_ID (), ale neumožňuje jiné kroky než 1. |
|
|
SOME |
|
Tabulka 9: Datové typy celých čísel
Typ |
Možnost |
HSQLDB |
Firebird |
Rozsah |
Velikost v paměti |
Tiny integer |
TINYINT |
TINYINT |
|
28 = 256 | – 128 to + 127 |
1 bajt |
Small integer |
SMALLINT |
SMALLINT |
SMALLINT |
216 = 65536 | – 32768 to + 32767 |
2 bajty |
integer |
INTEGER |
INTEGER | INT |
INTEGER |
232 = 4294967296 | – 2147483648 to + 2147483647 |
4 bajty |
BigInt |
BIGINT |
BIGINT |
BIGINT |
264 (–263 to +263 ) |
8 bajtů |
Tabulka 10: Datové typy čísla s pohyblivou desetinnou čárkou
Typ |
Možnost |
HSQLDB |
Firebird |
Rozsah |
Požadavky na paměť |
Desetinné číslo |
DECIMAL |
DECIMAL |
DECIMAL (n, m) |
Neomezeně, přes GUI až na 50 číslic, nastavitelné, pevná desetinná místa, vysoká přesnost |
2, 4 nebo 8 bajtů |
Číslo |
NUMERIC |
NUMERIC |
NUMERIC (n, m) |
Neomezeně, přes GUI až na 50 číslic, nastavitelné, pevná desetinná místa, vysoká přesnost |
2, 4 nebo 8 bajtů |
Float |
FLOAT |
(místo toho se používá DOUBLE) |
FLOAT |
3.4 * 10–38 to 3.4 * 1038 |
4 bajty |
Reálná část |
REAL |
REAL |
|
|
|
Double |
DOUBLE |
DOUBLE [PRECISION] | FLOAT |
DOUBLE PRECISION |
1 , 7 * 10-308 až 1 , 7 * 10308 nastavitelné, ne přesné, maximálně 15 desetinných míst |
8 bajtů |
Tabulka 11: Datové typy textu
Typ |
Možnost |
HSQLDB |
Firebird |
Rozsah |
Požadavky na paměť |
Text |
VARCHAR |
VARCHAR |
VARCHAR (n) |
Nastavitelný |
Proměnná |
Text |
VARCHAR_IGNORECASE |
VARCHAR_IGNORECASE |
|
Nastavitelné, ovlivňuje třídění, ignoruje rozdíly mezi velkými a malými písmeny |
proměnná |
Text (pevný) |
CHAR |
CHAR | CHARACTER |
|
Nastavitelný, zbytek textu je vyplněn mezerami. |
pevná |
Memo |
LONGVARCHAR |
LONGVARCHAR |
BLOB (BLOB SUB_TYPE 1) |
|
proměnná |
Tabulka 12: Datové typy datum/čas
Typ |
Možnost |
HSQLDB |
Firebird |
Rozsah |
Požadavky na paměť |
Datum |
DATE |
DATE |
DATE |
|
4 bajty |
Čas |
TIME |
TIME |
TIME |
Firebird: 0:00 až 23:59,9999 |
4 bajty |
Datum/čas |
TIME STAMP |
TIMESTAMP | DATE TIME |
TIME STAMP |
Nastavitelné ( HSQLDB: 0, 6 – 6 znamená s milisekundami) |
8 bajtů |
Tabulka 13: Další datové typy
Typ |
Možnost |
HSQLDB |
Firebird |
Rozsah |
Požadavky na paměť |
Ano Ne |
BOOLEAN |
BOOLEAN | BIT |
|
|
|
Binární pole (pevné) |
BINARY |
BINARY |
|
Stejně jako integer |
pevná |
Binární pole |
VARBINARY |
VARBINARY |
|
Stejně jako integer |
proměnná |
Image |
LONGVARBINARY |
LONGVARBINARY |
BLOB SUB_TYPE 0 |
Stejně jako integer |
proměnná, určená pro větší obrázky |
OTHER |
OTHER |
OTHER | OBJECT |
|
|
|