Anda di halaman 1dari 53

###############

RESUMEN 1Z0-051
###############

<TAB>------------
CAPITULO 1.-
------------

1.- SQL Plus


------------
- Ubicaci�n ($ORACLE_HOME/bin)
- $ sqlplus user/pass@instancia
- SQL> connect user/pass@instancia
- SQL> set sqlprompt "_USER'@'_CONNECT_IDENTIFIER SQL> "
-- $ORACLE_HOME/sqlplus/admin/glogin.sql
define _Editor=vi
- $ sqlplus -help

2.- Meter sentencias SQL


------------
- Terminaci�n sentencias: (";" - ejecuta, "/" - ejecuta,"linea en blanco" - buffer)
- Buffer (sentencias SI - comandos NO) - (ejecuci�n RUN)
- Salto linea (comandos: "-" /// sentencias: "intro")

3.- DESCRIBE
------------
- select * from tab;

4.- Editar SQL Buffer


------------
- Editar buffer con editor SO (SQL> edit -> fichero "afiedt.buf")
- Herramientas buffer (list - append - change - input - del)

5.- Scripts
------------
- Herramientas (save - edit - get - start (@) - @@
- spool filename .lst <append>
- Comentarios (rem , /* ... */, "--") - SET DOCUMENT OFF
- Mostrar linea texto (comando prompt)

6.- Datatypes
------------
...

7.- Operadores y literales


------------
- Unitario / Binario
- Operadores
-- Aritmeticos (+,-,*,/)
-- Concatenaci�n texto ('Texto 1 ' || 'Texto 2')
-- Prioridad 1.parentesis 2.unitarios(+-) 3.*,/ 4.+,-,||
- Literales
-- Texto: Delimitadores - (select q'"TEXTO"' from dual)
-- Numerico: number
-- Datatime: Date (YYYY-MM-DD) - select date '2015-12-01' from dual, Timestamp
(YYYY-MM-DD HH24:MI:SS TZ)
-- Intervalos: Interval year to month, Interval day to second

8.- Sentencia SELECT


------------
- Alias columnas: SQL> select job_title AS Title, min_salary AS "Minimum Salary"
from jobs
- DISTINCT: SQL> select distinct department_id, job_id from employees;
- Consultas jeraquicas: selecci�n de datos en orden jerarquico sobre una consulta
jer�rquica
-- START WITH: especifica la fila raiz de la jerarquia
-- CONNECT BY: especifica la relaci�n entre filas padre y filas hijas de la
jerarquia
-- PRIOR: cualifica una expresi�n de la condici�n para hacer referencia
a la fila padre

sql> select empno, ename, mgr, LEVEL from emp connect by prior empno=mgr;

EMPNO ENAME MGR LEVEL


----- ------ ---- -----
7788 SCOTT 7566 1
7876 ADAMS 7788 2
7902 FORD 7566 1
7369 SMITH 7902 2
...
7876 ADAMS 7788 3

sql> SELECT HR.EMPLOYEES.EMPLOYEE_ID,


HR.EMPLOYEES.FIRST_NAME,
HR.EMPLOYEES.MANAGER_ID,
LEVEL
FROM HR.EMPLOYEES
CONNECT BY PRIOR HR.EMPLOYEES.EMPLOYEE_ID = HR.EMPLOYEES.MANAGER_ID
ORDER BY HR.EMPLOYEES.MANAGER_ID;

EMPLOYEE_ID FIRST_NAME MANAGER_ID LEVEL


----------- -------------------- ---------- ----------
201 Michael 100 1
149 Eleni 100 1
148 Gerald 100 1
...
114 Den 100 1
102 Lex 100 1
101 Neena 100 1
201 Michael 100 2
149 Eleni 100 2
...

sql> SELECT HR.EMPLOYEES.EMPLOYEE_ID,


HR.EMPLOYEES.FIRST_NAME,
HR.EMPLOYEES.MANAGER_ID,
LEVEL
FROM HR.EMPLOYEES
START WITH HR.EMPLOYEES.EMPLOYEE_ID = 201
CONNECT BY PRIOR HR.EMPLOYEES.EMPLOYEE_ID = HR.EMPLOYEES.MANAGER_ID
ORDER BY HR.EMPLOYEES.MANAGER_ID;

EMPLOYEE_ID FIRST_NAME MANAGER_ID LEVEL


----------- -------------------- ---------- ----------
201 Michael 100 1
202 Pat 201 2
9.- Tabla DUAL
------------
- SQL> select sysdate, user from dual;

10.- WHERE
------------
- SQL> select first_name || ' ' || last_name "Name", department_id from employees
where department_id = 90;
- Operadores comparaci�n: (=,!=, <>, <, >, <=, >=) (ANY / ALL; antecedido por
operador comparaci�n)
- ANY / ALL; m�s operador comparaci�n - ... WHERE department_id <= ANY (10, 15, 20,
25);
- Operadores logicos:
-- NOT ... WHERE not (department_id >= 30);
-- AND: (TRUE / UNKNOWN = UNKNOWN)
-- OR: (FALSE / UNKNOWN = UNKNOWN)
- Otros operadores:
-- IN / NOT IN ... WHERE department_id IN (10, 20, 90);
-- BETWEEN ... WHERE salary BETWEEN 5000 AND 6000;
-- EXISTS ... WHERE EXISTS (select 1 FROM departments d WHERE d.department_id =
e.department_id);
-- IS NULL / IS NOT NULL
-- LIKE ... WHERE job_id like 'AC\_%' ESCAPE '\';

11.- ORDER BY
------------
- ... ORDER BY mid ASC, salary DESC, hire_date; Se puede ordernar por varias
columnas
- ... ORDER BY 'Region ' || region_id; Debe coincidir el ORDER con la SELECT
- ... ORDER BY 4, 2, 3; Ordenaci�n por orden columnas
- ... ORDER BY commission_pct ASC NULLS FIRST, last_name DESC; Ordenaci�n de los
NULLS (el NULL es valor MAX)

12.- CASE
------------
SQL> SELECT first_name, department_id, salary,
CASE
WHEN salary < 6000 THEN 'Low'
WHEN salary < 10000 THEN 'Medium'
WHEN salary >= 10000 THEN 'High'
END Category
FROM employees
WHERE department_id <= 30
ORDER BY first_name;

13.- V$SESSION
------------
- SQL> SELECT username, sid, serial#, program FROM v$session;
- SQL> SELECT username, sid, serial#, program FROM v$session WHERE username is NOT
NULL ORDER BY logon_time;

14.- Valores en RUNTIME


------------

- SQL> variable vtask varchar2(100);


- SQL> execute :vtask := dbms_sqltune.create_tuning_task(sql_text=>'select
max(object_id) from object_analysis')
- SQL> execute dbms_sqltune.execute_tuning_task(:vtask)
--- DEFINE ---

- SQL> ... WHERE department_id = &dept; (solicitud valor durante RUNTIME)


- SQL> DEFINE
DEFINE _DATE = "29-JUL-15" (CHAR)
DEFINE _CONNECT_IDENTIFIER = "DES11G" (CHAR)
DEFINE _USER = "HR" (CHAR)
DEFINE _PRIVILEGE = "" (CHAR)

Ejemplo 1.-
PROMPT - PROBANDO VARIABLES CON DEFINE (funciona todo correctamente):
Prompt Introduzca usuario a utilizar:
define vd_usuario = "&1"
PROMPT Introduce la passwd del usuario &vd_usuario:
conn &vd_usuario
select '&vd_usuario' vd_usuario from dual;
select USER from dual;

Ejemplo 2.-
- SQL> DEFINE DEPT = 20 (definir valor)
DEFINE DEPT = �20� (CHAR)
...
3* WHERE department_id = &DEPT
- SQL> ... WHERE job_id = '&JOB._REP' (concatena texto)
- SQL> SELECT &&COL1, &&COL2 ... (se guarda valor)
UNDEFINE COL1 COL2
- SQL> ... WHERE &1 = &2; (var parametro posicional)

Examen Capitulo 1
-----------------
01Cok. "Employee Salary"
02BerrA. order by: producen el mismo resultado: SE PUEDE USAR EL NOMBRE DE COLUMNA
AUNQUE LLEVE ALIAS !!!!
03DerrB. Quitar parentesis: produce el mismo resultado porque primero se realizan *
y /
ok4. literal? : A - 10 ; C - Employee Name
05Bok. 34567.23 -> se redondea NUMBER(7,2)
06AerrB. length DATE 9 DD-MON-YY
err7. distinct : (D) errA - Explicaci�n: DISTINCT debe ir inmediatamente despues de
SELECT
ok8. query limit: B - where
09Bok. 7934 -> nombre MILLER que al ser el mayor se ordena primero por DESC
10Dok. BETWEEN A AND C: 3 filas (no entra C??? porque es mayor) Explicaci�n:
between permite buscar entre strings con carac: 'CLARK' is > 'C'
11Cok. linea 4 error: no se puede usar un alias en WHERE
12Aok. operador IN puede sustituir a OR
13Bok. orden 2,1,3 where from order by
ok14. like escape: C - like 'DI\_%' ESCAPE '\';
15Cok. ... CASE region_id WHEN 1 THEN '' WHEN ''.. ELSE '' END Continent
16Dok. select todas las columnas *
17Bok. 17-DEC-90 primero: ORDER BY ASC por defecto
18Dok. ORDER BY ASC por defecto
err19. escape Like : (D) C - \ : Explicaci�n: no hay caracter por defecto para
patr�n de busqueda, hay que definirlo.
20Bok. alias no puede usarse en WHERE
21AerrC. query error porque la sustituci�n de var no lleva el &: las var NO son
sensibles may/min
22ABerrBC. &&var: disponible sesion ; &n paso valor por argumento disponible sesion
23Dok. like 'BL%' order by ... desc;
24Cok. querys exec pero dif resultados IN(0,NULL) - comm = 0 or comm IS NULL

TAB>------------
CAPITULO 2.- USING SINGLE-ROW FUNCTIONS
------------
Las funciones son programas que toman cero o m�s argumentos y retornan un solo
valor.
Tipos:
- Funciones de una sola fila
Operan una expresi�n derivada de columnas o literales, siendo ejecutadas para cada
fila recibida.
Incluyen funciones de conversi�n.
- Funciones de grupo
- Funciones anal�ticas y funciones de expresi�n regular
- Funciones de lenguaje-National
- Funciones de referencias a objetos
- Funciones de definici�n programada

1.- Single-Row Function Fundamentals


------------
Incluyen funciones de caracter, numericas, fecha, conversi�n y miscelanea.
Se pueden utilizar en el SELECT, WHERE y ORDER BY de la sentencia SELECT.
SQL> select first_name, TO_CHAR(hire_date,'Day, DD-Mon-YYYY') from employees where
UPPER(first_name) like 'AL%' order by SOUNDEX(first_name).
Tambi�n pueden aparecer en las clausulas SET de UPDATE, VALUES de INSERT y WHERE
del DELETE.

- Functions for NULL Handling


NVL(x1,x2): retorna valor x2 si x1 es NULL. x1 y x2 deben ser del mismo tipo
NVL2(x1,x2,x3): retorna x3 si x1 es NULL y x2 si x1 es NOT NULL. Todos los valores
deben ser compatibles.
COALESCE(x1,x2...xn): retorna el primer valor NOT NULL:
SQL> coalesce(movil, telefono, email, 'No disponible') as "Contacto"
DECODE(arg,cond1,cond1ok,cond2,cond2ok,...condn,condnok...,condDefault). Si no se
proporciona 'conDefault' se puede retornar NULL.
Puede producir error 0RA-01277: fallo al convertir una cadena de car a un n�mero
si no es un literaL numerico v�lido
SQL> select region_id, decode(region_id, 1, 'Europe',2,'Americas','Other') from
countries;
Puede usarse en vez de NVL_
SQL> select decode(null,null,0) from dual;
NULLIF(x1,x2): retorna NULL si x1 y x2 son iguales o x1 es NULL. En cualquier otro
caso retorna x1.

2.- Using Single-Row Character Functions


------------
- Character Function Overview
Toman una entrada caracter y devuelven un valor caracter o num�rico.
Las funciones ASCII, INSTR, LENGTH y REGEXP_INSTR retornan valor num�rico.

- Character Function Descriptions


01.ASCII('c1'): retorna el equivalente num�rico de un caracter
02.CHR(n): retorna el equivalente caracter introduciendo su num�rico.
03.CONCAT(c1,c2): concatena c1 y c2; equivalente a c1 || c2
04.INITCAP(c1): devuelve la cadena con la primera letra de cada palabra en
mayusculas
05.INSTR(c1,c2[,i[,j]]): devuelve 0 o entero con posici�n de subcad en cad: i es
carac desde donde empieza por derecha o izq si es negativo
j: determina el num coincidenci del que queremos la posici�n
06.INSTRB(c1,c2[,i[,j]]): devuelve la posici�n inicial en bytes
07.LENGTH(c): retorna num con longi de cad
08.LENGTHB(c): retorna bytes con longi de cad
09.LOWER(c): pone todas los carac a minus
10.LPAD(c1,i[,c2]): retorna c1 rellenado por la izq con i caracteres usando c2 (o
espacio por defecto)
SQL> select lpad('hola',6,'-_') from dual;
11.RPAD(c1,i[,c2]): igual pero rellenando por la derecha
12.LTRIM(c1[,c2]: retorna c1 sin los caract de c2 por la izq recorriendo c1 hasta
que encuentra un valor no coincidente con c2.
Si no hay coincidencia cad2 en cad1 no hace nada. Si no ponemos c2 el car por
defecto es esp en blanc.
SQK> select ltrim('-_hola','-_') from dual;
13.RTRIM(c1,i[,c2]): igual que LTRIM por la derecha.
14.TRIM([[c1]c2 from ]c3): c1 puede ser (LEADING, TRAILING o BOTH por defecto).
Elimina car c2 de c3 por delante, detras o ambos. c2 por def espacio en blan.
SQL> SELECT TRIM(BOTH '-' from '-fully padded-') test1 FROM dual
SQL> SELECT TRIM(BOTH '-_' from '-_fully padded-_') test1 FROM dual !!!!
ERROR !!!!! ORA-30001: el recorte definido s�lo debe contener un car�cter
15.REPLACE(c1,c2[,c3]): retorna c1 con todas las ocurrencias de c2 reemplazadas por
c3. c3 es NULL por defecto: en este caso se remueven c2 de c1.
SQL> select REPLACE('uptown'.'up','down') from DUAL; --> downtown
SQL> SELECT 'ALTER INDEX '||index_name|| ' rebuild tablespace '||
REPLACE(tablespace_name, 'DATA', 'INDX')|| '; ' DDL FROM user_indexes
WHERE tablespace_name LIKE '%DATA%';
16.SOUNDEX(c1):retorna cad similares foneticamente a c1
17.SUBSTR(c1,x[,y]): retorna parte de c1 en y caracteres empezando desde posicion
x. -x comienza desde el final. Si se omite y muestra desde x hasta el final.
SQL> select substr('12 34',4,2) from dual
18.SUBSTRB(c1,x[,y]): igual que la anterior pero x y i se cuentan en bytes.
19.TRANSLATE(c1,c2,c3): retorna c1 cambiando sus caract indicados en c2 por
indicados c3. No puede ser NULL ninguno.
Si c3 tiene menos car que c2 se omiten estos de m�s de c1. Si es al reves (mas
c3) los sobrantes de c3 no se tienen en cuenta.
SQL> select TRANSLATE(last_name,'aeiou','*#$') from employes -> cambia a por *,
e por # ...
20.UPPER(c):cambia la cad todo a may.

3.- Using Single-Row Numeric Functions


------------
- Numeric Function Overview

- Numeric Function Descriptions


ACOS(n): retorna arc coseno
ASIN(n): retorna arc seno
ATAN(n): retorna arc tangente
ATAN2(n1,n2): retorna arc tangente de n1, n2
BITAND(n1,n2): examina campos bit
COS: retorna coseno
COSH: retorna coseno hiperbolico
SIN: retorna seno
SINH: retorna seno hiperbolico
EXP: retorna valor en base de los logaritmos naturales elevado a la potencia n.
LN: retorna el logaritmo natural de n
LOG: retorna el logaritmo base de n1 sobre n2
NANVL: retorna un valor alternativo si la entrada en NaN.
TAN: retorna la tangente
TANH: retorna la tangente hiperbolica

--01. ABS(n): retorna valor absoluto (quita negativos)


--02. CEIL(n): redondea hacia arriba SQL> select ceil(9.5), ceil(-9.5) from dual;
--03. FLOOR(n): redondea hacia abajo SQL> select floor(9.5), floor(-9.5) from dual;
--04. ROUND(n1[,n2]): retorna n1 redondeando en n2 digitos de la precisi�n a la
derecha del decimal. Si n2 es negativo redondea a la izq del decimal.
Si n2 es 0 quita decimales.
SQL> SELECT ROUND (123.489),ROUND (123.489, 2), ROUND (123.489, -2), ROUND
(1275, -2) FROM DUAL;
--05. TRUNC(n1[,n2]): trunca n1 sin redondear en n2 digitos de la precisi�n a la
derecha del decimal. Si n2 es negativo redondea a la izq del decimal.
Si n2 es 0 quita decimales.
SQL> SELECT ROUND (123.489),ROUND (123.489, 2), ROUND (123.489, -2), ROUND
(1275, -2) FROM DUAL;
--06. MOD(n1,n2): retorna el resto de la divisi�n entre n1 y n2. Usa FLOOR para
redondear. SQL> select mod(11,5), mod(6,3) from dual;
--07. REMAINDER(n1,n2): retorna el resto de la divisi�n entre n1 y n2. Usa ROUND
para redondear.
--08. POWER(n1,n2): retorna n1 a la potencia n2
--09. SIGN(n): retorna -1 si negativo, 1 si positivo y 0 si 0
--10. SQRT(n): retorna la raiz cuadrada de n.
--11. WIDTH_BUCKET(n1,min_val,max_val,buckets): construye histogramas del campo n1
de igual amplitud de rango.
SQL> select width_bucket(salary,2500,11000,10) from employees;

4.- Using Single-Row Date Functions


------------
Funciones que operan tipos DATETIME (DATE,TIMESTAMP,INTERVAL). Los datos DATATIME
se almacenan como n�meros internamente:
se representa la cantidad de d�as desde Enero de 1,4712 BD. La parte decimal es la
fracci�n de un d�a(0.5 = 12 horas).

- Date-Format Conversion
El formato fecha viene definido en el par�metro NLS (NLS_DATE_FORMAT - National-
languaje support). Por defecto es DD-MON-RR.
SQL> ALTER SESSION SET NLS_DATE_FORMAT='DD-Mon-YYYY HH24:MI:SS';

- Date-Function Overview

- Date-Function Descriptions
--01. SYSDATE: retorna fecha y hora con segundos del SO con tipo DATE en formato
definido en NLS_DATE_FORMAT: 31-MAR-2008 12:00:13 PM
--02. SYSTIMESTAMP([p]): retorna fecha y hora con fraccion de segundos (6 digitos
precisi�n) del SO con tipo TIMESTAMP TZ en formato
definido en NLS_TIMESTAMP_TZ_FORMAT: 1-MAR-08 12.01.49.280000 PM -05:00
--03. LOCALTIMESTAMP([p]): retorna fecha y hora de la zona horaria de la sesi�n con
fracci�n de segundos: 31-MAR-08 02.02.49.272000 PM en formato
definido en TIME_ZONE

--04. CURRENT_DATE:retorna fecha y hora con segundos de la zona horaria del cliente
seg�n calendario Gregoriano con tipo DATE en formato definido en NLS_DATE_FORMAT:
31-MAR-2008 12:00:13 PM.
Si configuramos TIME_ZONE = 'US/Eastern' nos dar� hora local de US.
SQL> ALTER SESSION SET NLS_DATE_FORMAT='DD-Mon-YYYY HH24:MI:SS';
SQL> alter session set TIME_ZONE = 'US/Eastern';
SQL> select current_date from dual; -- 21-Feb-2016 06:52:27
SQL> alter session set TIME_ZONE = 'Europe/Madrid';
SQL> select current_date from dual; -- 21-Feb-2016 12:52:27
--05. CURRENT_TIMESTAMP([p]): retorna fecha y hora de la zona horaria de la sesi�n
con fracci�n de segundos: 31-MAR-08 02.02.49.272000 PM en formato
definido en TIMESTAMP WITH TIME ZONE: 31-MAR-08 12.23.43.305000 PM US/EASTERN

--06. ADD_MONTHS(d,i): suma meses i a una fecha d_date


SQL> select add_months(sysdate, -1) from dual;
--07. MONTHS_BETWEEN(d1,d2): retorna el num de meses entre dos DATE en negativo si
es ENE-FEB y POSITIVO si es FEB-ENE
--08. EXTRACT(c from dt): retorna c (YEAR...SECOND; TIMEZONE_/REGION/ABBR para tipo
TM WITH TZ)
Tipo DATE (SYSDATE): solo a�o, mes y dia;

--09. DBTIMEZONE: retorna la zona temporal de la bbdd configurada por el ultimo


CREATE DATABASE o ALTER DATABASE SET TIME_ZONE: +00:00 por defecto
Hay que tener en cuenta que la bbdd tiene que ser reiniciada cuando cambiamos la
zona temporal
--10. SESSIONTIMEZONE: retorna el TZ bbdd despu�s del ultimo ALTER SESSION.

--11. FROM_TZ(ts, tz): retorna TZ de una regi�n determinada. Usar con


LOCALTIMESTAMP no SYSTIMESTAMP.
SQL> select FROM_TZ(LOCALTIMESTAMP, 'Japan') from dual; 31-MAR-08
03.17.38.447000 PM JAPAN
--12. TZ_OFFSET(tz): retorna el num de la time zone tz en formato texto (columna
TZNAME de V$TIMEZONE_NAMES)
SQL> select tz_offset('Europe/Madrid') from dual; +01:00
--13. SYS_EXTRACT_UTC: retorna UTC(GMT) de un TS: elimina +01:00...
SQL> select sys_extract_utc(current_timestamp) from dual; 31-MAR-08
08.06.53.731000 PM
--14. NEW_TIME(d,tz1,tz2): retorna la fecha TZ2 en relaci�n a d en TZ1
SQL> SELECT SYSDATE Dallas, NEW_TIME(SYSDATE, �CDT�, �HDT�) Hawaii FROM dual;
31-MAR-2008 14:34:03 31-MAR-2008 10:34:03

5.- Using Single-Row Conversion Functions


------------

- Conversion-Function Overview
Tipos de datos:
- Caracter: CHAR, VARCHAR2, NCHAR, NVARCHAR2 y CLOB.
- Num�rico: NUMBER, BINARY_DOUBLE y BINARY_FLOAT
- Fecha/Hora: DATE, TIMESTAMP e INTERVAL

- Conversion-Function Descriptions
-- ASCIISTR(c1): retorna todos los caracteres con su equivalencia ASCII o
formato \xxxx (representaci�n UTF-16 de los NO ASCII)
SQL> select ASCIISTR('ca�on') from dual; -- ca\00F1on
-- BIN_TO_NUM(b): de un binario obtiene un num.
SQL> select bin_to_num(1,0,0,0), bin_to_num(0,1) from dual;
-- CAST(exp AS dt): convierte tipos
SQL> select cast(sysdate as timestamp with local time zone) from dual;
- Conversiones permitidas:
- CHAR, VARCHAR2: no NCHAR/NVARCHAR2
- NCHAR, NVARCHAR2: no CHAR/VARCHAR2
- NUMBER: no DATE..., RAW/ROWID_UROWID
- BINARY_FLOAT/DOUBLE: no DATE..., RAW/ROWID_UROWID
- DATE...: solo CHAR/VARCHAR2
- RAW: solo CH y NCH
- ROWID, UROWID: solo CH y NCH

-- CHARTOROWID(cad): obtiene ROWID


SQL> ... where rowid=chartorowid('AAARAgAAFAAAABYAA9');
-- COMPOSE(cad): convierte a Unicode completamente normalizada.
-- DECOMPOSE(cad): convierte a Unicode despu�s de su descomposici�n can�nica.
-- CONVERT(cad, destjuecar [,origjuecar]): transforma de un juego de carac a otro
SQL> select convert('vis-�-vis','AL16UTF16','AL32UTF8') from dual;
-- NUMTODSINTERVAL(num,unidad): retorna un intervalo DIA/SEGUNDO de tiempo pasando
un num y una unidad (DAY, HOUR, MINUTE, SECOND)
SQL> select sysdate+numtodsinterval(2,'HOUR') from dual;
-- NUMTOYMINTERVAL(num,unidad): retorna un intervalo A�O/MES de tiempo pasando un
num y una unidad (A�O, MES)
SQL> select sysdate+numtoyminterval(2,'YEAR') from dual;
-- RAWTOHEX(cadraw): convierte un tipo raw en un tipo hexadecimal sin translaci�n
de valores.
-- ROWIDTOCHAR(rowid): convierte un ROWID en un CHAR.
SQL> select rowidtochar(rowid) from employees; -- AAARAgAAFAAAABYAA9
-- SCN_TO_TIMESTAMP(num): retorna el TIMESTAMP de un n�mero.
SQL> select scn_to_timesptamp(8569432113130) upd_time from dual;
Un SCN es un n�m que se incrementa cuando un commit sucede en una bbdd.
Identifica el estado de la bbdd de manera �nica y lo guarda en
los ficheros redo log pudiendose usar esta informaci�n en caso de restauraci�n
de la instancia.
ORACLE proporciona la pseudocolumna ORA_ROWSCN que identifica el SCN en relaci�n
al bloque que contiene la fila que fue modificada la ultima vez.
Usando ORA_ROWSCN se puede identificar cuando la fila fue modificada. La
identificaci�n es aproximada porque el SCN est� asociado al bloque y todas
las filas de ese bloque tienen el mismo SCN. Realmente SCN sirve para
identificar la �ltima modificaci�n de la tabla porque un bloque solo puede
pertenecer a una tabla.
SQL> select scn_to_timestamp(ora_rowscn) mod_time, last_name from employees
where first_name='Lex';
-- TIMESTAMP_TO_SCN(ts): convierte un TIMESTAMP en un num que sirve de SCN.
-- TO_BINARY_DOUBLE(num_cad,format,lang): retorna un binary double punto flotante
en un BINARY DOUBLE representado en lang
SQL> select to_binary_double('1234.5678','999999.9999') from dual; --
1.2345678E+003
-- TO_BINARY_FLOAT(num_cad,format,lang): retorna un binary precisi�n simple
flotante en BINARY FLOAT representado en lang
SQL> select to_binary_float('1234.5678','999999.9999') from dual; --
1.2345678E+003
-- TO_CHAR(date_num,format,lang): retorna date_num convertido en VARCHAR2
Conversi�n DATE:
SQL> select to_char(sysdate,'"On the "Ddspth" day of "Month, YYYY',
'NLS_DATE_LANGUAGE=Spanish') from dual;
-- On the Twenty-Eighth day of Febrero , 2016
SQL> select to_char(to_date('10-abr-16'),'Ddspth " of " Month') from dual; --
Tenth of Abril
SQL> select to_char(to_date('10-abr-16'),'Ddth " of " Month') from dual; -- 10th
of Abril
SQL> select to_char(to_date('10-abr-16'),'FMDdspth " of " Month FMHH:MI:SS AM')
from dual;
Conversi�n NUMBER:
SQL> SELECT TO_CHAR(-
1234.56,'L099G999D99MI','NLS_NUMERIC_CHARACTERS='',.''NLS_CURRENCY=''DM''NLS_ISO_CU
RRENCY=''GERMANY''') Balance FROM dual;
-- DM001.234,56-
-- TO_CLOB(tipo): retorna un CLOB a partir de un tipo CHAR, VARCHAR2, NCLOB, NCHAR,
NVARCHAR2 o CLOB.
-- TO_DATE(cad,formato,lang): retorna una fecha a partir de una cadena. Si se omite
formato se utiliza NLS_DATE_FORMAT.
SQL> select to_date('SEP-2007 13','MON/YYYY HH24') from dual; -- 01/09/07
-- TO_DSINTERVAL(cad): retorna un intervalo dia/segundo a partir de una cadena.
SQL> select sysdate+to_dsinterval('007 12:00:00') from dual;
-- TO_LOB(long): retorna un BLOB de un LONG RAW o un CLOB de un LONG.
-- TO_MULTI_BYTE(cad): retorna cad con todos los carac convertidos en multibytes.
"Aparecen car en peque�o".
-- TO_NUMBER(cad_num,format,lang): retorna num de cadena o n�mero
-- TO_SINGLE_BYTE(cad): retorna cad en simple bytes.
-- TO_TIMESTAMP(cad,format,lang): devuelve TIMESTAMP de una cadena. Si no se
establece formato toma NLS_TIMESTAMP_FORMAT.
SQL> select to_timestamp('01-ENE-2007 01:00:00.001','DD-MON-YYYY HH24:MI:SS.FF')
from dual;
-- TO_TIMESTAMP_TZ cad,format,lang): devuelve TIMESTAMP TZ de una cadena. Si no se
establece formato toma NLS_TIMESTAMP_TZ_FORMAT.
-- TO_YMINTERVAL(cad): retorna intervalo a�o/mes de una cadena.
SQL> select sysdate+to_yminterval('01-03') from dual;
-- UNISTR(unicode): retorna cad a partir de Unicode
SQL> select unistr('\00A3'), unistr('ca\00F1on') from dual;

6.- Using Other Single-Row Functions


------------

- Miscellaneous-Functions Overview

- Miscellaneous-Function Descriptions

--01 BFILENAME(dir,file): retorna un localizador BFILE vacio instanciando el BFILE.


El dir debe existir.
--02 EMPTY_BLOB(): retorna un localizador BLOB vacio. Se inicializa la var o colum
de tabla BLOB. Instancia pero no publica.
--03 EMPTY_CLOB(): retorna un localizador CLOB vacio. Se inicializa la var o colum
de tabla CLOB. Instancia pero no publica.

--04 GREATEST(list_expr): devuelve la exp m�s alta en relaci�n al tipo de la expr


primera. CHAR o NUMBER aunque venga DATE. Los espacios = menor valor.
Intenta convertir todas las exp al tipo de la primera:
SQL> select greatest(345,'XYZ',2354) from dual; -- error ORA-01722: invalid
number
SQL> select greatest('XYZ',345,2354) from dual; -- XYZ
--05 LEAST(list_expr): devuelve la exp mas baja en relaci�n al tipo de la exp.
primera.

--06 ORA_HASH(exp,rangomax,difresuset): retorna un ejemplo aleatorio de filas de


una tabla.
Ejemplo que divide el resultado en 20 rangos y muestra el rango 0:
SQL> select department_id, last_name, salary from employees where
ORA_HASH(last_name || first_name,19,2) = 0;
--07 DUMP(exp,format_8_10_16_17+1000,bytestart,byteslength): retorna cad
conteniendo tipo de exp en notaci�n num�rica, longi en bytes y representaci�n
interna.
SQL> select last_name, DUMP(last_name,1017,3,3) from employees where last_name
like 'J%'; -- Johnson Typ=1 Len=7 CharacterSet=AL32UTF8: h,n,s
--08 SYS_GUID(): genera un valor RAW como identificador �nico global que sirve como
identificador �nico de una fila.
SQL> select sys_guid() from dual; -- DC7C19A3AD264CE184C64194E65F83E5
--09 SYS_CONTEXT(namespace,parametro,length256): namespace es USERENV y describe la
sesi�n actual. Tipo VARCHAR2.
SQL> SELECT SYS_CONTEXT ('USERENV', 'USER'), SYS_CONTEXT ('USERENV',
'CURRENT_SCHEMA'), SYS_CONTEXT ('USERENV', 'HOST'), SYS_CONTEXT ('USERENV',
'NLS_TERRITORY') FROM DUAL;
--10 USERENV(param): retorna el valor del parametro pasado: SESSIONID, ISDBA,
INSTANCE, LANGUAGE, LANG, TERMINAL.
SQL> SELECT USERENV ('TERMINAL') FROM DUAL;
SELECT SYS_CONTEXT ('USERENV', 'OS_USER'),
SYS_CONTEXT ('USERENV', 'CURRENT_SCHEMA'),
SYS_CONTEXT ('USERENV', 'HOST'),
SYS_CONTEXT ('USERENV', 'NLS_TERRITORY'),
SYS_CONTEXT ('USERENV', 'SESSIONID'),
SYS_CONTEXT ('USERENV', 'ISDBA'),
SYS_CONTEXT ('USERENV', 'INSTANCE'),
SYS_CONTEXT ('USERENV', 'LANGUAGE'),
SYS_CONTEXT ('USERENV', 'LANG'),
SYS_CONTEXT ('USERENV', 'TERMINAL')
FROM DUAL;
--11 UID: retorna con num el UID del usuario de la sessi�n actual (se extrae de la
vista dba_users)
SQL> show user
SQL> select username, account_status from dba_users where user_id = UID;
--12 USER: retorna el nombre del usuario actual
SQL> select default_tablespace, temporary_tablespace from dba_users where
username = USER;

/* --- FUNCIONES --- */

SET PAGES 0 LINESIZE 170


set verify off
set feedback off
set head off
set echo off
set autotrace off

/* GESTION DE NULOS */
--01 NVL select nvl(null,0) from dual;
--02 NVL2 select nvl2(null,'no es nulo','es nulo') from dual;
--03 COALESCE select coalesce(null,'el segundo valor no es nulo y se selecc',null)
from dual;

/* FUNCIONES CARACTER*/
--01.ASCII select ASCII('B') from dual;
--02.CHR select CHR(66) from dual;
--03 CONCAT select concat('cara','col') from dual;
--04 INITCAP select initcap('hola mundo') from dual;
--05 INSTR select instr('caracolcol','col',-1,2) from dual;
--06 INSTRB
--07 SUBSTR select substr('12 34',-2,2) from dual;
--08 SUBSTRB
--09 LENGTH select length('12345') from dual;
--10 LENGTHB select lengthb('12345') from dual;
--11 VSIZE select last_name, vsize(last_name) from employees; -- Kaufling 8
--12 LOWER select lower('ABCD') from dual;
--13 UPPER select upper('abcd') from dual;
--14 LPAD select lpad('12345',10,'x') from dual;
--15 RPAD select rpad('12345',10,'x') from dual;
--16 LTRIM select ltrim('---12345','-') from dual;
--17 RTRIM select rtrim('122345---','-') from dual;
--18 TRIM select trim(BOTH '-' from '-12-45-') from dual;
--19 REPLACE select replace('girasol','gir','car') from dual;
--20 TRANSLATE select translate('Murcielago','aei','*?�') from dual
--21 SOUNDEX

/* FUNCIONES NUMERICAS */
--01 ABS select abs(-1) from dual;
--02 CEIL select ceil(9.5), ceil(-9.5) from dual;
--03 FLOOR select floor(9.5), floor(-9.5) from dual;
--04 ROUND select round(123.45), round(123.485,2), round(123.456,-2) from dual;
--05 TRUNCATE select trunc(123.45), trunc(123.485,2), trunc(123.456,-2) from dual;
--06 MOD select mod(13,5), mod(10,5) from dual;
--07 REMAINDER select remainder(13,5), remainder(10,5) from dual;
--08 POWER select power(2,3) from dual
--09 SIGN select sign(-5), sign(5), sign(null) from dual;
--10 SQRT select sqrt(64) from dual
--11 WIDTH BUCKET select width_bucket(salary,2500,11000,10) RANGO, salary from
employees order by RANGO;

/* FUNCIONES DATE-TIME */
set pages 170;
alter session set NLS_DATE_FORMAT='DD/MM/YYYY HH24:MI:SS';
alter session set nls_timestamp_format='DD/MM/YY HH24:MI:SS.FF';
ALTER SESSION SET NLS_TIMESTAMP_TZ_FORMAT='DD/MM/YY HH24:MI:SS TZR';
ALTER SESSION SET TIME_ZONE = 'US/Eastern';
--ALTER SESSION SET TIME_ZONE = '+01:00';
--ALTER SESSION SET TIME_ZONE = 'Europe/Madrid';

--01 SYSDATE select sysdate from dual; -- SO 23/02/2016 19:43:43 -- NLS_DATE_FORMAT


--02 CURRENT_DATE select current_date from dual; -- SESS 23/02/2016 18:31:04 --
NLS_DATE_FORMAT
--03 SYSTIMESTAMP select systimestamp(4) from dual; -- SO 23/02/2016
19:45:21,789026 +01:00 -- NLS_TIMESTAMP_TZ_FORMAT
--04 CURRENT_TIMESTAMP select current_timestamp(4) from dual; --SESS 23/02/2016
13:33:18,3598 -05:00 -- NLS_TIMESTAMP_TZ_FORMAT
--05 LOCALTIMESTAMP select localtimestamp(4) from dual; -- SESS 23/02/2016
13:34:11,1117 -- TIMEZONE 'US/Eastern'

--06 DBTIMEZONE select dbtimezone from dual;-- +00:00 -- ALTER DATABASE


--07 SESSIONTIMEZONE select sessiontimezone from dual; -- US/Eastern -- ALTER
SESSION
--08 TZ_OFFSET select TZ_OFFSET(sessiontimezone) from dual; -- +01:00
--09 FROM_TZ select from_tz(localtimestamp,'Japan') from dual; --24/02/2016
3:09:52,860334 +09:00
--10 SYS_EXTRACT_UTC select sys_extract_utc(localtimestamp) from dual; --25/02/2016
19:37:45,966177

--11 ROUND select round(sysdate,'MM') from dual; -- 01/03/2016 00:00:00


--12 TRUNC select trunc(sysdate,'mm') from dual; -- 01/02/2016 00:00:00

--13 ADD_MONTHS select add_months(sysdate, -1) from dual;


--14 MONTHS__BETWEEN select months_between(sysdate,'01/06/2016') from dual; --
3.2464856
--15 NEXT_DAY select next_day(sysdate,'Vie') from dual; -- 26/02/2016 20:16:46
--16 LAST_DAY select last_day(sysdate) from dual;-- 29/02/2016 20:18:07
--17 NEW_TIME select new_time(sysdate,'GMT','CDT') from dual;
--18 EXTRACT select extract(TIMEZONE_ABBR from systimestamp(9) ) from dual; -- UNK

/* FUNCIONES DE CONVERSION*/

--01 CAST select cast(sysdate as timestamp with time zone) from dual; -- 28/02/2016
20:14:07,000000 +01:00
-- Compatibilidad tipos:
-- CHARs: no NCHARs
-- NCHARs: no CHARs
-- NUMBER: no DATEs, RWs...
-- BINARYs: no DATEs, RWs...
-- DATE: solo CHARs
-- RWs: solo CHARs, NCHARs
--02 TO_NUMBER
-- select to_number('123') from dual;
-- select to_number(123) from dual;
--03 TO_BINARY_DOUBLE(cad_num) select to_binary_double('1234.5678','999999.9999')
from dual; -- 1234,5678
--04 TO_BINARY_FLOAT(cad_num) select to_binary_float('1234.5678','999999.9999')
from dual; -- 1,2345E+37
--05 TO_CHAR(date_num)
-- select to_char(sysdate,'"On the "Ddspth" day of "Month, YYYY',
'NLS_DATE_LANGUAGE=Spanish') from dual;-- On the Twenty-Ninth day of Febrero ,
2016
-- SELECT TO_CHAR(-
1234.56,'L099G999D99MI','NLS_NUMERIC_CHARACTERS='',.''NLS_CURRENCY=''DM''NLS_ISO_CU
RRENCY=''GERMANY''') Balance FROM dual; -- DM001.234,56-
--06 TO_CLOB(tipochar) -- select to_clob('cadena') from dual; -- cadena
--07 TO_LOB(long_raw)

--08 TO_DATE select to_date('01/ENE/2016','dd/mon/yyyy hh24:mi:ss') from dual; --


01/01/2016 00:00:00
--09 TO_TIMESTAMP select to_timestamp('01-ENE-2007 01:00:00.001','DD-MON-YYYY
HH24:MI:SS.FF') from dual; -- 01/01/2007 1:00:00,001000000
--10 TO_TIMESTAMP_TZ select to_timestamp_tz('01-ENE-2007 01:00:00.001 Japan','DD-
MON-YYYY HH24:MI:SS.FF TZR') from dual; -- 01/01/2007 1:00:00,001000000 +09:00

--11 TO_DSINTERVAL select sysdate+to_dsinterval('001 00:00:01') from dual;


--01/03/2016 16:34:35
--12 NUMTODSINTERVAL select sysdate+numtodsinterval(1,'DAY') from dual; 01/03/2016
13:21:14
--13 TO_YMINTERVAL select sysdate+to_yminterval('01-02') from dual;
--14 NUMTOYMINTERVAL select sysdate+numtoyminterval(1,'MONTH') from dual;
29/03/2016 13:22:24

--15 CHARTOROWID select last_name from employees where


rowid=chartorowid('AAB2g0ABiAAAACrAA6'); -- Zlotkey
--16 ROWIDTOCHAR select rowidtochar((select rowid from employees where last_name in
('Zlotkey'))) from dual; -- AAB2g0ABiAAAACrAA6
--17 TIMESTAMP_TO_SCN select timestamp_to_scn(systimestamp) from dual;
--18 SCN_TO_TIMESTAMP
-- select scn_to_timestamp(timestamp_to_scn(8,3403E+10)) from hr.employees;
--select ORA_ROWSCN from employees;
--select scn_to_timestamp(8,3403E+10) mod_time, last_name from hr.employees
where first_name='Lex';

--19 ASCIISTR select asciistr('ca�on') from dual; -- ca\00F1on


--20 UNISTR select unistr('ca\00F1on') from dual; -- ca�on
--21 COMPOSE select compose('ca�on') from dual; -- ca�on (Unicode normalizado)
--22 DECOMPOSE select decompose('ca��n') from dual; -- ca�on (Unicode can�nico)
--23 CONVERT select convert('CA�ON','WE8ISO8859P15','AL32UTF8') from dual; -- CA�N
-- select convert('CA�ON','AL32UTF8') from dual; -- CA�?ON

--24 BIN_TO_NUM select bin_to_num('1','0','0','0') from dual; -- 8


--25 TO_SINGLE_BYTE(cad)
--26 TO_MULTI_BYTE(cad)
-- RAWTOHEX(cadraw)

/* FUNCIONES MISCELANEA */

--01 BFILENAME select bfilename('fich.txt','c:\') from dual; -- fich.txt//c:\


--02 EMPTY_BLOB UPDATE tabla SET campoBLOB = EMPTY_BLOB();
--03 EMPTY_CLOB UPDATE tabla SET campoCLOB = EMPTY_CLOB();
--04 GREATEST select greatest('xzy',456, 123) from dual; -- xyz
--05 LEAST select least('xyz',456,123) from dual; --- 123
--06 ORA_HASH select last_name from hr.employees where ora_hash(last_name,20,5) =
0;-- Tobias Tuvault Vargas Vishney
--07 DUMP select dump('1234',1017,2,2) from dual; -- Typ=96 Len=4
CharacterSet=WE8ISO8859P15: 2,3

--08 SYS_GUID select 'Primer generacion', sys_guid() from dual; --


2D39393AA4E57B72E053C3843C0A642F
--09 SYS_CONTEXT select sys_context('USERENV','OS_USER') from dual;-- jjdlcs01
--10 USERENV() SELECT USERENV ('TERMINAL') FROM DUAL;-- ESESC0241
--11 UID select uid from dual;-- 0
--12 USER select user from dual; -- SYS

--- Expresiones regulares ---

-- Pr�logo.-
Funciones REGEXP (REGular EXPressions): permiten el procesamiento intensivo de
cadenas de caracteres con bbdd Oracle y lenguajes SQL y PL/SQL.

-- Que son las expresiones regulares.-


Es una cadena de caract�res que def�nen un patr�n de b�squeda. Manejan literales y
metacaracteres/operadores (caracteres con un significado especial).

-- Para que sirven las expresiones regulares.-


a) Busqueda de texto: busquedas de cadenas de car en las colum
b) Formateo de datos: modificar los datos proyectados en las SELECT; invertir
palabras, agregar o quitar car
c) Definici�n de contraints: para que una col se ajuste a un formato
determinado (check)
d) Manipulaci�n de datos: aplicaci�n de reglas de busqueda y reemplazo

-- La combinaci�n {0,} busca el caracter precedente 0 (cero) o m�s veces

-- El metacaracter (|) indica un caracter u otro (a|e)

-- El metacaracter (?) indica que el elemento de delante es opcional.

-- El metacaracter punto(.)
Coincide con cualquier caracter: ca.a (casa: si - pata: no)

-- El metacaracter suma(+)
Coincide con cualquier num de caract. iguales al car que precede: cas+a
(cassa: si - tassa: no)

-- El metacaracter asterisco(*)
Coincide con cualquier num de caract. iguales al car que precede o no existe:
ca*a (cassa: si - caa: si - lasa: no)

-- El metacaracter [abc...] o [a-c]


Coincide con cualquiera de los car de manera unitaria: ca[st]a (cata:si,
casa:si, cala:no, casta:no)
Permite rangos con '-': ca[1-5]0 (ca10:si, ca20:si, ca60:no)

-- El metacaracter [^abc...]
No deben coincidir los caract: ca[^snt]s (casa:no, cala:si)

-- El metacaracter subexp(expr).
Toda la exp entre parentesis representa una cad de car. La exp se puede
conjugar con metacaracteres.
chau(hola)*chau: (chauholachau:si, chauholaholachau:si, chauchau:si,
holachau:no, chauhochau:no)

-- El metacaracter de anclaje al principio de linea(^).


Obliga a que existan los literales al principio de la linea: ^hola (hola:si,
holacaracola:si, chauhola:no)

-- El metacaracter de anclaje al final de la linea($)


Obliga a que existan los literales al final de la linea: hola$ (hola:si,
holacaracola:no, chauhola:si)

-- El metacaracter de escape (\)


Permite interpretar un metacaracter como literal. El doble \\ interpreta como
metacaracter el \: hola\* (hola*:si, hola:no, hol*:no)

Q297.- Expresiones que se corresponden con '[Ale|ax.r$]'


D. Alaxander
E. Alexender

Q278.- Como formatea la columna PHONE NUMBER con la siguiente query:


sql> select phone_number, ('\1\2\3')
regex_replace(phone_number,'([[:digit:]]{3}\.'[[:digit:]]{3}\.'[[:digit:]]{4}\.)'
from employees;
C. (xxx) xxx-xxxx

-- Clases de caracteres:

-- [:alnum:] cualquier car alfanumerico


-- [:word:] letras, numeros y subrayados
-- [:alpha:] cualquier car alfabetico
-- [:digit:] cualquier digito
-- [:blank:] espacio y tabulaci�n
-- [:space:] todos los espacios en blanco incluidos saltos de linea
-- [:cntrl:] caracteres de control
-- [:puntc:] puntuaci�n y simbolos
-- [:lower:] minusculas
-- [:upper:] mayusculas
280.- select street_address from locations where
regexp_instr(street_address,'[^[:alpha:]]') = 1;
D. Muestra las direcciones donde el primer caracter no es una letra del
alfabeto.

-- Uso de las expresiones regulares

-- REGEXP_LIKE: permite retornar aquellas filas que coinciden con el patr�n


especificado
sql> select nombre from empleados where regexp_like(nombre, '[ ][ ][ ]
*'); -- muestra filas en que haya dos o m�s espacios separando nombres y apell
sql> alter table impuestos add constraint c_cuit
check (regexp_like(cuit,'[0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-
9][0-9][0-9]-[0-9]') -- chequea no se puedan insertar filas que no respeten el form
99-99999999-99
enable novalidate;
-- REGEXP_COUNT: permite contar el num de veces que aparece un patr�n
-- REGEXP_REPLACE: permite hacer una busqueda y reemplazar una cad
sql> update empleados set nombre = regexp_replace(nombre,'[ ][ ][ ]*',
' ') -- cambia dos o m�s espacios por uno solo
where regexp_count(nombre,'[ ][ ][ ]*') > 0;
-- donde haya m�s de uno o mas espacios en blanco
sql> update tre set trec1 = regexp_replace (trec1,'[ ][ ]*',' ')
where exists (select trec1 from tre where regexp_like(trec1,'[ ]
*'));
-- REGEXP_SUBSTR: permite extraer una sub que coincida con un patr�n
-- REGEXP_INSTR: permite determinar la pos de un patr�n especifico

Hemos visto varios ejemplos para demostrar el potencial y utilidad que nos ofrecen
las expresiones regulares en las bases de datos Oracle. Existen muchos m�s
metacaracteres que no hemos mencionado aqu�. Las funciones tampoco las hemos visto
en profundidad; hay m�s argumentos para hacer b�squedas que ignoren may�sculas y
min�sculas, etc. Para seguir profundizando el tema, aqu� dejamos algunos links de
inter�s:

Using Regular Expressions in Database Applications


Oracle� Database Advanced Application Developer's Guide
11g Release 2 (11.2)
Part Number E25518-04
http://docs.oracle.com/cd/E11882_01/appdev.112/e25518/adfns_regexp.htm#ADFNS1003

Introducing Oracle Regular


Expressions
An Oracle White Paper
Author: Peter Linsley
http://www.oracle.com/technetwork/database/focus-areas/application-development/twp-
regular-expressions-133133.pdf

Regular-Expressions.info
The Premier website about Regular Expressions
http://www.regular-expressions.info/

--- FIN - Expresiones regulares ---

<TAB>------------
CAPITULO 3.- Funciones de Grupo
------------
RESUMEN:
select column|exp|group_function(colum|exp[alias]),...
from table
where conditions
group by col|exp
having group_conditions
order by col|exp|num_pos ASC|DESC|NULL FIRST|LAST;

- HAVING solo puede aparecer si aparece GROUP BY; y puede aparecer antes o despu�s
de este.

3.1 Fundamentos
Las funciones de grupo (o funciones de agregado) retornan un valor basado en un num
de elementos que no est�n determinados hasta que se ejecuta la consulta.
No consideran valores NULL excepto COUNT(*).
Si todos los elementos son NULL o no hay valores se retorna NULL, con la excepci�n
de COUNT que devuelve el valor 0.
La funciones de grupo se pueden aplicar a todos los elementos (ALL - por defecto) o
teniendo en cuenta solo los distintos (DISTINCT)

3.2 Funciones de agregaci�n


Pueden aparecer en el SELECT, ORDER BY o HAVING.
Cuando se usa en el select se requiere GROUP BY que de no aparecer muestra el
resultado completo.
El GROUP BY y el HAVING son clausulas del SELECT y permiten agrupaci�n de datos.
No pueden aparecer en el WHERE.

3.2.1 Agrupando con GROUP BY


En el SELECT la agrupaci�n por defecto (no aparece GROUP BY) es el resultado
completo.
Sintaxis: SELECT [column names], group_function (column_name), ... FROM table
[WHERE condition] [GROUP BY colum] [ORDER BY colum]
Se puede agrupar con el SELECT si no hay m�s columnas:
sql> select count(*) from employees;
sql> select department_id, count(*) from employees; -> ERROR at line 1: ORA-
00937: not a single-group group function
Uso con m�s de una columna:
sql> select department_id, count(*) from employees group by department_id; ->
CORRECTO
Con m�s de una columna no necesita que aparezca en el SELECT pero si en el GROUP BY
sql> select max(count(*)) from employees group by job_id;
sql> select max(count(*)) from employees group by job_id, department_id;
Agrupar con formato:
sql> select to_char(fec2,'rr'), count(fec1) from fechas group by
to_char(fec2,'yyyy'); -- ORA-00979: No es una expresi�n GROUP BY (incompatibilidad
de formato)
sql> select to_char(fec2,'rr'), count(fec1) from fechas group by fec2; --
CORRECTO: formatea la salida
sql> select fec2, count(fec1) from fechas group by to_char(fec2,'rr'); --
CORRECTO: agrupa seg�n la fecha una vez formateada: OJO !!! AGRUPA DIFERENTE DE
SOLO GROUP BY FEC2
Uso con ordenaci�n
sql> select department_id, count(*) from employees group by department_id
order by count(*), department_id;
GROUP BY no permite el uso de alias ni posici�n de columna.
Si tenemos m�s de una columna en el GROUP BY se crean grupos con grupos; y deben
aparecer el mismo numero de columnas en en SELECT.
El orden de las columnas determina la agrupaci�n. Solo se garantiza ordenaci�n si
establecemos ORDER BY.
sql> select department_id, job_id, count(*) from employees group by
department_id, job_id order by 1, 2;
DEPARTMENT_ID JOB_ID COUNT(*)
------------- ---------- ----------
10 AD_ASST 1
20 MK_MAN 1
20 MK_REP 1
30 PU_CLERK 5
30 PU_MAN 1

3.2.2 Intro Funciones de Grupo

3.2.3 Caracter�sticas Funciones de Grupo - Parte 1


-- AVG(distinct exp) -- select deptno, avg(sal+comm) from emp group by depno;
-- MEDIAN(exp) Valor medio despues de ordenar los valores -- select job_id,
median(salary), avg(salary) from emp group by job_id;
-- COUNT(* | distinct | all exp) Con * cuenta NULLs -- select count(*),
count(distinct deparment_id), count(all department_id) from emp;
-- MAX(exp) Acepta DISTINC pero no afecta. Puede ser DATE, NUMBER o VARCHAR2.
-- MIN(exp) Acepta DISTINC pero no afecta. Puede ser DATE, NUMBER o VARCHAR2.
sql> select job_id, min(hire_date), min(salary) from emp group by job_id;
-- SUM(distinct exp)
sql> select substr(phone_number,1,3) sum(salary) from employees group by
substr(phone_number,1,3);
-- STDDEV(distinc exp) Desviaci�n estandar.
-- VARIANCE(distinc exp)

3.2.4 Caracter�sticas Funciones de Grupo - Parte 2

3.2.5 Limitando Funciones de Grupo con HAVING


HAVING filtra los datos agrupados; estos no pueden utilizar WHERE.
sql> select department_id, sum(salary) from emp where department_id != 50 and
sum(salary) > 10000 group by deparment_id -> ERROR !!!
sql> select department_id, sum(salary) from emp where department_id != 50
group by deparment_id having sum(salary) > 10000 -> OK
HAVING puede utilizar col sin agrupar pero deben tambien aparecer en el SELECT:
sql> select department_id, avg(salary) from emp group by department_id having
trunc(deparment_id) > 50;
sql> select tgc1, sum(tgc2) from tg where tgc1 > 0 group by tgc1 having tgc1
between 1 and 5;
NO sql> select tgc1, sum(tgc2) from tg where tgc1 > 0 group by tgc1 having
tgc3 between 'a' and 'c'; -- ORA-00979: no es una expresi�n GROUP BY
Puede condicionarse de manera distinta a la agrupaci�n:
sql> select tgc1 from tg group by tgc1 having sum(tgc2) > 3;
WHERE filtra antes de agrupar; HAVING filtra despu�s de agrupar.
Si el SELECT incluye un WHERE y un GROUP BY este y HAVING deben aparecer despu�s
del WHERE.
Se permite que HAVING aparezca antes del GROUP BY.
sql> SELECT department_id, COUNT(*) FROM employees HAVING COUNT(*) > 10 GROUP
BY department_id;
Pueden aparecer func.Gr distintas en el SELECT y en el HAVING
sql> select department_id, sum(salary) from employees where department_id <>
50 group by department_id having count(*) > 30;

3.2.6 Creaci�n de Superagregados con CUBE y ROLLUP; GROUPING SETS


Partimos de una consulta sencilla con GROUP BY para obtener suma de salarios
agrupando por departamento y puesto:
sql> select deptno,job,sum(sal) from emp group by deptno,job
DEPTNO JOB SUM(SAL)
---------- --------- ----------
10 CLERK 1300
10 MANAGER 2450
10 PRESIDENT 5000
20 CLERK 1900
20 ANALYST 6000
20 MANAGER 2975
30 CLERK 950
30 MANAGER 2850
30 SALESMAN 5600

- GROUPING SETS: nos permite obtener primero la suma de salarios por dept y despu�s
por job
sql> select deptno,job,sum(sal) from emp group by grouping sets((deptno),
(job));
DEPTNO JOB SUM(SAL)
---------- --------- ----------
10 8750
20 10875
30 9400
ANALYST 6000
CLERK 4150
MANAGER 8275
PRESIDENT 5000
SALESMAN 5600

- ROLLUP: mostraremos ahora la suma de salarios por depto y job indicando primero
el total por dto y al final el total de todos los departamentos
sql> select deptno,job,sum(sal) from emp group by rollup(deptno,job);
DEPTNO JOB SUM(SAL)
---------- --------- ----------
10 CLERK 1300
10 MANAGER 2450
10 PRESIDENT 5000
10 8750
20 CLERK 1900
20 ANALYST 6000
20 MANAGER 2975
20 10875
30 CLERK 950
30 MANAGER 2850
30 SALESMAN 5600
30 9400
29025

- CUBE: muestra el total de salarios por departamento y puesto, que incluya el


total por departamento, el total por puesto y total general
sql> select deptno,job,sum(sal) from emp group by cube(dept,job) order by
grouping_id(deptno,job);
DEPTNO JOB SUM(SAL)
---------- --------- ----------
10 CLERK 1300
10 MANAGER 2450
10 PRESIDENT 5000
20 CLERK 1900
30 CLERK 950
30 SALESMAN 5600
30 MANAGER 2850
20 MANAGER 2975
20 ANALYST 6000
10 8750
20 10875
30 9400
CLERK 4150
ANALYST 6000
MANAGER 8275
PRESIDENT 5000
SALESMAN 5600
29025

Q268.- que afirmaci�n describe de la mejor manera la funci�n GROUPING


C. usada para identificar valores NULL de una expresi�n ROLLUP o CUBE
Explicaci�n: permite distinguir filas superagregadas de filas normales. Interpreta
un NULL devuelto por una func de superagreg (ROLLUP, CUBE) y establece un valor
en vez de NULL.
sql> SELECT
DECODE(GROUPING(department_name), 1, 'All Departments',
department_name) AS department,
DECODE(GROUPING(job_id), 1, 'All Jobs', job_id) AS job,
COUNT(*) "Total Empl",
AVG(salary) * 12 "Average Sal"
FROM employees e, departments d
WHERE d.department_id = e.department_id
GROUP BY ROLLUP (department_name, job_id)
ORDER BY department, job, "Total Empl", "Average Sal";
DEPARTMENT JOB Total Empl Average Sal
------------------------------ ---------- ---------- -----------
Accounting AC_ACCOUNT 1 99600
...
Accounting All Jobs 2 121800
Administration AD_ASST 1 52800
Administration All Jobs 1 52800
All Departments All Jobs 106 77479.2453
...

Q281.- afirmaci�n correcta sobre ROLLUP:


C. muestra subtotales de nivel m�s alto moviendo de derecha a izquierda la
lista de columnas agrupadas especificadas por GROUP BY

Q.289.- dos afirmaciones correctas sobre la siguiente consulta:


sql> select e.department_id, e.job_id, d.location, sum(e.salary) total,
grouping(e.department_id) GRP_DEPT, grouping(e.job_id) GRP_JOB,
grouping(d.location_id)GRP_LOC
from employees e join departments d on e.department_id=d.department_id
group by rollup(e.department_id,e.job_id,d.location_id)
B. El valor 1 en GRP_JOB y GRP_LOC significan que las columnas JOB_ID y
LOCATION_ID no se tienen en cuenta para generar el subtotal.
D. El valor 0 en GRP_JOB y GRP_LOC significan que las columnas JOB_ID y
LOCATION_ID SI se tienen en cuenta para generar el subtotal.

Pruebas esquema HR.-


--select department_id, job_id, sum(salary) from hr.employees group by
department_id, job_id order by department_id, job_id;
--select department_id, job_id, sum(salary) from hr.employees group by grouping
sets ((department_id), (job_id)) order by department_id, job_id;
--select department_id, job_id, sum(salary) from hr.employees group by rollup
(department_id,job_id) order by department_id, job_id;
--select department_id, job_id, sum(salary) from hr.employees group by cube
(department_id, job_id) order by grouping_id (department_id, job_id);

3.2.7 Funciones anidadas


Las funciones pueden ser anidadas de tal forma que la salida de una puede ser la
entrada de otra.
Se evaluan de dentro hacia afuera y de izquierda a derecha.
Si hay anidaci�n de func.gr debe existir GROUP BY.
Tipos de anidaci�n:
- Se pueden anidar funciones single-row con funciones de grupo: -- select deptno,
greatest(count (distinct job)) from emp group by deptno;
- Se pueden anidar funciones de grupo con funciones de grupo: -- select
max(count(distinct job_id) from employees group by deparment_id;
Las anidaciones de grupo solo pueden ser de un nivel:
sql> select min(max(job_id))) from employees group by deparment_id
NO sql> select sum(min(max(job_id))) from employees group by department_id:
-> ORA-00935: group function is nested too deeply
- No puede haber anidamientos en el HAVING
sql> select max(avg(tgc2)) from tg group by tgc1 having max(avg(tgc2)) > 1;
-- ORA-00935: funci�n de grupo con demasiados niveles de anidamiento
- No se pueden ubicar funciones anidadas de grupos ni en el GROUP BY ni en el
WHERE.

CUESTIONES T3.-
---------------
01Dok.- Afirmaci�n correcta seg�n las siguientes consultas:
sql> select max(long), max(lat) from state;
sql> select max(long), max(lat) from state group by state_id;
D. La setencia 1 muestra dos columnas y la 2 dos valores por cada estado.

02Aok.- Extraer informaci�n siguiente:


- campos gross, net y earned del segundo trimestre de 1999
- campos gross, net y earned de ventas en los estados IL, CA y TX
sql> select state_code, sum(all gross), sum(net), sum(earned) from sales
where trunc(sales_date,'Q')
between to_date(...) and to_date(...) and state_cd IN ('IL','CA','TX')
A. La sentencia cumple los tres requisitos.

03AerrC.- linea de error:


1 select department_id, sum(salary)
2 from employees
3 where deparment_id <> 40
4 order by deparmente_id;
A. 1 -> si aparecen m�s de una columna en el SELECT debe existir GROUP BY

04Aok.- encontrar la media de salario de los empleados por cada departamento.


Existen nulos y no queremos que se incluyan en el c�lculo.
A. select department_id, avg(salary) from emp group by department_id;

05Derr.- Afirmaci�n correcta revisando las siguientes consultas:


sql> SELECT department_id, COUNT(*) FROM employees HAVING COUNT(*) > 10 GROUP
BY department_id;
sql> select department_id, count(*) from employees where count(*)...
B. La sentencia 1 se ejecuta, la 2 falla
NO D. ambas fallan

06Dok.- Elegir la opci�n correcta sobre la siguiente consulta:


sql> select max(count(*)) from employees group by job_id, department_id;
D. Muestra el numero mayor de trabajos junto al departamento.
NO. Las col del GROUP BY deben aparecer en el SELECT.

07Aok.- Elegir sentencia con resultado correcto:


A. OK. se puede usar distinta func.grupo en SELECT y HAVING
sql> select department_id, sum(salary) from employees where
department_id <> 50 group by department_id having count(*) > 30;
NO B. err por uso de alias en HAVING
NO C. err por uso de func.grupo en el WHERE por alias
NO D. err por uso de func.grupo en el WHERE

08Dok.- Elegir la opc correcta seg�n la siguiente consulta:


sql> select count(distinct substr(first_name,1,1)) from employees;
D. Se ejecuta sin problema

09Eok.- Tabla sales_orders; col order_no number. Determinar el n�m de orders de la


tabla.
E. Todas Es igual especificar ALL/DISTINCT/NVL ya que el campo al ser PK es
�nico y no puede ser NULL

10Dok.- Ver el salario m�s alto por departamento.


D. select department_id, max(salary) from employees group by department_id;

11Bok.- Afirmaci�n correcta en relaci�n a las siguientes consultas:


sql> select count(distinct mgr), max(distinc salary) from emp;
sql> select count(all mgr), max(all salary) from emp;
B. Se pueden retornar diferentes n�meros en la columna 1 pero siempre
retornar� el mismo en la col 2.

12ABerrABD.- Que clausulas en el SELECT puede usar funciones-single-row anidadas


con func.gr?
A. SELECT
B. ORDER BY
NO D. GROUP BY
NO C. WHERE

13AerrB.- Considerando las dos cons siguientes elige las opciones correctas:
sql> select substr(first_name, 1,1) fn, sum(salary) from employees group by
first_name;
sql> select substr(first_name, 1,1) fn, sum(salary) from employees group by
substr(first_name,1,1);
B. 1 y 2 producen distinto resultado
NO A. 1 y 2 producen el mismo resultado

14Dok.- que diferencias hay entre los resultados de las siguientes consultas:
sql> select count(*), sum(salary) from emp;
sql> select count(salary), sum(salary) from emp;
D. la consulta 2 puede mostrar un valor menor de COUNT que la consulta 1

15Aok.- porque la siguiente SELECT falla:


sql> select colorname Colour, max(cost) from itemdetail where
upper(colorname) like '%WHITE%'
group by colour having count(*) > 20;
A. Una clausula GROUP BY no puede contener un alias.
16Aok.- que retorna la siguiente consulta:
sql> select max(prod_pack_size) from products where min(pro_weight) = 5;
A. Se produce una excepci�n: no puede haber func.gr en WHERE

17Bok.- porque la siguiente select genera una excepci�n:


sql> select dept_no, avg(distinct salary), count(job) job_count from emp
where mgr like 'J%' or abs(salary) > 10 having count(job) > 5 order by
2 desc;
B. no hay clausula GROUP BY

18CerrD.- que clausula producir� un error:


sql> select department_id, avg(salary) avg_sal from emp group by
department_id having trunc(deparment_id) > 50;
D. No se retorna error: si no se usa una func.gr en el HAVING la columna debe
ser usada en el SELECT
NO C. HAVING, porque la funci�n AVG usada en el SELECT no es usada en el
HAVING

19Cok.- Elige las afirmaciones correctas:


C. HAVING es opcional cuando se usa GROUP BY
NO. A. una func.gr puede ser usada solo si GROUP BY est� presente
NO. B. func.gr con no agredadas pueden aparecer en el SELECT cuando tambi�n
est�n GROUP BY y HAVING
NO. D. HAVING y GROUP BY son excluyentes: o se usa una u otra

20Cok.- elegir la mejor opci�n en relaci�n a estas dos afirmaciones:


1. HAVING deber�a aparecer siempre despu�s el GROUP BY
2. GROUP BY deber�a aparecer siempre despu�s del WHERE
C. 1 false, 2 verdadera

<TAB>------------
CAPITULO 4.- USING JOINS AND SUBQUERYS
------------

1.- Writing Multiple-Table Queries


------------

1.1.- Inner Joins


- Retorna solo las filas que cumplen la condici�n. Operador (=); union de igualdad;
equality join -> equijoin
- Tipo de join que combina filas de dos tablas que tienen valores equivalentes para
las columnas especificadas:
-- Simple INNER JOINS:
SQL> select a.t1c1, b.t2c1 from t1 a, t2 b where a.t1c1=b.t2c1;
SQL> SELECT locations.location_id, city, department_name FROM locations,
departments WHERE locations.locations_id=departments.location_id;
-- Complejas INNER JOINS: se establecen varias condiciones: ... WHERE ... AND
...;
- Uso de alias de tablas: ayudan a entender una consulta
SQL> SELECT l.location_id, city, department_name FROM locations l, departments d
WHERE l.location_id = d.location_id AND country_id != 'US';
-- Nombre tabla, alias y esquema: usar o esquema o alias o nombre tabla en el
FROM y en el WHERE; no se pueden mezclar esquema y alias y nom.tab.
- Uso de sintaxis ANSI:
-- NATURAL JOIN: la uni�n se basa en todas las columnas que tienen el mismo
nombre en ambas tablas. No poner en colum SELECT nom.tab ni alias.
SQL> SELECT location_id, city, department_name FROM locations NATURAL JOIN
departments; -> columna com�n LOCATION_ID
SQL> SELECT region_id, region_name, country_id, location_id FROM regions
NATURAL JOIN countries NATURAL JOIN locations; -> JOIN de 3 tablas.
SQL> SELECT regions.region_id, region_name, countries.country_id,
country_name, location_id, city
FROM regions, countries, locations WHERE regions.region_id =
countries_id AND countries.country_id = locations.country_id;
-- JOIN ... USING(id_colum): permite especificar las columnas equijoin.
SQL> SELECT location_id, city, department_name FROM locations JOIN
departments USING (location_id);
SQL> SELECT region_name, country_name, city FROM regions JOIN countries
USING (region_id) JOIN locations USING (country_id);
-> REGIONS se une con COUNTRIES usando REGION_ID, y el resultado
es unido con LOCATIONS usando la columna COUNTRY_ID;
RECUERDA !!! no uso alias o nom.tab para calificar columnas con NATURAL
JOIN o JOIN USING.
-- JOIN...ON: no hay nombres de columna iguales entre las tablas o se quiere
especificar condiciones de union arbitrarias.
- Se puede usar alias o nom.tab. Si hay nombres de colum iguales en
distintas tablas las columnas deben ser calificadas.
SQL> SELECT region_name, country_name, city FROM regions r
JOIN countries c ON r.region_id = c.region_id
JOIN locations l ON c.country_id = l.country_id WHERE
c.country_id = 'US';
-- Multitable Joins: union de m�s de dos tablas. Se forman de izquierda a
derecha.
La primera condici�n de uni�n puede referenciar columnas solo de la
primera y segunda tabla, la segunda condici�n de uni�n puede referenciar
columnas de la primera, segunda y tercera tabla y as� sucesivamente.
SQL> SELECT first_name, department_name, city FROM employees e
JOIN departments d ON (e.department_id = d.department_id)
JOIN locations l ON (d.location_id = l.location_id);

1.2.- Cartesian Joins


Los datos son seleccionados de dos o m�s tablas sin relaci�n espec�fica en el
WHERE. Si no hay WHERE el resultado es t1.ncol X t2.ncol.
Se une cada fila de la tabla primera con cada fila de la tabla segunda. Si la
primera tabla tiene 3 filas y la segunda 4 el resultado es 12.
SQL> SELECT region_name, country_name FROM regions, countries WHERE
countries.country_id LIKE 'I%';
SQL> SELECT region_name, country_name FROM countries CROSS JOIN regions WHERE
countries.country_id LIKE 'I%';

1.4.- Outer Joins - Uniones Exteriores


-Permiten ver los datos de una tabla aunque en alg�n momento no exista
correspondencia de filas en la union con otra tabla.
-Permiten ver resultados basados en una condici�n de igualdad y tambi�n filas sin
correspondencia de la primera tabla FROM: simbolo (+) en WHERE otra tabla.
-El orden de las tablas en el FROM determina LEFT o RIGHT OUTER JOIN; si adem�s
necesitas todas filas de la tabla pondremos (+) en la otra.
--SQL> SELECT c.country_name, l.city FROM countries c, locations l WHERE
c.country_id = l.country_id (+); -> Muestra todos los c.country_name.
-No se pueden combinar WHERE / IN con OR con tabla (+) pero s� AND.
--SQL> SELECT c.country_name, l.city FROM countries c, locations l WHERE
c.country_id = l.country_id(+) OR l.city(+) LIKE 'B%'; -> ERROR
--SQL> SELECT c.country_name, l.city FROM countries c, locations l WHERE
c.country_id = l.country_id(+)
AND c.country_name IN ('India','Israel'); -> CORRECTO
- ANSI: no se puede usar operador OUTER JOIN (+)
-- Left Outer Joins:
SQL> SELECT c.country_name, l.city FROM countries c LEFT OUTER JOIN
locations l ON c.country_id = l.country_id; OUTER es opcional
SQL> SELECT country_name, city FROM countries LEFT JOIN locations USING
(country_id);
SQL> SELECT country_name, city FROM countries NATURAL LEFT JOIN locations;
(si solo hay una columna com�n en ambas tablas).
SQL> SELECT c.country_name, l.city FROM countries c, locations l WHERE
l.country_id(+) = c.country_id; Sint�xis original ORACLE.
-- Right Outer Joins:
SQL> ... RIGHT JOIN ...
-- Full Outer Joins;
- Permite ver todas las filas con correspondencia entre ambas tablas,
todas las que no tiene correspond. de T1 y tambi�n de T2.
SQL> select e.employee_id, e.last_name, d.department_id, d.department_name
from departments d FULL JOIN employees e ON e.department_id =
d.department_id; -> ANSI
- Con ORACLE n�; solo usando UNION: ... WHERE e.department_id (+) =
d.department_id UNION ... WHERE e.department_id = d.department_id (+);
SQL> ... WHERE e.department_id (+) = d.department_id (+); ERROR!!! ORA-
01468: a predicate may reference only one outer-joined table

- Other Multiple-Table Queries


-- Self Joins: union de una tabla consigo misma. El nombre de la tabla
aparece dos veces en el FROM con diferentes alias.
SQL> select e.last_name Employee, m.last_name Manager from employees e,
employees m where m.employee_id=e.manager_id; -> ORACLE
SQL> select E.LAST_NAME EMPLOYEE, m.last_name MANAGER from employees e
JOIN employees m ON m.EMPLOYEE_ID = e.MANAGER_ID
WHERE e.last_name like 'R%'; -> ANSI (CUIDADO !!! en el ON poner
primero M.EMPLOYEE_ID)
-- Noneequality Joins: relaciona dos tablas con nonequality join.
SQL> select last_name, salary, grade from employees, grades where
last_name like 'R%'
and salary >= low_salary and salary <= NVL(high_salary, salary);

2.- Using set operators


------------
Permiten seleccionar datos de m�ltiples tablas. Combinan el resultado de dos
consultas en uno (consultas compuestas).
Si existen varios operadores se evaluan primero los par�ntesis y despu�s de
izquierda a derecha.
Los tipos de datos y numero de columnas deben coincidir en ambas consultas. Si los
tipos son diferentes ORCL intenta implicitamente una conversi�n.
Se puede usar ORDER BY con nombres de columnas, alias o con notaci�n posicional
(1,2) de la primera consulta ubicandose al final de las dos consultas.
SQL>
- The UNION Operator Retorna filas de cada consulta sin duplicar filas.
- The UNION ALL Operator: No ordena ni filtra el resultado; retorna todas las filas
de ambas consultas.
- The INTERSECT Operator: Retorna las filas comunes de ambas consultas.
- The MINUS Operator: Retorna las filas de la primera consulta que no est�n en la
segunda.

3.- Subqueries
------------
Consulta hija que arrojan un resultado dentro de una consulta padre. Si hay varias
se evalua primero la m�s interior.
Pueden usarse con todas las sentencias DML.
Si las columnas de las subcon tienen el mismo nombre que la cons.padre es buena
idea el uso de nombre o alias de tablas.
La subcon debe encerrarse entre par�ntesis y colocarse a la derecha del operador de
comparaci�n cuando se usa en el WHERE.

- Inline View: subconsultas en el FROM que permiten encontrar valores top y ORDER
BY. Pueden anidarse sin limite cuaquier numero de subconsultas.
Una subconsulta puede aparecer en el FROM; funciona como una vista por lo que se
denominan INLINE VIEW.
Se cierran entre par�ntesis y pueden tener alias. Pueden ser referenciadas
en la consulta padre en el SELECT.
-- SQL> SELECT first_name, salary, avg_salary
FROM employees,
(SELECT department_id, AVG(salary) avg_salary
FROM employees e2 GROUP BY department_id) dept
WHERE employees.department_id = dept.department_id
AND first_name like 'B%';
-- SQL> select first_name, salary, avg_salary from employees
NATURAL JOIN
(select department_id, AVG(salary) avg_salary from employees e2 group
by department_id) dept,
WHERE ...

- Tipos de subqueries:
-- Anidadas: en el WHERE (hasta 255 niveles)
-- Correlacionadas: por cada fila procesada de la tabla-padre por la consulta-
padre se evalua la subconsulta correl. una vez.
-- Escalar: retorna una sola fila y un solo valor de columna. Puede usarse
cualquier nombre de columna o expresi�n.

- Subconsultas una-fila (single-row): subcon. retorna una sola fila como resultado.
La subcon. normalmente usa operador (=)
SQL> select last_name, first_name, salary from employees where salary = (select
max(salary) from employees);
-- La cons.padre puede retornar mas de una fila, pero la subcon.hija solo
devuelve un resultado.
SQL> select last_name, salary from employees where department_id = (select
department_id from departments where department_name = 'Accounting');
-- Se pueden usar todos los operadores de comparaci�n (=,>,>=,<,<= or <>).
Si se usan dos subcon.hijas se ejecutan primero y el resultado es pasado a la
cons.padre.
SQL> select last_name, department_id from employees
where department_id < (select max(deparment_id) from deparments where
location_id =1500)
and hire_date >= (select min(hire_date) from employees where
department_id = 30);

- Subconsultas multiples-filas (Multiple-Row): la subcon.hija devuelve m�s de una


fila: oper IN(NOT), EXIST(NOT), (ANY-SOME-ALL[<>=])
SQL> select last_name, deparment_id, from employees where deparment_id IN
(select department_id from employees where first_name = 'John');
Muestra todos las personas que trabajan en los mismos departamentos que
aquellos que se llaman John.
SQL> select last_name, salary, department_id from employees
where salary >= ANY (select salary from employees where department_id =
110) AND department_id != 80;
-- Se puede usar DISTINCT en la subcon.hija con ANY or ALL para prevenir la
selecci�n de filas repetidas.

- Subquery Returns no Rows


Si no se retornan filas en la cons puede que las subcon.hija retornen alg�n NULL.
Hay que detectar que columna tiene nulos y establecer IS NOT NULL.
SQL> select first_name, salary from employees where
salary not in (select salary from employees where department_id = 30
and salary IS NOT NULL);

- Correlated subqueries: la subcon.hija referencia una columna de la tabla.padre de


la consulta.padre.
La subcon.hija es evaluada por cada fila procesada de la sentencia padre puede ser
select, update o delete.
Los nombres de columnas de la cons.padre pueden ser referenciados por la cons.hija
pero no a la inversa.
SQL> select department_id, last_name, salary from employees e1
where salary = (select max(salary) from employees e2 where e1.department_id
= e2.department_id) order by 1,2,3;
Muestra el empleado con mayor sueldo por cada departamento.
SQL> select first_name, department_id from employees e1
where EXIST (select 'x' from employees e2 where first_name = 'John' and
e1.department_id = e2.deparment_id);
En la consulta se listan los nombres de empleados que trabajan en el mismo
departamento que John.
En la subcon.hija se chequea la existencia de una fila basada en la
condici�n (coincidencia de departamento).
Los resultados de la subcon.hija con EXIST son ignorados, solo nos interesa
si hay o no hay (existen);
la select maneja un valor comod�n ('x') que es ignorado.
La subcon.correlacionadas hacen un proceso fila a fila de modo que la subconsulta
se ejecuta una vez por cada fila de la cons. principal; esto
es diferente de la ejecuci�n de una subcon.normal que se ejecuta primero.
SQL> select nombre, salario, cod_departamento from empleados emp where
salario >
(select avg(salario) from empleados where
cod_departamento=emp.cod_departamento)

- Scalar subqueries: retorna un valor en concreto de una fila. Se pueden usar en el


mismo lugar que un nombre de columna, expresi�n, funci�n o argumento.
Obtiene exactamente un valor de una columna de una fila. El valor de una expresi�n
en una subcon. escalar es el valor del elemento de la lista
seleccionado de la sub consulta. Si la subconsulta obtiene 0 filas el valor es
nulo, si obtiene m�s de una fila se muestra un error.
Se pueden usar con CASE, SELECT, ORDER BY, lado izquierdo SET y WHERE con UPDATE,
izquierda DELETE.
NO se pueden usar con GROUP BY, HAVING, START WITH, CONNECT BY, CREATE, PROFILE
NO -> Subcon. de multiples column para comparar dos o m�s column usando una
cl�usula WHERE con oper.logicos.
-- ... en expresi�n CASE:
SQL> select city, country_id,
(CASE WHEN country_id IN (select country_id from countries where
country_name = 'India') THEN 'Indian' ELSE 'Non-Indian' END) "INDIA?"
from locations city LIKE 'B%';
-- ... en el SELECT:
SQL> select last_name, department_id, (SELECT max(salary) from employees sq
where sq.deparment_id = e.department_id) HSAL from employees e;
Muestra el nombre y departamento de un empleao y el salario m�s alto de ese
departamento.
-- ... en el SELECT y en el WHERE: listar todos los departamentos y sus managers de
Estados Unidos y Canada.
SELECT d.department_name,
ll.city,
(SELECT e.first_name || ' ' || e.last_name
FROM employees e
WHERE d.manager_id = e.employee_id)
MANAGER
FROM departments d, locations ll
WHERE d.location_id = ll.location_id
AND d.manager_id IS NOT NULL
AND d.location_id IN
(SELECT l.location_id
FROM locations l
WHERE l.country_id IN
(SELECT c.country_id
FROM countries c
WHERE c.country_name IN
('United States of America', 'Canada')))
-- ... en el ORDER BY:
Consulta que ordena por nombre de pais sin que este aparezca en al cons.padre.
SQL> select country_id, city, state_province from locations l
ORDER BY (select country_name from countries c where l.country_id =
c.country_id);

- Multiple-Column Subqueries: subcon.hija que tiene m�s de una columna en su


SELECT. Usadas para comparar condiciones de colum o sentencia UPDATE.
SQL> select cty_name from city where (cnt_code, st_code) IN (select cnt_code,
st_code from state where st_name = 'TEXAS');

- Subqueries in Other DML Statements: permite sentencias DML (insert, update,


delete, merge).
SQL> update employees e1 set salary = (select max(salary) from employees e2
where e1.deparment_id = e2.department_id);
Aumenta al m�ximo el salario de todos los empleados en su correspondiente
departamento.
SQL> delete from employees e where salary < (select avg(salary) from employees
e2 where e2.deparment_id = e.department_id);
Borra todos los empleados que tienen un salario inferior al de la media de su
departamento.
SQL> insert into employee_archive select * from employees;
Inserta registros usando una subconsulta.
SQL> insert into departments (department_id, department_name) values ((select
max(department_id) + 10 from departments), 'EDP');
Inserta un nuevo departamento con ID+10 y nombre 'EDP'
- Se pueden usar subcon en lugar del nombre de la tabla:
SQL> delete from (select * from departments where department_id < 20) where
deparment_id = 10;
SQL> insert into (select department_id, deparment_name from departments where
department_id < 20 WITH CHECK OPTION) values (45, 'EDP');
No permite el insert por que WITH CHECK OPTION hace que se compruebe si se
cumple el where.

Examen Capitulo 4
-----------------
1Cok.- line error: si alias no nombres de tabla
2Aok.- todos los customer names y orders relacionados
3Bok.- la con. retorna NULL, NULL porque no tiene ninguna ORDER (se listan todos
los customer)
4Cok. ANSI join condition: ON
5ByDok.- NATURAL LEFT OUTER JOIN (sin alias) y LEFT OUTER JOIN ... ON
6ACok. A(OR)-C(IN) operators no permitidos en OUTER JOIN
7BCerrAD.- An ORDER BY clause can be used in the subquery appearing in the FROM
clause, but not in the WHERE clause.
- Aok. ORDER BY puede ser usado en el FROM subconsulta (... FROM ... JOIN (subcon
con ORDER BY) ON condici�n)
- Berr. ORDER BY no puede ser usado en el WHERE subconsulta equijoin (... FROM ...
WHERE colum = (subcon con ORDER BY)
- Cok. GROUP BY permitido en FROM...JOIN y WHERE(colums)IN subconsulta para
equijoin.
- Derr. si USING no calificar columnas en SELECT (no e.hire_date)
--07BD
/* A.
SELECT last_name, e.hire_date, department_id
FROM employees e
JOIN (SELECT max(hire_date) max_hire_date
FROM employees ORDER BY 1) me
ON (e.hire_date = me.max_hire_date)
--Las opciones A y B tienen una cl�usula ORDER BY en la subconsulta.
--Una cl�usula ORDER BY se puede utilizar en una subconsulta si aparece en la
cl�usula FROM, pero no en la cl�usula WHERE.
*/
/* B - ERROR
--...WHERE hire_date = (SELECT MAX (hire_date) max_hire_date FROM employees ORDER
BY 1)
-- *
--Error at line 1
--ORA-00923: palabra clave FROM no encontrada donde se esperaba
SELECT last_name e.hire_date, department_id
FROM employees e
WHERE hire_date = (SELECT MAX (hire_date) max_hire_date FROM employees ORDER BY
1);
--Las opciones A y B tienen una cl�usula ORDER BY en la subconsulta.
--Una cl�usula ORDER BY se puede utilizar en una subconsulta si aparece en la
cl�usula FROM, pero no en la cl�usula WHERE.
*/
/* C
SELECT last_name, e.hire_date, department_id
FROM employees e
WHERE (department_id, hire_date) IN
( SELECT department_id, MAX (hire_date) hire_date
FROM employees
GROUP BY department_id)
--Las opciones C y D utilizan la cl�usula GROUP BY en la subconsulta, y su uso est�
permitido en FROM, as� como las cl�usulas WHERE.
--Opci�n D dar� un error porque DEPARTMENT_ID en la cl�usula SELECT es ambiguo y
por lo tanto no necesita ser calificado como e.DEPARTMENT_ID.
*/
/* D - ORA-00918: columna definida de forma ambigua
SELECT last_name, e.hire_date, department_id FROM employees e JOIN
(SELECT department_id, max(hire_date) hire_date FROM employees GROUP BY
department_id) me
USING (hire_date)
--Las opciones C y D utilizan la cl�usula GROUP BY en la subconsult, y su uso est�
permitido en FROM, as� como las cl�usulas WHERE.
--Opci�n D dar� un error porque DEPARTMENT_ID en la cl�usula SELECT es ambiguo y
por lo tanto no necesita ser calificado como "e.hire_date".
--Otro problema con la opci�n D es que si usamos USING no puede ser calificado;
e.hire_date.
*/

8Bok. la consulta falla con un nombre de columna invalidos


--08B. Error porque se referencia la tabla (d.department_id) antes de ser invocada
/*SELECT e.last_name, d.department_name, j.job_title
FROM jobs j
INNER JOIN employees e ON (e.department_id = d.department_id)
JOIN departments d ON (j.job_id = e.job_id)*/

9Dok. 1 y 3 mismo resultado; 2 diferente


10AerrB.- retorna CNT_CODE por WHERE ST_CODE valor 'TN'
B. La consult fallar� y no retornar� ninguna fila.
Hay dos registros en la tabla STATE con ST_CODE con valor 'TN' por lo que si usamos
el operador = falla. Hay que usar IN.
11Aok.- TEXAS
-- 12DerrE.- no hay error. Se retorna el num de depart donde m�s empleados trabajan
y su n�mero. GROUP BY erroneo si WHERE, valido en subconBY
HAVING: permite seleccionar o rechazar un grupo de registros agrupados por GROUP
BY
SQL> select editorial, avg(precio) from libros group by editorial having
avg(precio) > 25;
13Aok.- subconsulta correlacionada; ... and city.cnt_cod = state.cnt_code);
14AerrC. INDIA (valor que devuelve la subquery !!!!!!) -> 91
15Dok.- no ORDER BY en subcons que devuelve una fila; no order by en subcon usada
en WHERE
16Cok. Se ejecuta sin errores; son validos los alias de la subq tanto en la SELECT
ppal como en el WHEREadre.
--17DerrC.- solo una columna es seleccionada en la subcon por lo que VALUES puede
tener solo un valor (CNT_CODE value 971)
-18EerrB. No puede haber dos ORDER BY, uno a cada lado de UNION ALL: solo se puede
poner al final

--19FerrB.- todas producen el mismo resultado. 1; subcon escalar - 2,3,4; vistas en


linea.
-- Consulta escalar
SELECT last_name, salary,
(SELECT (MAX(sq.salary) - e.salary)FROM employees sq WHERE sq.department_id =
e.department_id) DSAL
FROM employees e WHERE department_id = 20;
-- Consultas en linea
SELECT last_name, salary, msalary - salary dsal FROM employees e,
(SELECT department_id, MAX(salary) msalary FROM employees GROUP BY department_id)
sq
WHERE e.department_id = sq.department_id AND e.department_id = 20;
-
SELECT last_name, salary, msalary - salary dsal FROM employees e INNER JOIN
(SELECT department_id, MAX(salary) msalary FROM employees GROUP BY department_id)
sq
ON e.department_id = sq.department_id WHERE e.department_id = 20;
-
SELECT last_name, salary, msalary - salary dsal FROM employees INNER JOIN
(SELECT department_id, MAX(salary) msalary FROM employees GROUP BY department_id)
sq
USING (department_id) WHERE department_id = 20;

20D.- ...ORDER BY salary DESC

EJEMPLO SUBCON: Encontrar espacio ocupado y libre usando vistas del diccionario.
-----------------
Se debe tener permiso SELECT_CATALOG_ROLE: proporciona acceso a todas las vistas de
SYS.
Consultas a utilizar:
- DBA_TABLESPACES: muestra el nombre del tablespace, tipo, ...
- DBA_DATA_FILES: muestra los datafiles asociados a un TBS permanente o UNDO, y el
tama�o del datafile. La suma del tama�do de DTF dar� el tama�o del TBS.
- DBA_TEMP_FILES: muestra los fich temporales asociados con un TBS temporal y
tama�o.
- DBA_FREE_SPACE: muestra espacio libre de cada TBS.

-- Extraer el tama�o de un tablespace y el espacio libre --


select tablespace_name, Mbytes, MbytesFree
from
(
select tablespace_name, sum(bytes)/1024/1024 Mbytes from dba_data_files group by
tablespace_name
UNION ALL
select tablespace_name, sum(bytes)/1024/1024 Mbytes from dba_temp_files group by
tablespace_name
) totalspace
LEFT OUTER JOIN
(select tablespace_name, sum(bytes)/1024/1024 MbytesFree from dba_free_space group
by tablespace_name
)freespace
USING (tablespace_name)
ORDER BY 1

-- Extraer el tama�o de un tablespace y el espacio libre con UNION ALL --


SELECT tsname, SUM (Mbytes) Mbytes, SUM (MbytesFree) MbytesFree
FROM
(
SELECT tablespace_name tsname, SUM (bytes) / 1024 / 1024 Mbytes, 0 MbytesFree
FROM dba_data_files GROUP BY tablespace_name
UNION ALL
SELECT tablespace_name,SUM (bytes) / 1024 / 1024 Mbytes, 0 FROM dba_temp_files
GROUP BY tablespace_name
UNION ALL
SELECT tablespace_name,0, SUM (bytes) / 1024 / 1024 FROM dba_free_space GROUP BY
tablespace_name
)
group by tsname
order by 1;

<TAB>------------
CAPITULO 5.- Manipulaci�n de datos
------------

5.1 Usando sentencias DML


Sentencias DML soportadas por Oracle: insert, update, delete y merge

5.1.1 Insertando filas en una tabla


sql> insert into hr.t1 (t1c1, t1c2) values ('a','b'); -- permite a�adir solo
una fila
Si no se incluye lista de columnas Oracle incluye todas en el orden de
creaci�n de la tabla; el tipo del valor introducido debe coincidir con el de la
columna. Si no se especifican determinadas columnas hay que establecer NULL o
DEFAULT (NULL por defecto).
sql> insert into hr.t1 (t1c1, t1c2) values ('a',default);
Se entrecomillan los tipos char y date. Si el date no tiene el formato
default hay que usar to_date.
Con el entrecomillado se realiza una conversi�n implicita a char; es por esto
por lo que los number no se entrecomillan.
sql> insert into hr.t1 (t1c3) values (to_date('01/Ene/2016','dd/mon/yyyy'));

5.1.1.1 Insertando filas con una subconsulta


Hay que reemplazar values por la subconsulta (no se puede combinar VALUES y
subconsulta).
sql> insert into t2 (t2c1, t2c2) select t1c1, t1c2 from t1 where ...;

5.1.1.2 Insertando filas en multiples tablas


sql> insert [all | first] [when <condition> then into <insert_clause> ... ]
[else <insert_clause>
sql> insert all
when prod_cat='B' then
into book_sales(prod_id) values (product_id)
when prod_cat='V' then
into video_sales(prod_id) values (product_id)
select prod_cat, product_id from sales_detail;
Si usamos alias para el nombre de la tabla y a continuaci�n usamos dicho
alias o nombre de la tabla como prefijo de las columnas durante una inserci�n
provocaremos un error.

5.1.2 Actualizando filas en una tabla


sql> update t1 set t1c1=1, t1c2=2 where...

5.1.2.1 Actualizando filas usando una subconsulta


sql> update t1 set (job_id, price) = (select job_id, price from t2
where ...) where ...

5.1.3 Borrando filas en una tabla


sql> delete [from] t1 where t1c1 in ('a','b')
sql> delete t2 where rowid not in (select max(rowid) from t2 group by t2id);
sql> delete t2;

RESUMEN insert, update, delete


------------------------------
-- VALUES
insert into t1 (t1c1,t1c2,t1c3) values (1,'a',sysdate);
update t1 set t1c1='2' where t1c1=3;
delete t1 where t1c1=2;

-- SUBCONSULTA
insert into t1 (t1c1) select t1c1 from t2;
insert into t1 select * from t2;
update t1 set (t1c1,t1c2) = (select t1c1,t1c2 from t2);
delete t1 where rowid = (select max(rowid) from t1);

update employee e set salary = (select salary from salaries s where e.job_id =
s.job_id) where dept_id = 22;
update (select prod_id, cust_id, quantity_sold, time_id from sales) set
time_id='22-MAR-2007';

5.1.4 Truncate
Sentencia DDL por lo que su ejecuci�n conlleva COMMIT y no permite ROLLBACK.
Solo DML permite ROLLBACK.
Particularidades de TRUNCATE frente a DELETE:
- Es una sentencia DDL y produce COMMIT de los cambios realizados en la
sesi�n.
- Es mas rapido ya que no genera informaci�n UNDO.
- No se puede truncar una table padre si esta referenciada por una FK de una
tabla hija; hay que deshabilitarla primero.
- No se activa ning�n trigger al ejecutarse
- El espacio de almacenamiento de la tabla y sus indices son reseteados a su
tama�o inicial.
- Resetea la marca high-water de la tabla y de todos sus indices.
- No se puede conceder permiso de TRUNCATE a un usuario para truncar tablas
de otro usuario. Se requiere DROP ANY TABLE.

5.1.4 Union de filas (merge)


Permite insertar, actualizar o borrar filas basadas en una condici�n.
sql> merge into t1_v1 using t1_v1_subcon on join_condicion
when match then update set update_clausula [where_clausula]
[delete where_clausula]
when not matched then insert insert_columnas values
insert_columnas
sql> merge INTO t1 using t2 ON (t1.t1c1 = t2.t2c1)
WHEN MATCHED THEN UPDATE SET t1.t1total = t2.t2total, t1.t1mode =
'modificado'
DELETE WHERE t2.total = 0
WHEN NOT MATCHED THEN INSERT VALUES (t2.t2c1, t2.t2total);

5.2 Control de transacciones


Permite coordinar multiples accesos concurrentes al mismo dato. Las
transacciones representan un unidad at�mica de trabajo y proporcionan consistencia
en caso de fallo del proceso de usuario o de sistema.
Pueden incluir varias sentencias DML y terminan con COMMIT si se guarda la
transaccion o con ROLLBACK si se revierten los cambios.
Tambi�n terminan con la ejecuci�n de una sentencia DDL (se realiza COMMIT
autom�ticamente) y estan no pueden revertirse.
El control de transacciones permite (mediante la ejecuci�n de sentencias):
- Indicar el comienzo de una transacci�n eligiendo consistencia a nivel de
sentencia o a nivel de transacci�n.
- Configurar un savepoint para deshacer cambios hasta ese punto.
- Terminar la transaccion haciendo los cambios permanentes o deshaciendolos.
Fin de una transacci�n:
- Realizando COMMIT o ROLLBACK
- Con sentencia DDL (COMMIT implicito)
- Saliendo del SQL Plus (COMMIT implicito)
- Terminaci�n anormal de la sesi�n de SQL Plus (ROLLBACK implicito)
- Crash de la bbdd (ROLLBACK implicito)
NOTA: el fallo de una sentencia DML no tiene ROLLBACK implicito por lo que
los cambios anteriores al fallo se conservan.

https://docs.oracle.com/cd/B12037_01/appdev.101/a42525/ch07.htm
You end a transaction in one of the following ways:
- Code a COMMIT or ROLLBACK statement, with or without the RELEASE option. This
explicitly makes permanent or undoes changes to the database.
- Code a data definition statement (ALTER, CREATE, or GRANT, for example) that
issues an automatic commit before and after executing. This implicitly makes
permanent changes to the database.

5.2.1 Savepoints y rollbacks parciales


Permiten realizar undos parciales hasta el punto donde se cre� el savepoint:
ROLLBACK TO SAVEPOINT; realiza undos cronol�gicamente hacia el ultimo savepoint o
hacia el savepoint especificado.

Cuadro Control de Transacciones.-


> COMMIT - insert... - SAVEPOINT A1 - update... - SAVEPOINT A2 - insert... -
ROLLBACK TO SAVEPOINT A2 - ROLLBACK TO SAVEPOINT A1 - ROLLBACK

Ejemplo:
delete hr.cat;
insert into hr.cat values (1,'1');
commit;
select * from hr.cat; -- 1,1
update HR.CAT set id_cat=1, cat_cat='2' where id_cat=1;
savepoint A1;
select * from hr.cat; -- 1,2
update HR.CAT set id_cat=1, cat_cat='3' where id_cat=1;
select * from hr.cat; -- 1,3
rollback to savepoint A1;
select * from hr.cat; -- 1,2
rollback;
select * from hr.cat; -- 1,1

NOTA: si realizamos un COMMIT despu�s de un savepoint este se pierde.


rollback to savepoint A1 Error at line 17 ORA-01086: nunca se estableci� el
punto de grabaci�n 'A1'

5.2.2 Visibilidad de datos


En una transacci�n con operaci�n DML solo son visibles los cambios en la
sesi�n de la transacci�n.
Solo ser�n visibles por otros usuarios cuando se realice COMMIT o se ejecuta
una sentencia DDL.
Cuando se realiza una operaci�n DML las filas afectadas son bloqueadas por
Oracle permitiendo solo su consulta por otros usuarios.
Con COMMIT los datos se guardan en la bbdd de manera permanente quitando
todos los bloqueos a la filas afectadas y eliminando todos los savepoint.

5.2.2.1 Consistencia y transacci�n


Consistencia de datos: garantiza que los datos no cambian mientras se
completa una sentencia o transacci�n.
Oracle usa consistencia a nivel de sentencia; no usa consistencia a
nivel de transacci�n porque una transacci�n puede llevar la ejecuci�n de varias
sentencias.
Oracle implementa consistencia usando System Change Numbers (SCN). Son
una llave interna de bd orientada en el tiempo. Solo pueden incrementarse y
representan un punto en el tiempo. Si lanzamos una sentencia Oracle le asigna el
actual SCN. Si queremos hacer ROLLBACK comparar� ese SCN que tendr� un valor m�s
alto con los SCN de los bloques de datos de los segmentos de rollback para
encontrar la versi�n mas antiguo de los mismos.

5.2.2.2 Mecanismo de bloqueos


Los bloqueos previenen de la destrucci�n interactiva de datos entre
transacciones concurrentes.
Son manejadas automaticamente por Oracle cuando se ejecutan sentencias
DML.
Hay dos tipos:
- Implicitos: los manejados por Oracle autom�ticamente cuando se
realizan operaciones DML. No se dan nunca con sentencias SELECT.
- Explicitos: realizados por los usuarios con el manejo de determinadas
setencias como LOCK TABLE o SELEC FOR UPDATE.
-- SELECT FOR UPDATE: bloquea filas impidiendo cambios. Sintaxis
identica que SELECT + FOR UPDATE.
Estos bloqueos no terminan hasta la realizaci�n de
COMMIT/ROLLBACK aunque no se modifiquen datos.
-- LOCK TABLE: permite el bloqueo total de una tabla. SQL> lock
table t1 in exclusive mode;

A table lock can be held in any of the following modes:

A row share lock (RS), also called a subshare table lock (SS), indicates that
the transaction holding the lock on the table has locked rows in the table and
intends to update them. An SS lock is the least restrictive mode of table lock,
offering the highest degree of concurrency for a table.

A row exclusive lock (RX), also called a subexclusive table lock (SX),
indicates that the transaction holding the lock has updated table rows or issued
SELECT ... FOR UPDATE. An SX lock allows other transactions to query, insert,
update, delete, or lock rows concurrently in the same table. Therefore, SX locks
allow multiple transactions to obtain simultaneous SX and SS locks for the same
table.

A share table lock (S) held by one transaction allows other transactions to
query the table (without using SELECT ... FOR UPDATE) but allows updates only if a
single transaction holds the share table lock. Multiple transactions may hold a
share table lock concurrently, so holding this lock is not sufficient to ensure
that a transaction can modify the table.

A share row exclusive table lock (SRX), also called a share-subexclusive table
lock (SSX), is more restrictive than a share table lock. Only one transaction at a
time can acquire an SSX lock on a given table. An SSX lock held by a transaction
allows other transactions to query the table (except for SELECT ... FOR UPDATE) but
not to update the table.

An exclusive table lock (X) is the most restrictive mode of table lock,
allowing the transaction that holds the lock exclusive write access to the table.
Only one transaction can obtain an X lock for a table.

CUESTIONES.-
------------

01AerrD.- A�adir filas de T1 a T2 de ventas anteriores al a�o actual.


D. insert into t1 select * from t2 where ...
Si se usa subcon no se usa VALUES
NO A. insert into t1 values (select * from t2 where t1c1 <
trunc(sysdate,'YY'));
02DerrE.- Que sentencia no implica el comienzo de una transaccion:
E. Todas implican el comienzo de una transacci�n sino se ha iniciado
ya.
nO D. Select for update
03ACerrBC.- updates correctos
B. update accounts set last_updated = (select sysdate from dual), update_user
= (select user from dual);
C. update accounts set (last_updated, update_user) = (select sysdate, user
from dual);
NO A. update accounts set (last_updated, update_user) = (sysdate,user)
04ADok.- sentencias que no terminan una transaccion
A. select
D. update
05Aok.- actualizar columna salario en OLD_EMPLOYEES con el salario de EMPLOYEES
para los empleados del dpto 90
A. update old_employees a set salary = (select salary from employees b where
a.employe_id = b.employee_id) where dpto=90;

06Bok.- linea error en update


B. linea 2 (no puede ir where antes que set)
07AerrD.- delete t1c1, t1c3 from employees where...
D. Se produce un error; correcto DELETE T1 (sin campos)
NO A. Los valores de los campos t1c1 y t1c2 son borrados (cambiados a NULL)
donde se cumple el where
08AerrC.- 1. delete from city where...
2. delete city where...
3. delete (select * from city where...
Elegir la opci�n correcta:
C. 1, 2 y 3 producen el mismo resultado.
NO A. 1 y 2 producen el mismo resultado: 3 error
09Bok. se generan dos savepoints con el mismo nombre: que resultado dar� count(*)
al final
B.29 (vuelve al ultimo savepoint cuando los dos savepoint tienen el mismo
nombre)
10Cok. update que trunca la fecha de dos campos
C. update employees set hire_date=trunc(hire_date),
start_date=trunc(start_date);
Nota: no se usa AND para separar el nombre de las columnas
11Dok. update salary de EMPLOYEES usando SALARIES usando JOB_ID y department 22.
D. update employee e set salary = (select salary from salaries s where
e.job_id = s.job_id) where dept_id = 22;
12BerrD. rollback to A - savepoint A
D. 107
13CerrB. insert que da error
B. error porque no hay suficientes valores de columnas para la lista de
columnas implicitas (todas)
NO C. insert into departments values(280,'abc',266,1700);
14Bok. inserts
B. insert 1 y 2 insertan diferentes valores al menos en una columna de la
tabla
15AerrB. INSERT FIRST: que count sale de new_chanel_sales
B. 12,000
NO A. 0 ; se cumple antes otro insert
Con FIRST solo se evalua el primer WHEN verdadero
16BerrC. savepoint - truncate - insert - rollback
C. 124
NO B. 0 - despues de truncate hay commit implicito, luego un insert y luego
un rollback.
17Dok. update: si no hay clausula SET
D. si no viene palabra SET la sentencia falla
18D. update
D. la sentencia bloquea todas las filas hasta que la transacci�n termina
19B. error insert
B. insert first when... then insert into
20D. salary del empleado Arsinoe despues de la siguiente query
D. 1500 - savepoint D - rollback to D - commit

<TAB>------------
CAPITULO 6.- CREANDO TABLAS Y CONSTRAINTS
------------
1.- Schema Objects
------------
- Esquema: colecci�n de objetos relacionados y agrupados en una misma base de
datos.
Un esquema es propiedad de un usuario de base de datos y coinciden en el nombre. Si
un usuario no es propietario de ning�n objeto no existe entonces esquema asociado
con �l. Un usuario de db puede tener un solo esquema.
- Otros objetos:
-- Vistas materializadas: son vistas que recopilan y almacenan los datos
recopilados ocupando espacio de almacenamiento.
-- Dimension: estructura logica definida en el diccionario de datos que
relacionan columnas de tablas sin ocupar espacio de almacenamiento.
-- Cluster: es un m�todo de almacenamiento de datos de tablas relacionadas en una
localizaci�n f�sica com�n. Por ej, un cluster puede ser creado sobre las tablas
pedidos y proveedores sobre las filas asociadas pedido-proveedor utilizando el
mismo bloque de almacenamiento.
-- Triggers: procedimiento almacenado PL/SQL que se ejecuta cuando una condici�n
espec�fica ocurre; cuando se realiza un insert, update, o delete, cuando se inicia
una bbdd, o cuando ocurren errores.
-- Java Objects: java classess, java sources y java resources.
-- PL/SQL programs: procedimientos (programas), funciones (devuelven valor) y
package (grupo de objetos PL/SQL)

2.- Built-in Datatypes


------------
Un tipo de dato es una propiedad de cada columna.
-- Tipos caracter: almacenan datos alfanumericos de dos posibles maneras (modo
juego caracteres bd o juego caracteres unicode)
-- CHAR: - tama�o fijo especificado entre par�ntesis que puede ser en BYTE
(por defecto) o en CHAR (indiferente para unicode sp bytes)
- si el string almacenado es m�s corto que el tama�o del tipo se
a�aden espacios en blanco.
- Por defecto 1 byte y max 2000 bytes
- SQL> employee_name CHAR (100 CHAR)
-- NCHAR: - usado para char UNICODE tama�o fijo especificado entre par�ntesis
en CHAR (por defecto)
- Por defecto 1 CHAR y max 1000 CHAR (1 char = 2 bytes)
- si el string almacenado es m�s corto que el tama�o del tipo se
a�aden espacios en blanco.
- func. representar NCHAR data: ... where emp_name = N'John Smith';
- SQL> ... emp_name NCHAR(100)
-- VARCHAR2: - Sin�nimo de VARCHAR (ORCL recomienda VARCHAR2)
- Rango de 1 a 4000 bytes; no asume valor por defecto.
- tama�o variable de datos tipo caracter que tiene que ser
definido
- Si se introducen menos caracteres que su longitud no se a�aden
espacios en blanco
- SQL> ... VARCHAR2 (<size> [BYTE/CHAR]): por defecto BYTE.
-- NVARCHAR2: - tama�o variable de datos tipo caracter UNICODE que tiene que
ser definido
- Rango de 1 a 2000 CHAR; no asume valor por defecto.
- SQL> ... NVARCHAR2 (<size>): solo CHAR
-- CLOB: tipo de Objeto Largo que almacena datos de longitud varible.
- Almacena (4GB-1)*(database block size); no se define el tama�o.
- NO ORDER BY
-- NCLOB: igual que CLOB pero para Unicode.
- NO ORDER BY
-- LONG: (sustituido por CLOB) Puede almacenar 2Gb de datos caracter. No
puede aparecer en WHERE, GROUP BY, or ORDER BY, ni DISTINC,
subcon(insert,UNION,INTERSECT,MINUS)

/* EJEMPLO TIPOS CARACTER


drop table t_caracter;
create table t_caracter
(cchar char(2000), cchar2 char(2000 CHAR), cnchar nchar(1000), cvarchar2
varchar2(4000), cnvarchar2 nvarchar2(2000), cclob clob, cnclob nclob, clong long);
insert into t_caracter values('a',N'b',N'c','d',N'e','f',N'g','h');
desc hr.t_caracter;
select * from t_caracter; */

-- Tipos num�ricos:
-- NUMBER: NUMBER [ precisi�n / escala ]
- Representaci�n tipos float, integer, decimal, double; negativo o
positivo.
- Precisi�n: total numeros; escala (parte decimal) Ej; (5,2) ->
999,999 = 100
- Precision (rango 1,38) ; Escala (rango -84,127)
- Si no se incluye decimal solo se puede introducir 5-2=3 numeros
(999)
- Si se supera la parte decimal se redondea (4,2) -> 12,125 = 12,13
- No se puede exceder la precisi�n: (4,2) -> 123,1 ERROR; 12,31 OK
- Escala > Precisi�n: (3,5) 0,00999
- Escala negativa: 1234567 (5,-2) 12345600: redondeo
- Escala negativa: representaci�n de s+p (5,-2) 5+2=7 12345678 ERROR
fuera de rango
-- BINARY_FLOAT: - Representa numero 32-bit punto flotante.
- Binary precisi�n; 5 bytes almacenamiento.
-- BINARY_DOUBLE: - Representa numero 64-bit punto flotante.
- Binary precisi�n; 9 bytes almacenamiento.
-- FLOAT: FLOAT [precision binary] subtipo de NUMBER.
- User BINARY_DOUBLE o BINARY_FLOAT

/* EJEMPLO TIPOS NUMERICOS


drop table t_number;
create table t_number (num number(5,3), num2 number(5,2), num3 number(2,3), num4
number(4,-1), num5 float(4));
-- precion,escala ; redondeo ; decimal 0.0... ; puesta a 0 valor ; float con
precision
insert into t_number values (99.999,888.999,0.099,1234,10.99);
desc hr.t_number;
select * from t_number; */

-- Tipos FECHA: DEFAULTS: SYSDATE, SYSTIMESTAMP


-- DATE: - default time 12:00 a.m.
- default date primer dia del mes actual
- almacena centuria,year,month,dia,hora,minuto y segundos
- Se puede representar en varios formatos:
- Parametro NLS_DATE_FORMAT
- Funci�n TO_CHAR con mascara de formato
-- TIMESTAMP: - TIMESTAMP [precision 0-9] default 6
- Almacena fecha y hora con fracciones de segundos.
-- TIMESTAMP WITH TIME ZONE: - TIMESTAMP [precision] WITH TIME ZONE
- Almacena el desplazamiento de zona horaria.
- 2008-10-24 13:09:14.-07:00
-- TIMESTAMP WITH LOCAL TIME ZONE: - TIMESTAMP [precision] WITH LOCAL TIME
ZONE
- almacena desplazamiento zona horaria pero muestra la zona horaria
local
- c_ts_wltz TIMESTAMP (9) WITH LOCAL TIME ZONE DEFAULT SYSTIMESTAMP
- 2008-10-24 13:09:14.000001000
-- Parametro de formato:
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF';
ALTER SESSION SET NLS_TIMESTAMP_TZ_FORMAT = 'YYYY-MM-DD
HH24:MI:SS.FFTZH:TZM';

/* EJEMPLO TIPOS FECHAS


drop table t_date;
create table t_date (r_no NUMBER(2), d_date date default sysdate, d_date2 date
default '01/01/2015', --
d_timezonedef timestamp default '27/01/2016', -- no se porqu� pero
redondea a 27/01/2020 16:00:00,000000
d_timezone timestamp(2) default systimestamp, -- muestra 27/01/2016
13:07:52,14
d_timezonewtz timestamp(0) WITH TIME ZONE default systimestamp,--
muestra 27/01/2016 13:07:52, +01:00
d_timezonewtzl timestamp (2) WITH LOCAL TIME ZONE default systimestamp
); -- 27/01/2016 13:07:52,14
desc hr.t_date;
INSERT INTO t_date (r_no) VALUES (1);
select * from t_date;
show parameter NLS_DATE_FORMAT; --nls_date_format string
DD/MM/RR
show parameter NLS_TIMESTAMP_FORMAT; --nls_timestamp_format
string DD/MM/RR HH24:MI:SSXFF */

-- Tipos INTERVALO
-- A�O-MES: INTERVAL YEAR [precision] TO MONTH
- Representa un periodo de tiempo como a�os y meses
- Precision a�o 0-9, default 2
- iy2m INTERVAL YEAR (3) TO MONTH; TO_YMINTERVAL('3-7'); +003-07
-- DIA-SEGUNDO: INTERVAL DAY [precision] TO SECOND
- Representa un periodo de tiempo como dias, horas, minutos y segundos.
- Precision dia 0-9, default 6. Ej. precision 2 permite valores de 0 a 99.
- id2s INTERVAL DAY (4) TO SECOND; TO_DSINTERVAL('4 02:20:30.30'); +0004
02:20:30.300000

/* EJEMPLO INTERVALOS
drop table t_intervalo;
create table t_intervalo (iym1 interval year(3) to month, ids1 interval day(3)
second(3));;
desc hr.t_intervalo;
insert into t_intervalo values ('123-7','123 02:20:30'); -- +123-07 +123
02:20:30.001000
select * from t_intervalo;*/

-- Aritmetica sobre tipos de tiempo:


- Se pueden usar operadores: +, -, *, /
- No DATE+DATE ni TS*5 (no se puede sum ni multip DT,TZ pero si restar para
encontrar la dif en dias)
- Se pueden sumar intervalos pero solo del mismo tipo. Multiplicaci�n y
divisi�n solo entre intervalos y del mismo tipo.
- A�adir 2 dias y 12 horas: SELECT TO_DATE('2008-10-24 13:09:14)+ 2.5 EXAMP
from dual;
- Restar 6 horas: SELECT TO_TIMESTAMP('2008-10-24 13:09:14.05) - 0.25 EXAMP
from dual;
- A�adir 1 a�o y 3 meses con TRUNCATE: SELECT TRUNC(SYSDATE),TRUNC(SYSDATE)
+TO_YMINTERVAL('1-3') from dual;
2008-10-24 -> 2009-01-24 00:00:00
- Multiplicar por 2 intervalo DS: SELECT TO_DSINTERVAL('1 03:30:00.0) * 2
FROM DUAL; +000000002 07:00:00.000001000
- Restar dos intervalos DS: SELECT TO_DSINTERVAL('1 03:30:00.0') -
TO_DSINTERVAL('0 03:30:00.0') FROM DUAL.
000000001 00:00:00.00000000O
- SELECT MAX(AVG(SYSDATE - DATE '01-01-15')) FROM dual; -> ERROR!!! ORA-
00978: funci�n de grupo anidada sin GROUP BY
- SELECT MAX(date '01-01-17' - SYSDATE) FROM dual; -> OK

/* ARITMETICA CON TIPOS DE TIEMPO


ALTER SESSION SET NLS_DATE_FORMAT = 'dd-mm-yyyy hh24:mi:ss';
select to_date('01-01-2015 00:00:00') + 1.5 from dual; -- a�adir 1 dia y 12 horas:
02-01-2015 12:00:00
select to_date('01-01-2015 00:00:00') + 0.25 from dual; -- a�adir 6 horas; 01-01-
2015 06:00:00
SELECT TRUNC(SYSDATE), TRUNC(SYSDATE) + TO_YMINTERVAL('1-3') from dual; -- a�adir 1
a�o y 3 meses
select trunc(sysdate) + to_dsinterval('1 01:00:00') from dual; -- trunca la hora de
la fecha actual y le a�ade un intervalo de 1 dia y una hora */

-- Tipos binarios: no almacena datos caracter sino binarios de archivos imagenes,


ejecutables, audio, video...
-- RAW [size]: almacena 2000 bytes. Longitud variable.
-- LONG RAW: no se especifica tama�o. Almacena 2G. Solo puede haber una
columna en la tabla de este tipo. Sustituido por BLOB.
-- BLOB: no se especibica tama�o. Almacena 4G.
-- BFILE: almacena informaci�n en ficheros externos, solo se almacena un
puntero en la BD. Almacena 4G.

-- Tipos ROW ID:


-- ROWID: cada tabla tiene una pseudocolumna llamada ROWID. Es la forma mas
rapida de acceso a una fila.
- Almacena la direccion fisica de una fila de tablas, cluster, particiones
y subparticiones, indices y particiones y sub. de estos.
- Almacena la direcci�n logica de tablas organizadas por �ndices.
-- UROWID:
- Almacena ROWIDs logicos de tablas organizadas por indices de BD no
ORACLE.

3.- Creating Tables


------------
- SQL> CREATE TABLE USER.T1 (t1c1 number(6,2), t1c2 varchar2(5));
- Con CREATE TABLE se puede especificar: valor DEFAULT, CONSTRAINTS, tipo
(relacional, temporal, externa, de objetos, organizadas por index),
tablespace de almacenamiento datos/indices, informaci�n de particionamiento y
subparticionamiento.
- El nombre es el identificador con una longitud max de 30 caracteres (= columnas).
Debe comenzar con un caracter, puede tener numeros y
solo puede tener $,_,#. Es casesensitive; ORCL pone todo en MAY salvo que se
entrecomille "MyTable".

3.1.- Tabla temporal


- SQL> CREATE GLOBAL TEMPORARY TABLE mytable (...) ON COMMIT PRESERVE ROWS;
- Tabla que estar� disponible para todas las sesiones de la BD pero solo la
sesi�n que la cre� puede insertar datos.
- Los datos insertados solo son visibles durante la sesi�n que los cre�.
- Los datos se eliminan:
- ON COMMIT PRESERVE ROWS: con el fin de la sesi�n.
- ON COMMIT DELETE ROWS: (default) con COMMIT o ROLLBACK.

3.2.- DEFAULT columnas


- Cuando no se especifica valor en un insert, si no se especifica se
introduce NULL salvo que haya un DEFAULT
- SQL> create table t1 (t1c1 number, t1c2 number default 10);
- SQL> insert into t1 (t1c1) values(1);
- No pueden referirse a otra columna, ni LEVEL, PRIOR, ROWID, NEXTVAL,
CURRVAL.
- Pueden ser SYSDATE, SYSTIMESTAMP, USER, USERENV, UID.
- SQL> ... status VARCHAR2(10) DEFAULT 'PENDING');
- Si se inserta un NULL en un campo con DEFAULT prevalece NULL.
- En el insert se puede referenciar DEFAULT.

3.3.- Comentarios tabla/columna


- SQL> COMMENT ON TABLE MYTABLE IS 'Comentario tabla';
- SQL> COMMENT ON COLUMN MYTABLE.T1C1 IS 'Comentario columna';

3.4.- Informaci�n de tablas y columnas en el diccionario:


- USER_TABLES, ALL_TABLES, USER_TAB_COLUMNS, ALL_TAB_COLUMNS

3.5.- Crear una tabla de otra tabla (CTAS)


- SQL> CREATE TABLE TABLA2 AS SELECT * FROM TABLA1;
- Se puede crear vacia: SQL> ... FROM 1=2;
- Se pueden cambiar los nombres de las columnas: SQL> ... SELECT T1C1 COL1,
T1C2 COL2 FROM T1;
- No permite columnas LONG, pero si CLOB.
- La tabla generada solo recoge la CONSTRAINTS de NOT NULL.

4.- Modifyng Tables


------------

4.1.- A�adir columnas


- SQL> ALTER TABLE U1.T1 ADD (T1C3 NUMBER (8,2), T1C4 VARCHAR2(8) DEFAULT
'NEW');
- Siempre se a�ade al final, las filas existentes tomar�n el valor de NULL
salvo que se configure un DEFAULT incluyendo un NOT NULL si se quiere:
- SQL> ALTER TABLE T1 ADD (T1C5 VARCHAR2(6) DEFAULT 'VALOR' NOT NULL); -->
no se puede poner NOT NULL sino se pone el DEFAULT !!!!
- Si se pone DEFAULT se rellenan todas las filas existentes anteriores con
el valor DEFAULT tanto si lleva NOT NULL como si no.

4.2.- Modificar columnas


- SQL> ALTER TABLE U1.T1 MODIFY (T1C1 NUMBER (8,2) NOT NULL, T1C2
VARCHAR2(8));
- Si se omite alguna propiedad de la columna esta propiedad no ser�
cambiada.
- Si se incluye un DEFAULT afecta solo a las nuevas inserciones. Para quitar
DEFAULT hay que a�adirle NULL.
- Caracteristicas:
- Se puede aumentar longitud de colum caracter pero si son CHAR requerir�
muchos recursos (rellena con ceros).
- Se pued decrecer longitud de VARCHAR2 si todos los datos no superan
la nueva longitud.
- Se puede decrecer longitud de no vacios CHAR si el parametro
BLANK_TRIMMING es TRUE.
- Para cambiar el tipo de columna los valores deben ser NULL. En caso
de cambio de CHAR a VARCHAR2 o viceversa si no hay cambio
de longitud no es necesario que la columna est� entera a NULL.

4.3.- Renombrar columnas


- SQL> ALTER TABLE T1 RENAME COLUMN U1.T1 TO U1.TABLA1

4.4.- Borrado columnas


- SQL> ALTER TABLE U1.T1 DROP (C1, C2) CASCADE CONSTRAINTS
- Los indices y constraints tambi�n son borrados. Con CASC CONST se borran
tambien los valores de las columnas que son parte de una CONST multicol.
- SQL> ALTER TABLE U1.T1 SET UNUSED COLUMN (C1, C2) CASCADE CONSTRAINTS
- Se puede marcar una colum como UNUSED; no se podr� ver como parte de la
definici�n de la tabla.
- SQL> ALTER TABLE U1.T1 DROP UNUSED COLUMNS | COLUMNS CONTINUE ; borra todas
las columnas marcadas como UNUSED.
- Diccionario datos UNUSED: ALL_UNUSED_COL_TABS, DBA_UNUSED_COL_TABS,
USER_UNUSED_COL_TABS.

5.- Droping Tables


-----------
- SQL> DROP TABLE U1.T1 CASCADE CONSTRAINTS
- Se borran los datos y definici�n de la tabla.
- Se borran los indices, constraints, triggers y permisos.
- Las vistas, vistas materializadas y programas almacenados se vuelven
inv�lidos.
- Se debe especificar CASCADE CONSTRAINT si hay integridad referencial.
- TRUNCATE: vacia los datos de una tabla, sin invalidar ni borrar obj
relacionados con la tabla. El espacio ocupado se libera.

6.- Renaming Tables


------------
- SQL> RENAME T1 TO TABLA1; (solo puede el propietario)
- RENAME sirve para otros objetos (vistas, sequences...)
- Conserva constraints, indexes y grants.
- Invalida vistas, synonimos, procedimientos almacenados y funciones.
- Tambien: SQL> ALTER TABLE U1.T1 RENAME TO U1.TABLA1 ( no se tiene que ser
propietario pero debe tener privil. ALTER ANY TABLE)

7.- Making Tables Read-Only


------------
- SQL> ALTER TABLE U1.T1 READ ONLY;
- No permite: insert, update, delete, merge, truncate, cambios sobre
columnas, flashing back table, select for update
- Permite: select, crea index, alter CONSTRAINT, cambio almacenamiento,
rename y drop tabla.
- SQL> ALTER TABLE U1.T1 READ WRITE;

8.- Managing Constraints


------------
- Establecen reglas de negocio: tambi�n lo hacen triggers y aplicaciones.
- Tipos:
-- NOT NULL: siempre se ha de guardar un valor <> de nulo
-- CHECK: establece una condici�n que ha de cumplirse
-- UNIQUE: se asegura que no existen valores duplicados en la columna.
-- PRIMARY KEY: identifica de manera �nica cada fila de una tabla y no
permite NULLs. Solo puede haber una por tabla.
-- FOREIGN KEY: establece relaciones de tablas padre-hija usando colum en
comun. La FK (t.hija) referencia PK o UN (t.padre)

9.- Creating Constraints


------------
- CREATE TABLE o ALTER TABLE
- Definici�n a nivel columna (una) o nivel tabla (varias)
- Nombres automaticos por ORCL (SYS_) o asignados por el usuario.

10.- Not null constraint


------------
-- NOT NULL: solo a nivel de columna
- SQL> CREATE TABLE ... CONSTRAINT NAME [NOT] NULL
- SQL> ALTER TABLE T1 MODIFY T1C1 [NOT] NULL; configura NULLs

11.- Check constraints


------------
-- CHECK CONSTRAINTS: a nivel columna o tabla.
- SQL> ALTER TABLE T1 ADD CONSTRAINT CK_T1C1 CHECK (T1C1 > T1C2)
- Condici�n booleana que puede referir valores de otra columna en la misma
fila; no se pueden usar querys.
- No pueden ser usadas funciones de entorno (SYSDATE, USER, USERENV, UID)
ni pseudocolumnas (ROWNUM, CURRVAL, NEXTVAL, LEVEL)
- Pueden establecerse varias por columna.
- No se puede usar ALTER TABLE MODIFY para CHECK (solo para NOT NULL); se
debe usar CREATE TABLE o ALTER TABLE ... ADD
- Se puede realizar CHECK con NOT NULL o NULL: SQL> ALTER TABLE T1 ADD
CONSTRAINT CK2_T1C1 CHECK (T1C1 IS NOT NULL AND T1C2 IS NOT NULL)

12.- Unique constraints


------------
- Protege una o mas columnas de una tabla asegurando que no hay dos filas con
datos identicos.
- SQL> CONSTRAINT UN_T1C1 UNIQUE; nivel columna
- SQL> CONSTRAINT UN_T1 UNIQUE (T1C1, T1C2, T1C3...): nivel tabla
- SQL> ALTER TABLE T1 ADD CONSTRAINT UN_T1 UNIQUE (T1C1, T1C2)
- Se permiten nulos

13.- Primary Key constraints


------------
- Solo puede haber una columna PK y no puede ser NULLS
- SQL> ... CONSTRAINT PK_T1C1 PRIMARY KEY: nivel columna
- SQL> ... CONSTRAINT PK_T1 PRIMARY KEY (T1C1, T1C2): nivel tabla
- Con cada PK se crea automaticamente un indice unico NOT NULL.
- SQL> ALTER TABLE T1 ADD CONSTRAINT PK_TI PRIMARY KEY (T1C1, T1C2);
- Los indices de PK no pueden ser borrados explicitamente.

14.- Foreing Key constraints


------------
- Columna o columnas unicas de una tabla hija referenciadas con una PK o UN de una
tabla padre.
- Las colum hija-padre deben ser del mismo tipo.
- SQL> CONSTRAINT FK_T1C3 REFERENCES U1.T2 (T2C3) ON DELETE CASCADE | SET NULL:
nivel columna
- SQL> CONSTRAINT FK_T1C3 FOREING KEY (T1C3,T1C4) REFERENCES U1.T2 (T2C3,T2C4) ON
DELETE CASCADE | SET NULL
- SQL> ALTER TABLE T1 ADD CONSTRAINT FK_T1C3 FOREING KEY (T1C3,T1C4) REFERENCES T2
(T2C3,T2C4)
- Se permite que la FK referencie key de la misma tabla (self referential integrity
constraint)
- Se permiten NULL.
- Se puede omitir el listado de columnas de la tabla referenciada si es PK.
- ON DELETE CASCADE: si se borra el contenido de la fila de la tabla padre se borra
la FK.
- ON DELETE SET NULL: si se borra el contenido de la fila de la tabla padre el
campo FK se vuelve NULL.
- ON DELETE: si no se establece no se podr� borrar la fila de la tabla padre
referenciada por FK sin borrar antes esta FK

-- Diccionario constraints: USER_CONSTRAINTS, ALL_CONSTRAINTS, USER_CONS_COLUMNS,


ALL_CONS_COLUMNS

15.- Disable constraints


------------
- SQL> ALTER TABLE U1.T1 ADD CONSTRAINT CK_T1 CHECK (T1C1 > 0) DISABLE;
- SQL> ALTER TABLE HR.TA1 MODIFY CONSTRAINT UN_TA1 DISABLE;

16.- Dropping constraints


------------
- SQL> ALTER TABLE T1 DROP CONSTRAINT CK_T1C1;
- SQL> ALTER TABLE T1 MODIFY T1C1 NULL;
- SQL> ALTER TABLE T1 DROP UNIQUE (T1C1) CASCADE; elimina constraint unique key
referenciadas por FK y la constraint de estas
- SQL> ALTER TABLE T1 DROP PRIMARY KEY (T1C1) CASCADE; elimina constraint PK
referenciada por constraint FK y las constraint de estas.

17.- Enabling and Disabling Constraints


------------
- SQL> ALTER TABLE T1 ENABLE PRIMARY KEY USING INDEX TABLESPACE USER_INDEX STORAGE
(INITIAL 2M NEXT 2M)
Permite habilitar PK especificando el lugar de almacenamiento.

18.- Validated Constraints


------------
- Enable/Disable afecta solo a los futuros datos que se a�adir�n o modificar�n en
la tabla.
- Validate/Novalidate afecta a los datos existentes.
- Existen cuatro posibles estados de una constraint:
-- ENABLE VALIDATE: los datos existentes en la tabla son validados para
verificar que son conformes a la constraint.
-- ENABLE NOVALIDATE: no valida datos existentes pero chequea datos futuros
en relaci�n a las constraint.
-- DISABLE VALIDATE: no valida datos futuros y no se permiten oper DML porque
los cambios futuros no pueden ser verificados.
-- DISABLE NOVALIDATE: no se tienen en cuenta las constraint y no se
controlan los datos existentes ni futuros.
- SQL> ALTER TABLE TDW1 MODIFY CONSTRAINT PK_DW1 DISABLE NOVALIDATE;
- SQL> ALTER TABLE TDW1 MODIFY CONSTRAINT PK_DW1 ENABLE NOVALIDATE;

19.- Deferring Constraints Checks


------------
- Por defecto ORCL chequea datos con las constraints cuando una sentencia SQL es
ejecutada: (constraint NOT DEFERRABLE)
- No se puede cambiar de NOT DEFERRABLE a DEFERRABLE con ALTER TABLE; se debe
borrar y recrear la constraint.
- Se puede cambiar el chequeo si creamos la constraint con DEFERRABLE (NOT
DEFERRABLE es por defecto); podemos chequear la constraint
en el momento de fin de la transacci�n (commit):
-- INITIALLY IMMEDIATE: la const se chequea por cada SQL (por defecto)
SQL> ALTER TABLE T1 MODIFY CONSTRAINT PK_T1 INITIALLY IMMEDIATE
-- INITIALLY DEFERRED: la const se chequea por cada transacci�n.
SQL> ALTER TABLE T1 MODIFY CONSTRAINT PK_T1 INITIALLY DEFERRED
--ORA-02091: transacci�n con rollback ORA-02291: restricci�n de
integridad (HR.FK_IDDEP) violada - clave principal no encontrada
- Si la const es DEFERRED: SQL> SET CONSTRAINTS ALL DEFERRED: chequea constraint
por transacci�n.

20.- Creating tables and constraints for an application


------------

/* Formatted on 02/12/2015 20:34:37 (QP5 v5.227.12220.39754) */


CREATE TABLE COUNTRY
(
CODE NUMBER (4),
NAME VARCHAR2 (40),
CONSTRAINT PK_COUNTRY PRIMARY KEY (CODE)
);

ALTER TABLE COUNTRY RENAME COLUMN CODE TO COUNTRY_CODE;


ALTER TABLE COUNTRY RENAME COLUMN NAME TO COUNTRY_NAME;
--SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE FROM USER_CONSTRAINTS WHERE
TABLE_NAME='COUNTRY';
--ALTER TABLE COUNTRY RENAME CONSTRAINT SYS_0000000 TO PK_COUNTRY;
ALTER TABLE COUNTRY MODIFY COUNTRY_NAME NOT NULL ADD CREATED DATE DEFAULT SYSDATE;

CREATE TABLE STATE


(
STATE_CODE VARCHAR2 (3),
STATE_NAME VARCHAR2 (40) NOT NULL,
COUNTRY_CODE NUMBER (4) REFERENCES COUNTRY,
CAPITAL_CITY VARCHAR2 (40),
CREATED DATE DEFAULT SYSDATE,
CONSTRAINT PK_STATE PRIMARY KEY (COUNTRY_CODE, STATE_CODE),
CONSTRAINT FK_STATE FOREIGN KEY (COUNTRY_CODE) REFERENCES COUNTRY
);

--SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE FROM USER CONSTRAINTS WHERE


TABLE_NAME='STATE';
--ALTER TABLE STATE DROP CONSTRAINT SYS_0000000;
--ALTER TABLE STATE ADD CONSTRAINT FK_STATE FOREIGN KEY (COUNTRY_CODE) REFERENCES
COUNTRY;

CREATE TABLE CYTI


(
CYTI_CODE VARCHAR2 (6),
CYTI_NAME VARCHAR2 (40) NOT NULL,
COUNTRY_CODE NUMBER (4) NOT NULL,
STATE_CODE VARCHAR2 (3) NOT NULL,
POPULATION NUMBER (15),
CREATED DATE DEFAULT SYSDATE,
CONSTRAINT PK_CYTI PRIMARY KEY (CYTI_CODE),
CONSTRAINT FK_CYGF FOREIGN KEY
(COUNTRY_CODE, STATE_CODE)
REFERENCES STATE ON DELETE CASCADE
);

--DESC COUNTRY;
INSERT INTO HR.COUNTRY VALUES (1000,'USA',default)
--desc state;
insert into STATE VALUES ('ALB','ALABAMA',1000,'MONTGOMERY',default);
--desc cyti
insert into HR.CYTI VALUES ('HUNT','HUNTSVILLE',1000,'ALB',100000,default);

Examen Capitulo 6
-----------------
01B. con CTAS solo se copian constr de NULL
02B. error si VARCHAR2 sin dimensi�n
03C. add new column ... T1 ADD ORDER_DATE DATE;
04BD. caract permitido nombres: # y $
05C. nombre invalidos porque comienzan por num y todos los identif (nombres) deben
comenzar con caracter alfanum y continuar con num o especial carac.
06Cok. lista tablas solo de usuario: C - USER_TABLES
07D. al a�adir una nueva colum con valor DEFAULT (SYSDATE) se rellena toda la
columna con dicho valor; se puede especificar NULL y NOT NULL
08B. si sumamos un 1 a una fecha implica 24 horas m�s, 0.5 12 horas, 0.25 6
horas...
09D. valor longitud por defecto de CHAR es 1
10A. borrar columna ALTER TABLE T1 DROP COLUMN COL1;
11CDE. con tabla read only se puede borrar constraint, indices y tabla
12CD. ... ADD CONSTRAINT PK_1 PRIMARY KEY () y ... ADD PRIMARY KEY () -> ambas cren
PK
ok: C y D - add/drop constraint siempre con ALTER TABLE
C. ALTER TABLE CITY ADD CONSTRAINT PK_CITY PRIMARY KEY (STATE_CD,
CITY_CD);
D. ALTER TABLE CITY ADD PRIMARY KEY (STATE_CD, CITY_CD);
13BC. en constraint CHECK no se pueden utilizar func (sysdate) ni subconsultas. Si
otras columnas y NULL, (si IN ('M','F'))
14ADG. AD: no DATE+DATE ni TS*5 (no se puede sum ni multip DT,TZ pero si restar
para encontrar la dif en dias);
G: se pueden sumar intervalos pero solo del mismo tipo. Multiplicaci�n y
divisi�n solo entre intervalos y del mismo tipo.
15okB. DEFERRABLE INITIALLY IMMEDIATE: chequeo de constraints con cada exec de
sentencia SQL pero se puede cambiar con SET CONSTRAINTS ALL DEFERRED
16okC. 6 default precision fraccion segundo TS. se puede cambiar de 0 a 9
17EerrC. solo TSZ muestran informaci�n formato largo time-zone; TSLZ lo ajusta pero
no lo muestra
18Cok. deshabilitar FK_ ; ... DISABLE CONSTRAINT FK_
Permite:
ALTER TABLE ORDERS DISABLE CONSTRAINT FK_ORDERS; -> deshabilita
ALTER TABLE ORDERS MODIFY CONSTRAINT FK_ORDERS ENABLE NOVALIDATE -> habilita
19C. para rename es valido: RENAME TABLE T1 TO T2 (solo cuando lo hace el
propietario) y ALTER TABLE T1 TO T2 (tablas de otro usu teniendo ALTER ANY TABLE)
20A. la tabla se crea correctamente: se permiten nombre col de un caracter, puede
convivir col LONG y LOB, los tipos se�alados no necesitan especificar tama�o.
No pueden haber 2 column tipo LONG / LONG RAW: ORA-01754: una tabla s�lo
puede contener una columna del tipo LONG

<TAB>------------
CAPITULO 7.- CREACION DE OTROS OBJETOS DE ESQUEMA
------------

1.- Creating Other Schema Objects


------------
2.- Create simple and complex views
------------

3.- Creating and Modifying Views


------------
Representaci�n de datos de una o m�s tablas/vistas. La estructura se almacena en el
diccionario pero no se almacenan datos.
SQL> CREATE VIEW admin_employees AS SELECT first_name || last_name NAME, email,
job_id POSITION FROM employees where department_id = 10;
GRANT; CREATE ANY VIEW
Si con la creaci�n de la vista se realizan operaciones num�ricas se asigna tipo
NUMBER sin precisi�n ni escala.

-- 3.1.- Using Defined Columns Names


-- SQL> CREATE VIEW emp_hire (employee_id, employee_name, department_name,
hire_date, commission_amt)
AS SELECT employee_id, first_name || ' ' || last_name, department_name,
TO_CHAR(hire_date,'DD-MM-YYYY'), salary * NVL(commission_pct, .5)
FROM employees JOIN departments USING (department_id) ORDER BY first_name ||
' ' || last_name;
-- SQL> create view vw_pais2 as SELECT c.country_name, r.region_name from countries
c JOIN regions r ON c.region_id=r.region_id;

-- 3.2.- Creating Views with Errors


-- SQL> CREATE FORCE VIEW test_view AS SELECT c1, c2 FROM test_table;
-- Forzar la creaci�n de una vista la genera INVALIDA. Se puede crear la tabla
despu�s y ORACLE recompila la vista cuando es accedida. No valido SEQ.

-- 3.4.- Creating Read-Only Views


-- SQL> CREATE VIEW all_locations AS SELECT country_id, country_name FROM locations
NATURAL JOIN contries WITH READ ONLY;

-- 3.5.- Creating Constraint on Views


-- Las constraints en vistas son declarativas. En su creaci�n se debe incluir
siempre DISABLE y NOVALIDATE.
-- SQL> alter view vemp2 add constraint un_01 unique (nnumber) disable novalidate;

-- 3.6.- Modifying View


-- Changing a View's Definition
OR REPLACE: la vista se recrea con la nueva definici�n manteniendose los
permisos.
-- Recompiling a View
ALTER VIEW: recompila la vista inv�lida por cambio de las tablas.
SQL> SELECT last_ddl_time, STATUS FROM user_objects WHERE
object_name='TEST_VIEW';
SQL> ALTER TABLE test_table MODIFY c2 VARCHAR2(8); � este cambio deja
invalida la vista.
SQL> ALTER VIEW test_view COMPILE; � compila la vista y la deja v�lida.
SQL> ALTER VIEW test_view DROP CONSTRAINT pk_test_view; � borra constrain
vista

-- 3.7.- Dropping a View


-- SQL> DROP VIEW test_view; � borra la vista del diccionario con permisos.
-- Los objetos que la refieran quedan inv�lidos. No rollback. No recycled bin.

-- 3.8.- Using Views


Todas las operaciones sobre una vista afectan a la tabla base.
Usos: a) Repre subconjunto datos
b) Repre superconjunto datos
c) Esconder JOINS complejas
d) Proporcionar nombre de columnas significativas
e) Minimizar cambios del origen de datos de una aplicaci�n

-- 3.8.1.- Using Views in Queries

-- 3.8.2.- Inserting, Updating, and Deleting Data through Views


-- No pueden tener
a) cl�usulas DISTINC, GROUP BY, START WITH, CONNECT BY, ROWNUM
b) Operadores UNION, UNION ALL, INTERSECT, MINUS
c) Subquery en la cl�usula SELECT
-- Pueden tener WHERE y permitir insert de campos constraint
SQL> CREATE OR REPLACE VIEW dept_adove_250 AS SELECT department_id
DID, department_name FROM departments where department_id > 250
WITH CHECK OPTION; (si no se pone CHECK OPTION las sentencias DML
sobre la vista obviar�n el WHERE)
SQL> SET NULL *
SQL> INSERT INTO DEPT_ABOVE_250 VALUES (199,'TEMPORARY DEPT'); ERROR
ORA-01402: view WITH CHECK OPTION where-clause violation
-- Vista para control de acceso
SQL> CREATE OR REPLACE VIEW employee_address AS
SELECT employee_id, first_name, last_name, middle_initial,
street, city, zip, home_phone, email
FROM employe_info WHERE login_id = USER WITH CHECK OPTION;
-- USER es una variable que almacena el usuario conectado.
-- Proporcionar al usuario permisos UPDATE sobre la vista, no sobre la
tabla.

-- 3.8.3.- Using Join Views


-- Vista con m�s de una tabla base. La vista preserva primary keys de las
tablas bases si esta es �nica en el resultado de la vista.
SQL> CREATE OR REPLACE VIEW country_region AS SELECT a.country_id,
a_country_name, a.region_id, b.region_name
FROM countries a, regions b WHERE a.region_id = b.region_id;
-- COUNTRIES es key-preserved (su primary key se mantiene �nica en la
vista) / REGIONS es not key-preserved (se duplica su ID)
-- UPDATE / INSERT: si sobre campos de las tablas de las vistas que
tienen key-preserved, pero solo en el caso de no CHECK OPTION.

-- 3.8.4.- Viewing Allowable DML Operations


-- USER_UPDATABLE_COLUMNS: vista con informaci�n de las columnas de vistas
que son propiedad de cada usuario.
-- ALL_UPDATABLE_COLUMNS: vista con informaci�n de las columnas de vistas que
los usuarios tienen acceso.
-- DBA_UPDATABLE_COLUMNS: informaci�n de todas las columnas de las vistas de
la BD.

-- 3.8.5.- Using Inline Views


-- Una subconsulta puede aparecer en el FROM; funciona como una vista por lo
que se denominan INLINE VIEW.
Se cierran entre par�ntesis y pueden tener alias. Pueden ser referenciadas
en la consulta padre en el SELECT.
-- SQL> SELECT first_name, salary, avg_salary
FROM employees,
(SELECT department_id, AVG(salary) avg_salary
FROM employees e2 GROUP BY department_id) dept
WHERE employees.department_id = dept.department_id
AND first_name like 'B%';
-- SQL> select first_name, salary, avg_salary from employees
NATURAL JOIN
(select department_id, AVG(salary) avg_salary from employees e2 group
by department_id) dept,
WHERE ...

-- 3.8.6.- SUBCONSULTAS (fuera de curso)


-- Simple: la SUBCONSULTA devuelve una sola fila
SQL> select first_name || ' ' || last_name as nombre, department_id from
employees where employee_id = (select employee_id from employees where
employee_id='100');
-- Multiples filas: la subconsulta devuelve multiples filas
SQL> select first_name || ' ' || last_name as nombre, department_id from
employees where department_id in (select department_id from departments where
department_id='100');
-- Vistas en linea: subconsulta en el FROM; coloca en el SELECT principal el
resultado de una columna (ej: media de salario)
SQL> select e.last_name, e.salary, media_sal from employees e, (select
department_id, AVG(salary) media_sal from employees e2 group by department_id) dept
where E.DEPARTMENT_ID=DEPT.DEPARTMENT_ID and e.last_name like ('Bi%');
-- Vistas correlacionadas: coincidencia del valor del WHERE principal con el
resultado de una subconsulta.
SQL> select first_name || ' ' || last_name as nombre, department_id from
employees e where '100' = (select department_id from departments d where
e.department_id=d.department_id);

-- 3.8.7.- Performing Top-n Analysis


-- Las vistas en linea permiten consultas con valores top-n con el uso de
ORDER BY y la variable ROWNUM. ROWNUM tiene el numero de fila asignado solo cuando
la query es invocada. La ejecuci�n de la subconsulta recoge todos los valores y
despu�s la consulta principal coge los 5 primeros y los ordena.
SQL> select * from (select last_name, salary from employees order by
salary desc) where rownum <=5;

4.- Create, maintain, and use sequences


------------

-- 4.1.- Secuencia: generador de numeros secuenciales que se incrementan con un


intervalo espec�fico.
No ocupan espacio de almacenamiento. Pueden incrementarse sin l�mite o realizar un
ciclo hasta un valor.
CREATE SEQUENCE MAMALC.IDGRUPO START WITH 43 MAXVALUE 9999999 MINVALUE 1 NOCYCLE
CACHE 20 NOORDER;
-- Ver todas las secuencias: SELECT sequence_name, cache_size, last_number
FROM user_sequences;
-- Actualizar columna con SEQ: UPDATE old_acme_employees SET emp_id =
emp_seq.nextval;
-- 4.2.- SQL> create sequence hr.employee_identity START WITH 2001;
-- START WITH; descending (MAXVALUE -1) ascending (MINVALUE 1)
SQL> create sequence sq_01 start with -1 maxvalue -1 increment by -1;
-- MINVALUE; num m�s bajo que generar� la secuencia.
-- MAXVALUE; num m�s alto que generar� la secuencia
-- CYCLE; alcanzado el valor l�mite se iniciar� la repetici�n de n�meros.
-- NOCLYCLE; no repite n�m alcanzado el valor l�mite (por defecto).
MAXVALUE+1 falla.
-- CACHE; datos en diccionario y memoria. Tama�o del bloque de los n�meros de
la secuencia mantenida en memoria (default 20)
-- NOCACHE; datos solo en diccionario. Fuerza la actualizaci�n del
diccionario de datos por cada numero de la secuencia generado: < rendimiento.
-- INCREMENT BY; para desincrementar poner valor negativo.
-- Con la creaci�n el START WITH debe ser igual o mayor que MINVALUE.
-- SHUTDOWN ABORT con secuencias cacheadas puede ocasionar p�rdida de n�meros de la
secuencia generandose huecos.
-- Valores perdidos: por ROLLBACK
-- SQL> DROP SEQUENCE sequence_name;

-- 4.3.- Uso secuencias


-- SQL> sequence_name.nextval; acceder al siguiente n�mero secuencia
-- SQL> sequence_name.currval: acceder al �ltimo numero de secuencia usado. Si tu
sesi�n no gener� nuevo num.seq CURRVAL es indefinido.
-- Inicializaci�n: La seq es inicializada en la sesi�n cuando se invoca NEXTVAL. Si
se invoca CURRVAL sin haber invocado NEXTVAL -> ERROR
SELECT emp_seq.currval FROM dual;
-- Valores max/min: ORA-08004: sequence EMP_SEQ.NEXTVAL exceeds MAXVALUE and cannot
be instantiated
-- Alteraci�n de seq: NO SE PUEDE modificar SEQ y establecer NEXTVAL: problema con
sincronizaci�n de KEYS (violaci�n primary-key con insert de keys q existen)
SOLUCION: 1.- Realizar alter SEQ cambiando INCREMENT BY a un valor mayor ->
ALTER SEQUENCE sale_seq INCREMENT BY 111555888;
2.- Hacer nextval para incrementar el valor del alter ->
SELECT sale_seq.nextval FROM dual; (NEXTVAL --- 111556309)
3.- Realizar alter SEQ cambiando INCREMENT BY por debajo
del valor m�s peque�o original -> ALTER SEQUENCE sale_seq INCREMENT BY 1;
SELECT sequence_name, cache_size, last_number FROM
user_sequences; (LAST_NUMBER --- 111556310)

6.- Create and Managing Indexes


------------
Obtienen espec�ficas filas de una tabla sin tener que realizar un escaneo de toda
la tabla. Las tablas y sus indices son independientes (se actualizan
autom�ticamente).
Tipos: simples o compuestos (varias columnas) - B-tree o Bitmap

-- 6.1.- How Indexes Work


Permiten un acceso rapido a las columnas del �ndice disminuyendo la I/O a disco que
supone leer la tabla completa.
Oracle recoge filas de una tabla solo de dos maneras: por ROWID o por full-scan de
la tabla.
ROWID: pseudocolumna que identifica de manera �nica una fila en una tabla. El
indice guarda un mapa de datos de columna por ROWID.
Las filas pueden ser recuperadas por ROWID.
Facilita SELECT, UPDATE y DELETE de una tabla si el �ndice tiene todas las columnas
referidas (utiliza el �ndice y no la tabla).

-- 6.2.- Using B-Tree Indexes


Indice por defecto. Formado por columnas tabla y columna ROWID (que identifica de
manera �nica cada fila en la tabla).
Mejor rendimiento con colum alta cardinalidad (muchos distintos valores: todo menos
colum ID). Eficiente si supone max 10% de scan-full tabla.
Tipos: - UNIQUE: Cada valor de cada columna es �nico; la combinaci�n de todos los
valores de columna es �nica. No incluye valores NULL.
- NOUNIQUE: por defecto
SQL> CREATE UNIQUE INDEX orders_ind4 ON oe.orders (customer_id, sales_rep_id);
-- 6.3.- Using Bitmap Indexes
Mejor rendimiento con sistemas de datos est�ticos; no soportan bloqueo a nivel de
fila.
Tipos: simples o concatenados (varias colum). Baja cardinalidad.
Cada valor llave tiene un bitmap que contiene TRUE, FALSE o NULL para cada fila de
la tabla.
Necesita menos espacio; se almacenan comprimidos. No pueden ser �nicos.
SQL> CREATE BITMAP INDEX orders_ind3 ON oe.orders (status);

-- 6.4.- Dropping Indexes


SQL> DROP INDEX oe.orders_ind3;
No se pueden borrar index para forzar unicidad o primary key de una tabla. Antes
deben deshabilitarse.

-- 6.5.- Indices y planes de ejecuci�n


-- SQL> SET AUTOTRACE ON � muestra resultado de query, plan de ejecuci�n y
estad�sticas asociadas.
-- SQL> SET AUTOTRACE TRACEONLY � solo plan de ejecuci�n.
-- SQL> SELECT index_name, uniqueness, index_type from dba_indexes where
table_owner = 'OE' and table_name = 'INVENTORIES';
-- SQL> select index_name, index_type, table_name from dba_indexes where owner =
'HR';
-- SQL> SELECT index_name, column_name, column_position FROM dba_ind_columns WHERE
table_name = 'INVENTORIES'
AND table_owner = 'OE' ORDER BY index_name, column_position;
-- SQL> SELECT constraint_name, index_name FROM dba_constraints WHERE table_name =
'INVENTORIES' AND owner = 'OE' AND constraint_type = 'P';
-- SQL> ALTER INDEX oe.inv_product_ix invisible � oculta el index

7.- Creating and Managing Synonyms


------------
Alias para un objeto de la bd. Publico/Privado. Puede apuntar a una tabla, vista,
secuencia, procedimiento, funci�n o paquete de una bd local o remota por dblink.
Devienen inv�lidos si los objetos referidos se borran. Se puede crear un SYN a un
objeto que no existe o sobre el que no se tienen permisos.

SQL> select OWNER,OBJECT_NAME,OBJECT_TYPE,STATUS from dba_objects where OWNER not


in ('SYS','SYSTEM') and status = 'INVALID'
order by OWNER,OBJECT_TYPE,OBJECT_NAME;

-- 7.1.- Creating and Dropping Synonyms


SQL> CREATE SYNONYM ... CREATE PUBLIC SYNONIM (estos �ltimos pertenecen al usuario
PUBLIC; estructura similar a un grupo al que pertenecen todos los usuarios)
SQL> CREATE SYNONYM [schema.]synonym_name for [schema.]object[@db_link];
SQL> CREATE SYNONYM PUBLIC SYNONYM synonym_name FOR [schema.]object[@db_link];
SQL> DROP <PUBLIC> SYNONYM objeto;

-- 7.2.- Public synonyms


Usados para identificar objetos como tablas, vistas, vistas materializadas,
secuencias, Java classes, prodecimientos, funciones y paquetes.
Las vistas de diccionario de datos son buenos ejemplos de sin�nimos p�blicos (se
crean cuando se ejecuta catalog.sql durante la creaci�n de la bbdd)
--> cuando hacemos referencia a la vista de diccionario ALL_TABLES realmente es un
sin�nimo de SYS.ALL_TABLES.
SQL> create public synonym nj_employees for hr.employees@new_jersey;
Cuando el objeto referenciado se borra, el sin�nimo permanece cambiando el status
de valido a inv�lido (STATUS en DBA_OBJECTS)
Si el sino es borrado los objetos que lo referencian pasan a invalidos.

-- 7.3.- Private synonyms


El uso de un sino privado no es restrictivo. Cualquier usuario con privilegios
concedidos puede usarlo.
SQL> create synonym emp_tbl for hr.employees;

-- 7.4.- Resolving Object References


Cuando se referencia un objeto Oracle mira en tres lugares en este orden:
1.- Es un objeto de usuario actual
2.- Un sin�nimo privado propiedad del usuario actual
3.- Un sin�nimo p�blico

-- 7.5.- Creating Database Links


Es un objeto que proporciona visibilidad a otro esquema de BBDD de otra instancia.
No puede usarse sobre si mismo.
SQL> CREATE [SHARED] [PUBLIC] DATABASE LINK link_name [CONNECT TO username
IDENTIFIED BY password] USING 'tns_name';
Con CONNECT TO se especifica el usuario y pass usado para conectar con la otra
bbdd.
El pass es almacenado en el diccionario de datos de forma encriptada y puede verse
en la vista USER_DB_LINKS o en SYS.LINK$.
SHARED: establece que todos los usuarios del public database link deben compartir
una sola conexi�n a la bd remota.
SQL> CREATE PUBLIC DATABASE LINK name_dblink USING 'tns'; Impide que todas las
conexiones sean con el mismo usuario y contrase�a.

Examen Capitulo 7
-----------------
01Bok. borrar vista: DROP VIEW USA_STATES;
02Aok. sobre cuantas tablas base de una vista unida pueden realizarse oper DML: UNA
03AerrD. vista creada sobre tabla sin primary key ni restricciones pero selec
subcon con DISTINCT; solo permite SELECT, no DML
04ABerrBE. modificar view definition: B-CREATE OR REPLACE VIEW E-CREATE OR
REPLACE VIEW FORCE
05Cok. si a�adimos nueva columna a una vista: hay que recompilar la vista usando
CREATE OR REPLACE View
06Bok. estado valido de constraint creada en vista: DISABLE NO VALIDATE
07Cok. si en vista dos campos number con distinta escala/precision se operan: el
campo resultante ser� de tipo Number
08Dok. subcon de vista no puede tener en el SELECT: FOR UPDATE OF; bloquea filas
por lo que no est� permitido
09Cok. TOP FIVE de salarios: select * from (...) where rownum <= 5;
10Dok. insert en vista con WHERE sin WITH CHECK OPTION: permite la insercci�n de
cualquier valor sin tener en cuenta el WHERE
11AFerrACEF. al modificar vista-join la definici�n no deber�a contener en el
top de la consulta:
A-DISTINC
C-aggregate function (SUM, AVG, COUNT)
E-GROUP BY
F-ROWNUM

12CerrA. crear seq empezando con 0 y obtener entero decrementado: create


sequence desc_seq start with 0 increment by -1 MAXVALUE 1;
Si no establecemos MAXVALUE se produce el siguiente error: ORA-
04008: START WITH no puede ser mayor que MAXVALUE

13Aok. que sucece con un sin�nimo cuando el obj referenciado es borrado: el estado
del sino cambia a INVALIDO
14BerrD. borrar sino public: drop public synonym plan_table
Si no ponemos PUBLIC en el DROP se produce el siguiente error:
ORA-00955: este nombre ya lo est� utilizando otro objeto existente

15Cok. si error sequence KEY_SEQ.CURRVAL in not yet defined: solucion con SELECT
KEY_SEQ.NEXTVAL FROM DUAL;
16Dok. los indices BITMAP son idoneos: para columnas de baja y media cardinalidad.
17ACerr. que clausulas de SELECT pueden ser usadas por un indice: A.SELECT C.FROM
Se pueden utilizar ambas si el indice contiene todas las columnas de la
tabla.
18Dok. crear secuencia que empiece con 1000 asegurandose que no se salta ning�n
valor
D. Opciones:
A. CREATE SEQUENCE PRODUCT_KEY2 START WITH 1000 1 NOCACHE;
B. CREATE SEQUENCE PRODUCT_KEY2 START WITH 1000 INCREMENT BY 1
NOCACHE;
19Bok. mostrar el siguiente numero generado por una secuencia: select
emp_seq.currval from dual;
20Aok. crear secuencia que rote a los 10 valores: create sequence seq_01 cycle
maxvalue 100;

Anda mungkin juga menyukai