Contiennent les données utilisateur. Composées de colonnes. Descriptions des tables dans dba_tables.
CREATE TABLE salaires
( no_emp NUMBER , salaire NUMBER)
TABLESPACE TEMPORARY
STORAGE (INITIAL 50K NEXT 50K MINEXTENTS 1 MAXEXTENTS 25 PCTINCREASE 0)
SQL> describe salaires Name Null? Type ------------------------------- -------- ---- NO_EMP NUMBER SALAIRE NUMBERon peut vérifier les caractéristiques de la table dans le dictionnaire :
SQL> select * from dba_tables 2* where table_name = 'SALAIRES' OWNER TABLE_NAME TABLESPACE_NAME ------------------------------ ------------------------------ ------------------------------ CLUSTER_NAME IOT_NAME PCT_FREE PCT_USED INI_TRANS ------------------------------ ------------------------------ --------- --------- --------- MAX_TRANS INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE FREELISTS FREELIST_GROUPS --------- -------------- ----------- ----------- ----------- ------------ --------- --------------- LOG B NUM_ROWS BLOCKS EMPTY_BLOCKS AVG_SPACE CHAIN_CNT AVG_ROW_LEN AVG_SPACE_FREELIST_BLOCKS --- - --------- --------- ------------ --------- --------- ----------- ------------------------- NUM_FREELIST_BLOCKS DEGREE INSTANCES CACHE TABLE_LO SAMPLE_SIZE LAST_ANA PAR IOT_TYPE T NES ------------------- ---------- ---------- ----- -------- ----------- -------- --- ------------ - --- BUFFER_ ------- SYSTEM SALAIRES USER_DATA 10 40 1 255 51200 51200 1 25 0 1 1 YES N 1 1 N ENABLED NO N NO DEFAULT
Il est plus judicieux comme
ici de préciser la clause STORAGE au niveau de chaque table plutôt
qu'au niveau du tablespace, les volumes pouvant être très différents
d'une table à l'autre....
CREATE TABLE mini_emp (empno
NUMBER CONSTRAINT pk_emp PRIMARY KEY,
ename VARCHAR2(10) CONSTRAINT upper_ename CHECK (ename = UPPER(ename)),
hiredate DATE DEFAULT SYSDATE,
deptno NUMBER(2) CONSTRAINT fk_deptno REFERENCES scott.dept(deptno) )
on voit ici un certain nombre de contraintes d'intégrité qui faciliteront les développements
Accélérateurs. Externes aux tables. Peuvent être créés / détruits à tout moment. Se remplissent dynamiquement au fur et à mesure des mises à jour de la table indexée. Organisés en B-TREE. Description dans dba_indexes.
create [unique] index i1 on t1(col1)
rem : un index peut ne pas être unique. Une clé primaire dans une table est représentée sous forme d'index unique par Oracle.
Accélérateurs.
Les clusters sont des segments spéciaux qui contiennent plusieurs tables
fusionnées, suivant en général une colonne de jointure.
On peut les voir comme des jointures physiques.rem : un certain nombre de tables
du dictionnaire sont organisées en cluster.
Voir dba_clusters
les objets qui suivent ne sont pas des segments. Ils sont des références
à d'autres objets (segments ou non) dont la description est stocké
dans le dictionnaire de données. Il ne prennent donc pas vraiment
de place physique
Une vue est une fenetre
sur une table. Elle ne contient pas de données. Stockée dans le
DD sous forme de 'select nommé'.
La mise à jour d'une vue est en fait la mise à jour de la table
'A TRAVERS' la vue. Il n'y a pas de duplication de données.
Une vue peut porter sur plusieurs tables, éventuellemnts distantes !
Les vues sont décrites dans la vue dba_views du dictionnaire de données.
create view emp_10 as select
empno numero, ename nom
where deptno = 10
l'une des colonnes de dba_views est de type LONG. Si on veut visualiser la totalité
des informatiions sous SQL*Plus, utiliser la commande 'SET LONG 2000' par exemple
pour ne pas tronquer l'affichage !
il existe des vues paramétrées qui peuvent rendrent de grands services pour restreindre certains type d'accès
Si on veut restreindre l'accès à certaines périodes horaires par exemple :
CREATE VIEW emp_ouvrableen dehors de la période 8H - 17H le predicat est faux et la vue ne renvoie aucune données !
Si on veut restreindre l'accès a certains postes de travail :
CREATE VIEW EMP_RESTREINTEseuls les postes clients dont l'identification réseau est 'PC1' ou 'PC3' seront autorisés !
Type | propriétaire | syntaxe |
public | pseudo user 'PUBLIC' | create public synonym nom_syn for [propr.]objet |
privé | le créateur (user courant) | create synonym nom_syn for [propr.]objet |
rem : seul un DBA peut créer (ou détruire) un synonyme public.
Un synonyme public doit être unique dans la base.h
Le fait que le synonyme soit public ne veut pas dire que l'objet pointé
est accessible par tout le monde, il faut en plus donner des droits si nécessaire!
Les database links sont
des référence à des comptes utilisateurs distants.
Ceci permet au sein d'une même session SQL d'accéder à différents objets de
bases réparties sur le réseau. On peut par exemple définir un database link
compta_bordeaux qui référence le schéma compta qui se trouve sur la base distante
localisée sur le serveur de bordeaux. Ensuite on pourra accéder à une table
ou vue distante via ce database link. Une description des database links se
trouve dans la vue USER_DB_LINKS du dictionnaire.
exemple
SQL> CREATE DATABASE LINK compta_bordeaux
CONNECT TO compta IDENTIFIED BY xyz USING 'la_base_de_bordeaux' ;
SQL> SELECT * FROM balance@compta_bordeaux ;
-- on peut le rendre transparent grace aux synonymes
SQL> CREATE SYNONYM balance FOR balance@compta_bordeaux ;
SQL> SELECT * FROM balance ;
Une séquence est
un compteur programmable stocké en mémoire par Oracle et utilisable
de manière partagé.
Il est en général utilisé pour fournir des no de clé
d'enregistrements.
Pour créer une séquence :
create
sequence nom_seq start with no_debut
increment by saut
maxvalue valeur_max cycle|nocycle cache|nocache
Pour utiliser une séquence
:
la valeur courante de la séquence est donnée par nom_seq.currval
et la suivante par nom_seq.nextval.
Exemple
SQL> create sequence seq_no_cli
start with 1000 increment by 100;
SQL> insert into clients (no, nom) values (seq_no_cli.nextval, 'Martin');
J pour vérifier rapidement la valeur à suivre : select seq_no_cli.nexval from dual
Les programmes stockés
(procédures, fonctions ou packages) sontt des programmes codés
en PL/SQL, nommés, et stockés dans un schéma dee la base.
Nécessite le privilège 'Create procedure' ou 'create any procedure'
suivant qu'on est dans son propre schéma ou dans un autre schéma.
Exemple de prcédure de crédit d'un compte (qui prend en entrée le no du compte et le montant à créditer)
CREATE PROCEDURE credit (no
IN NUMBER, montant IN NUMBER)
AS
BEGIN
UPDATE compte SET solde = solde + montant
WHERE no_compte= no;
END;
Une fonction est une procédure qui retourne une (ou des) valeur(s).
CREATE FUNCTION lit_solde
(no IN NUMBER)
RETURN NUMBER
IS solde NUMBER (11,2);
BEGIN
SELECT balance INTO solde FROM compte
WHERE no_compte = no;
RETURN (solde);
END;
no est un paramètre d'entrée et solde la valeur du solde du compte fournie en sortie
Un package est un ensemble
encapsulé de procédures et ou de fonctions, ainsi que de données
dépendant fonctionnellement.
Il est constitué de 2 parties : la specification qui déclare les
objets publics du package et le corps (body) qui définit ces objets.
Pour créer ces 2 entités on utilisera respectivement les ordres
:
create package et create package body
Un trigger est un morceau
de code PL/SQL, stocké dans la base, déclenché lors de l'occurrence d'un événement
particulier. Il permet notamment de synchroniser des opérations entre plusieurs
tables.
La plupart du temps les triggers sont déclenchés par la modification du contenu
d'une table.
La liste des événements déclencheurs apparaît ci-après :
Type d'ordre ordre déclencheur : DELETE, INSERT, UPDATE, CREATE, ALTER, DROP, SERVERERROR, LOGON, LOGOFF, STARTUP, SHUTDOWN
exemple
-- trigger déclenché lors d'une
insertion
-- ou d'une modification de la table client
SQL> CREATE OR REPLACE TRIGGER aff_discount BEFORE INSERT OR UPDATE ON clients
FOR EACH ROW WHEN (new.no_cli > 0)
DECLARE evol_discount number;
BEGIN evol_discount := :new.discount - :old.discount;
DBMS_OUTPUT.PUT_LINE(' evolution : ' || evol_discount); END;
/ -- FOR EACH ROW signale qu'une modification de 4 lignes
-- par un seul UPDATE déclenche 4 fois le trigger.
-- Si on ne souhaite qu'un seul déclenchement ,
-- on omet simplement la clause FOR EACH ROW.
|