Josef Troch (troch@mail.ru)
4.3.2002 (poslední změna 7.3.2002)

ORACLE - Základní datové typy a základní operace s tabulkami

Pozn.: Všechny níže uvedené informace by se měly vztahovat k Oraclu 8.1.5

Základní (interní) datové typy

Každý literál či sloupec hodnot v Oraclu musí mít určen svůj datový typ. Při vytváření tabulky je třeba určit pro každý sloupec jeden z těchto interních datových typů, obdobně je třeba specifikovat parametry funkcí a procedur. Při zadávání hodnot do tabulek Oracle ověřuje, zda jde o korektní hodnoty příslušných datových typů (např. pro typ DATE při zadání 30-FEB-98 Oracle zahlásí chybu).

Pozn.: Existují ještě externí datové typy - ty se využívají v Embedded SQL a jsou asociované s proměnnými daného programovacího jazyka. Těmito datovými typy se tento referát nezaobírá.

Přehled (interních) datových typů:

Datový typ Krátký popis Příklad výrazu tohoto typu
CHAR(size) Znakový řetězec pevné délky size bytů (max 2000, min 1, implicitně 1). 'nějaký řetězec'
NCHAR(size) Znakový řetězec pevné délky size znaků či bytů - záleží na nastavení národní znakové sady (size se musí vejít do 2000 bajtů, min i implicitně 1 znak či byte). 'nějaký řetězec'
VARCHAR2(size) Znakový řetězec proměnné délky s maximální délkou size bytů, size musí být zadáno (max 4000, min 1). 'nějaký řetězec'
NVARCHAR2(size) Znakový řetězec proměnné délky s maximální délkou size znaků či bytů - záleží na nastavení národní znakové sady, size musí být zadáno (size se musí vejít do 4000 bajtů, min 1 znak či byte). 'nějaký řetězec'
LONG Znakový řetězec proměnné délky s maximální délkou 2GB bytů. 'nějaký řetězec'
NUMBER(p, s) Číslo celé či reálné (fixed point či floating point) - s přesností (precision) p a měřítkem (scale) s. Detaily viz níže. 327
1.1895E12
DATE Datum a čas mezi 1.1.4712 př. n. l. a 31.12.4712 n. l. 16-JAN-99
TO_DATE('01-01-1997', 'MM-DD-YYYY')
RAW(size) Binární data pevné délky size bytů (max. 2000 bytes) - tato musí být uvedena.  
LONG RAW Binární data proměnné délky až 2 GB.  
ROWID Hexadecimalní řetězec representující jednoznačnou adresu řádku v tabulce.  
MLSLABEL, CLOB, NCLOB, BLOB, BFILE Méně významné datové typy - binární label operač. systému, character large object + varianta více bytů na znak, binární large object, odkaz na velký binární soubor mimo DB.  

Poznámky k některým (interním) datovým typům

Podpora pro standartní SQL (ANSI) a DB/2 či SQL/DS datové typy

Oracle podporuje samozřejmě i datové typy SQL dle standartu ANSI a dokonce i datové typy z produktů SQL/DS a DB2 od IBM.
Tyto datové typy jsou mapovány na výše uvedené interní datové typy Oracle, nicméně Oracle si v případě jejich použití jako typů pro sloupce tabulek atp. pamatuje, kterého z těchto typů jsou - pro případný dotaz.

Podporované ANSI, DB2 a SQL/DS datové typy a jejich mapování na datové typy Oracle

ANSI, DB/2 či SQL/DS datový typ Oracle datový typ Poznámka
CHARACTER(n)
CHAR(n)
CHAR(n)
CHARACTER VARYING(n)
CHAR VARYING(n)
VARCHAR(n)
VARCHAR(n) VARCHAR(n) není ANSI datový typ - jen DB/2 a SQL/DS.
NATIONAL CHARACTER(n)
NATIONAL CHAR(n)
NCHAR(n)
NCHAR(n)
NATIONAL CHARACTER VARYING(n)
NATIONAL CHAR VARYING(n)
NCHAR VARYING(n)
NVARCHAR2(n)
LONG VARCHAR(n) LONG LONG VARCHAR(n) není ANSI datový typ - jen DB/2 a SQL/DS.
NUMERIC(p,s)DECIMAL(p,s) NUMBER(p,s) Implicitní hodnota s je zde 0.
INTEGER
INT
SMALLINT
NUMBER(38)
FLOAT(b)
DOUBLE PRECISION
REAL
NUMBER FLOAT(b) - floating point číslo s počtem platných binárních číslic p, nezadáme-li p, použije se 126 (38 desítkově).
DOUBLE PRECISION - floating point číslo s počtem platných binárních číslic 126 (38 desítkově).
REAL - floating point číslo s počtem platných binárních číslic 63 (18 desítkově).


Základní operace s tabulkami

Vysvětlivky k zápisu syntaxe příkazů:

[vyraz] - znamená, že vyraz se může na daném místě vyskytnout 0 či 1-krát.
[*vyraz] - znamená, že vyraz se může na daném místě vyskytnout 0 až libovolně-krát.
Vše ostatní se na daném místě tedy může vyskytnout právě jedenkrát.

Syntaxe byla ve většině případů velmi zjednodušena - všechny možnosti syntaxe příkazů lze nalézt v dokumentaci k Oraclu.


CREATE TABLE

Příkaz pro vytvoření tabulky.
Zmíněny budou jen nejzákladnější varianty.

Základní syntaxe:
CREATE [GLOBAL TEMPORARY] TABLE [schema.]jmenoTabulky
(jmenoSloupce typ [DEFAULT vyraz] [*integritniOmezeni],
 jmenoSloupce typ  ....... ,
 .....
 [*integritniOmezeniTabulky]
 );
Pozn.: Integritní omezení lze definovat i mimo CREATE TABLE.

CREATE TABLE - příklady

  1. Vytvoření tabulky zamestnanci - povšimněte si pojmenovaného integritního omezení mojeOmezeni:
    CREATE TABLE zamestnanci
       (cisloZam      NUMBER(4) UNIQUE,
        jmeno         VARCHAR2(40) NOT NULL,
        funkce        VARCHAR2(9),
        nastoupil     DATE,
        plat          NUMBER(7,2) DEFAULT 5000,
        cisloOddeleni CONSTRAINT mojeOmezeni REFERENCES oddeleni(cisloOddeleni)
       );
    
  2. Vytvoření tabulky obchody:
    CREATE TABLE obchody
       (ico          NUMBER(15) NOT NULL,
        adresa       VARCHAR2(50) NOT NULL,
        zbozi        VARCHAR2(20) NOT NULL,
        ks_na_sklade NUMBER (5) DEFAULT 0 CHECK (ks_na_sklade >= 0),
        cena_kusu    NUMBER (7,2),
        ks_prodano   NUMBER (5) DEFAULT 0 CHECK (ks_prodano >= 0),
        );
     

DROP TABLE

Příkaz odstraní tabulku i s jejím obsahem z databáze.

Syntaxe:
DROP TABLE [schema.]jmenoTabulky [CASCADE CONSTRAINTS];

DROP TABLE - příklady

  1. Zrušení tabulky obchody:
    DROP TABLE obchody;
    
  2. Zrušení tabulky zamestnanci - včetně kaskádového rušení souvisejících integritních omezení:
    DROP TABLE zamestnanci CASCADE CONSTRAINTS;
    

ALTER TABLE

Příkaz pro přidávání, odstraňování a modifikaci sloupců či integritních omezení tabulky, přejmenování tabulky, zapínání či vypínání int. omezení, triggerů atd. atd.
Zmíněny budou jen nejzákladnější varianty.

Základní syntaxe:
ALTER TABLE [schema.]jmenoTabulky
prikaz1 prikaz2 .... ;
Kde prikaz může být:

ALTER TABLE - příklady

  1. Do tabulky obchody přidáme nové pojmenované integritní omezení - pro 2 sloupce.
    ALTER TABLE obchody
       ADD (CONSTRAINT check_pocet_ks CHECK (ks_na_sklade + ks_prodano <= 20000) );
    
  2. Ze stejné tabulky nyní zrušíme sloupec ks_prodano - díky CASCADE CONSTRAINS se zruší i právě přidané int. omezení (kdybychom CASCADE CONSTRAINS neuvedli, Oracle by vrátil chybu - nemohl by sloupec zrušit bez současného zrušení zmíněného integritního omezení):
    ALTER TABLE obchody DROP (ks_prodano) CASCADE CONSTRAINTS;
    
  3. Nyní z tabulky zamestnanci zrušíme 3 sloupce najednou:
    ALTER TABLE zamestnanci DROP (nastoupil, funkce, plat);
    
  4. Nyní do tabulky zamestnanci přidáme 2 sloupce a 1 z nich prohlásíme za primární klíč:
    ALTER TABLE zamestnanci
       ADD (posledniVyplata NUMBER(7,2),
            rodneCislo NUMBER(15) PRIMARY KEY);
    
  5. Stále ve stejné tabulce zvětšíme maximální velikost čísla udávajícího poslední výplatu (závorky za MODIFY zde jsou nepovinné, neboť je uvnitř jen jedna definice sloupce):
    ALTER TABLE zamestnanci
       MODIFY (posledniVyplata NUMBER(9,2));
    
  6. Změna defaultní hodnoty pro sloupec ks_na_sklade v tabulce obchody:
    ALTER TABLE obchody
      MODIFY (ks_na_sklade DEFAULT 10);
    
  7. Zrušení primárního klíče tabulky zamestnanci (včetně kaskádového rušení souvisejících integritních omezení:
    ALTER TABLE zamestnanci
        DROP PRIMARY KEY CASCADE;
    
  8. Zrušení pojmenovaného integritního omezení mojeOmezeni:
    ALTER TABLE zamestnanci
        DROP CONSTRAINT mojeOmezeni;
    
  9. Zrušení integritního omezení na jednoznačnost hodnot ve sloupci cisloZam:
    ALTER TABLE zamestnanci
        DROP UNIQUE (cisloZam);
    

INSERT

Příkaz pro přidávání řádků do tabulky.
Zmíněny budou jen nejzákladnější varianty.

Základní syntaxe:
INSERT INTO [schema.]jmenoTabulky [(sloupec1, sloupec2, ...)]
     VALUES (vyraz1, vyraz2, ....)

INSERT - příklady

Zde používám původní definice tabulek - viz příklady ke CREATE TABLE.
  1. Přidání 1 řádku do tabulky obchody, povšimněte si zápisu řetězců a čísel:
    INSERT INTO obchody
       VALUES (4864316850, 'ACDO s. r. o., Kozi 3 , Olomouc', 'Rum 40%', 453, 8.56E2, 5689);
    
  2. Přidání dalšího řádku, nyní zadám hodnoty jen pro některé sloupce, zbytek nechám automaticky doplnit:
    INSERT INTO zamestnanci (cisloZam, jmeno, cisloOddeleni)
       VALUES (7890, 'Antonin Zeleny', 43);
    
  3. Totéž při specifikování sloupců pomocí poddotazu:
    INSERT INTO (SELECT cisloZam, jmeno, cisloOddeleni FROM zamestnanci)
       VALUES (7890, 'Antonin Zeleny', 43);
    
  4. Naplnění tabulky bonus pomocí poddotazu (pův. příklad z Oracle - kopíruje hodnoty některých sloupců z tabulky emp - řádky odpovídající managerům a presidentům nebo zaměstnancům s provizí větší než 20 % platu):
    INSERT INTO bonus
       SELECT ename, job, sal, comm
       FROM emp
       WHERE comm > 0.25 * sal
       OR job IN ('PRESIDENT', 'MANAGER');
    

DELETE

Příkaz pro odstraňování řádků z tabulky.
Zmíněny budou jen nejzákladnější varianty.

Základní syntaxe:
DELETE FROM [schema.]jmenoTabulky [WHERE podminka];

DELETE - příklady

Zde používám původní definice tabulek - viz příklady ke CREATE TABLE.

  1. Smaže všechny řádky z tabulky zamestnanci:
    DELETE FROM zamestnanci;
    
  2. Smaže všechny zaměstnance ve funkci "vrátný", s platem větším než 10000:
    DELETE FROM zamestnanci
        WHERE funkce = 'vrátný'
        AND plat > 10000;
    
  3. Totéž pomocí SQL poddotazu:
    DELETE FROM (SELECT * FROM zamestnanci)
        WHERE funkce = 'vrátný'
        AND plat > 10000;
    

Zdroje a odkazy:


Tento článek smí být používán libovolně, za předpokladu, že nebude modifikován a že takto bude učiněno se zmínkou o autorovi a odkazem na stránku http://jt.sf.cz, odkud by měla být dostupná aktuální verse tohoto článku.
Snažím se, aby informace zde uvedené byly pravdivé a pokud možno přesné, nicméně nenesu žádnou odpovědnost za to, že tomu tak opravdu je, ani za jakékoli škody, které by někomu v důsledku případných špatných či nepřesných informací z tohoto článku mohly vzniknout.



Jakékoliv dotazy či připomínky mi můžete poslat mailem.

Zpět na stránku referátů a jiných výtvorů