Oracle Database Es.39
Oracle Database Es.39
#oracle
Tabla de contenido
Acerca de 1
Observaciones 2
Versiones 2
Examples 2
Hola Mundo 2
Insertar valores (puede omitir columnas de destino si proporciona valores para todas las c 3
Consulta SQL 3
Introducción 5
Examples 5
Observaciones 7
Examples 7
Introducción 8
Examples 8
Parámetros 12
Examples 12
Pista paralela 12
USE_NL 12
APÉNDATE A LA PISTA 13
USE_HASH 13
COMPLETO 13
Caché de resultados 14
Observaciones 16
Examples 16
Sintaxis 17
Parámetros 17
Observaciones 17
Examples 18
Crear un contexto 18
Examples 19
Observaciones 20
Examples 20
Información de privilegio 21
Versión de Oracle 21
Sintaxis 23
Examples 23
Examples 26
Examples 32
Observaciones 34
Examples 34
Examples 36
Extraiga los componentes del año, mes, día, hora, minuto o segundo de una fecha 41
Leap Seconds 42
Sintaxis 44
Examples 44
Ratio_To_Report 44
Examples 45
DIFERENCIA 45
STDDEV 45
Introducción 47
Examples 47
índice de árbol b 47
Capítulo 18: Limitar las filas devueltas por una consulta (Paginación) 49
Examples 49
Paginación en SQL 49
Observaciones 52
Examples 52
Examples 55
SUPERIOR 55
INITCAP 56
INFERIOR 56
Expresión regular 56
SUBSTR 57
LTRIM / RTRIM 57
Observaciones 58
Examples 58
Observaciones 59
Examples 59
Visión general 59
Crear cola 59
Examples 64
Para obtener valor de Binding 64
Introducción 65
Observaciones 65
Examples 65
Particionamiento hash 65
Partición de rango 65
Lista de particionamiento 66
Soltar partición 66
Partición dividida 67
Fusionar particiones 67
Introducción 69
Examples 69
Examples 70
Examples 71
Examples 72
Unirse a la cruz 72
UNIR INTERNAMENTE 73
ÚNICAMENTE EN EL EXTERIOR 77
Aniquilar 78
SEMIJOIN 80
UNIRSE 80
Unirse natural 80
Sintaxis 82
Parámetros 82
Examples 82
Introducción 84
Examples 84
Solicitud 84
Introducción 87
Observaciones 87
Examples 87
Examples 90
Fecha aritmética 90
Función Add_months 91
Observaciones 92
Examples 92
Creditos 94
Acerca de
You can share this PDF with anyone you feel could benefit from it, downloaded the latest version
from: oracle-database
It is an unofficial and free Oracle Database ebook created for educational purposes. All the
content is extracted from Stack Overflow Documentation, which is written by many hardworking
individuals at Stack Overflow. It is neither affiliated with Stack Overflow nor official Oracle
Database.
The content is released under Creative Commons BY-SA, and the list of contributors to each
chapter are provided in the credits section at the end of this book. Images may be copyright of
their respective owners unless otherwise specified. All trademarks and registered trademarks are
the property of their respective company owners.
Use the content presented in this book at your own risk; it is not guaranteed to be correct nor
accurate, please send your feedback and corrections to [email protected]
https://riptutorial.com/es/home 1
Capítulo 1: Comenzando con la base de
datos Oracle
Observaciones
Oracle es un sistema de gestión de bases de datos relacionales (RDBMS) originalmente
construido por Larry Ellison, Bob Miner y Ed Oates a finales de los 70. Fue pensado para ser
compatible con el Sistema R de IBM.
Versiones
Oracle V2 1979-01-01
Oracle7 1992-01-01
Oracle8 1997-07-01
Oracle8i 1999-02-01
Oracle9i 2001-06-01
Examples
Hola Mundo
https://riptutorial.com/es/home 2
En la versión de Oracle de SQL, "dual es solo una tabla de conveniencia" . Originalmente estaba
pensado para duplicar filas a través de UNIR, pero ahora contiene una fila con un valor DUMMY de
'X'.
insert into my_table (what, who, mark) values ('Hello', 'world', '!' );
insert into my_table values ('Bye bye', 'ponies', '?' );
insert into my_table (what) values('Hey');
commit;
Consulta SQL
Enumere los empleados que ganan más de $ 50000 nacidos en este siglo. Escriba su nombre,
fecha de nacimiento y salario, ordenados alfabéticamente por nombre.
Muestra el número de empleados en cada departamento con al menos 5 empleados. Lista de los
departamentos más grandes primero.
https://riptutorial.com/es/home 3
SELECT department_id, COUNT(*)
FROM employees
GROUP BY department_id
HAVING COUNT(*) >= 5
ORDER BY COUNT(*) DESC;
/* PL/SQL is a core Oracle Database technology, allowing you to build clean, secure,
optimized APIs to SQL and business logic. */
set serveroutput on
BEGIN
DBMS_OUTPUT.PUT_LINE ('Hello World!');
END;
https://riptutorial.com/es/home 4
Capítulo 2: Actualizar con uniones
Introducción
Contrariamente a los malentendidos generalizados (incluso en SO), Oracle permite
actualizaciones a través de uniones. Sin embargo, hay algunos requisitos (bastante lógicos).
Ilustramos lo que no funciona y lo que hace a través de un ejemplo simple. Otra forma de lograr lo
mismo es la declaración MERGE.
Examples
Ejemplos: lo que funciona y lo que no.
update
( select t.val as t_val, s.val as s_val
from tgt t inner join src s on t.id = s.id
)
set t_val = s_val
;
SQL Error: ORA-01779: cannot modify a column which maps to a non key-preserved table
01779. 00000 - "cannot modify a column which maps to a non key-preserved table"
*Cause: An attempt was made to insert or update columns of a join view which
map to a non-key-preserved table.
*Action: Modify the underlying base tables directly.
Imagine lo que sucedería si tuviéramos el valor 1 en la columna src.id más de una vez, con
valores diferentes para src.val . Obviamente, la actualización no tendría sentido (en CUALQUIER
base de datos, eso es un problema lógico). Ahora, sabemos que no hay duplicados en src.id ,
pero el motor de Oracle no sabe que - por lo que se queja. Quizás esta es la razón por la que
tantos profesionales creen que Oracle "no tiene ACTUALIZACIÓN con uniones".
Lo que Oracle espera es que src.id sea único y que, Oracle, lo sepa de antemano. ¡Fácilmente
arreglado! Tenga en cuenta que lo mismo funciona con claves compuestas (en más de una
columna), si la coincidencia para la actualización necesita usar más de una columna. En la
práctica, src.id puede ser PK y tgt.id puede ser FK apuntando a esta PK, pero eso no es
https://riptutorial.com/es/home 5
relevante para las actualizaciones con join; lo que es relevante es la restricción única.
update
( select t.val as t_val, s.val as s_val
from tgt t inner join src s on t.id = s.id
)
set t_val = s_val
;
2 rows updated.
ID VAL
-- ---
1 x
2 y
El mismo resultado se podría lograr con una declaración MERGE (que merece su propio artículo
de Documentación), y personalmente prefiero MERGE en estos casos, pero la razón no es que
"Oracle no hace actualizaciones con las combinaciones". Como muestra este ejemplo, Oracle
hace actualizaciones con uniones.
https://riptutorial.com/es/home 6
Capítulo 3: Bloque PL / SQL anónimo
Observaciones
Dado que no tienen nombre, los bloques anónimos no pueden ser referenciados por otras
unidades de programa.
Examples
Un ejemplo de un bloque anónimo.
DECLARE
-- declare a variable
message varchar2(20);
BEGIN
-- assign value to variable
message := 'HELLO WORLD';
https://riptutorial.com/es/home 7
Capítulo 4: Bomba de datos
Introducción
Los siguientes son los pasos para crear una importación / exportación de datos de la bomba:
Examples
Monitorear trabajos de Datapump
• Anote el nombre del trabajo del registro de importación / exportación o el nombre del
diccionario de datos y
• Ejecutar comando de adjuntar :
• escriba el estado en Importar / Exportar mensaje
Comandos:
* Reemplace los datos en <> con los valores adecuados según su entorno. Puede agregar /
modificar parámetros según sus requerimientos. En el ejemplo anterior, todos los parámetros
restantes se agregan en los archivos de parámetros como se indica a continuación: *
https://riptutorial.com/es/home 8
• Tipo de exportación: Exportación de usuario
• Exportar esquema completo
• Detalles del archivo de parámetros [decir exp.par]:
schemas=<schema>
directory= DATAPUMP_REMOTE_DIR
dumpfile=<dbname>_<schema>.dmp
logfile=exp_<dbname>_<schema>.log
schemas=<schema>
directory= DATAPUMP_REMOTE_DIR
dumpfile=<dbname>_<schema>_%U.dmp
logfile=exp_<dbname>_<schema>.log
compression = all
parallel=5
Requisito previo:
• Antes de importar usuarios, es una buena práctica eliminar el esquema o la tabla importada.
Comandos:
* Reemplace los datos en <> con los valores adecuados según su entorno. Puede agregar /
modificar parámetros según sus requerimientos. En el ejemplo anterior, todos los parámetros
restantes se agregan en los archivos de parámetros como se indica a continuación: *
https://riptutorial.com/es/home 9
schemas=<schema>
directory= DATAPUMP_REMOTE_DIR
dumpfile=<dbname>_<schema>.dmp
logfile=imp_<dbname>_<schema>.log
schemas=<schema>
directory= DATAPUMP_REMOTE_DIR
dumpfile=<dbname>_<schema>_%U.dmp
logfile=imp_<dbname>_<schema>.log
parallel=5
1. Cree una carpeta datapump que 4. Cree una carpeta de datapump que
contendrá los archivos de volcado de contendrá los archivos de volcado de
exportación importación
https://riptutorial.com/es/home 10
Copia tablas entre diferentes esquemas y espacios de tabla
https://riptutorial.com/es/home 11
Capítulo 5: Consejos
Parámetros
Parámetros Detalles
Examples
Pista paralela
Las sugerencias paralelas a nivel de objeto dan más control pero son más propensas a errores;
los desarrolladores a menudo olvidan usar el alias en lugar del nombre del objeto, u olvidan incluir
algunos objetos.
Digamos que una consulta tarda 100 segundos en ejecutarse sin utilizar una sugerencia paralela.
Si cambiamos DOP a 2 para la misma consulta, lo ideal sería que la misma consulta con una
sugerencia paralela tomara 50 segundos. De manera similar, usar DOP como 4 tomará 25
segundos.
USE_NL
Uso: use_nl(AB)
Esta sugerencia le pedirá al motor que use el método de bucle anidado para unir las tablas A y B.
Eso es comparación fila por fila. La sugerencia no fuerza el orden de la unión, solo solicita NL.
https://riptutorial.com/es/home 12
SELECT /*+use_nl(e d)*/ *
FROM Employees E
JOIN Departments D on E.DepartmentID = D.ID
APÉNDATE A LA PISTA
La sugerencia APPEND indica al motor que use la carga de ruta directa . Esto significa que el motor
no utilizará una inserción convencional que use estructuras de memoria y bloqueos estándar, sino
que escribirá directamente en el espacio de tablas los datos. Siempre crea nuevos bloques que
se agregan al segmento de la tabla. Esto será más rápido, pero tiene algunas limitaciones:
• No puede leer de la tabla que adjuntó en la misma sesión hasta que cometa o restituya la
transacción.
• Si hay activadores definidos en la tabla, Oracle no usará la ruta directa (es una historia
diferente para las cargas de sqlldr).
• otros
Ejemplo.
USE_HASH
Indica al motor que use el método hash para unir tablas en el argumento.
Como se explica en muchos lugares , "en una combinación HASH, Oracle accede a una tabla
(generalmente el más pequeño de los resultados combinados) y crea una tabla hash en la clave
de combinación en la memoria. Luego escanea la otra tabla en la combinación (generalmente la
más grande). uno) y sondea la tabla hash para coincidencias con ella ".
Se prefiere el método de bucles anidados cuando las tablas son grandes, no hay índices
disponibles, etc.
Nota : la sugerencia no fuerza el orden de la unión, solo solicita el método HASH JOIN.
Ejemplo de uso:
COMPLETO
https://riptutorial.com/es/home 13
La sugerencia COMPLETA le dice a Oracle que realice una exploración completa de la tabla en
una tabla específica, sin importar si se puede usar un índice.
create table fullTable(id) as select level from dual connect by level < 100000;
create index idx on fullTable(id);
select /*+ full(f) */ count(1) from fullTable f where id between 10 and 100;
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 13 | 47 (3)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 13 | | |
|* 2 | TABLE ACCESS FULL| FULLTABLE | 2 | 26 | 47 (3)| 00:00:01 |
--------------------------------------------------------------------------------
Caché de resultados
Oracle ( 11g y superior ) permite que las consultas SQL se almacenen en caché en el SGA y se
reutilicen para mejorar el rendimiento. Consulta los datos de la caché en lugar de la base de
datos. La ejecución posterior de la misma consulta es más rápida porque ahora los datos se
extraen de la memoria caché.
Salida -
Number
------
1
2
3
4
5
6
7
8
9
10
Elapsed: 00:00:02.20
https://riptutorial.com/es/home 14
Si vuelvo a ejecutar la misma consulta ahora, el tiempo de ejecución se reducirá ya que los datos
ahora se recuperan del caché que se estableció durante la primera ejecución.
Salida -
Number
------
1
2
3
4
5
6
7
8
9
10
Elapsed: 00:00:00.10
La memoria caché de resultados mantiene la memoria caché hasta que los datos en la
base de datos se actualicen / modifiquen / eliminen. Cualquier cambio liberará el
caché.
https://riptutorial.com/es/home 15
Capítulo 6: consulta de nivel
Observaciones
La cláusula de nivel es responsable de generar N número de registros ficticios basados en alguna
condición específica.
Examples
Generar N Número de registros
/ * Esta es una consulta simple que puede generar una secuencia de números. El siguiente
ejemplo genera una secuencia de números de 1..100 * /
/ * La consulta anterior es útil en varios escenarios, como generar una secuencia de fechas a
partir de una fecha determinada. La siguiente consulta genera 10 fechas consecutivas * /
01-ene-17
02-ENE-17
03-ene-17
04-ene-17
05-ene-17
06-ene-17
07-ene-17
08-ene-17
09-ene-17
10-ene-17
https://riptutorial.com/es/home 16
Capítulo 7: Creando un contexto
Sintaxis
• CREAR [O REEMPLAZAR] el espacio de nombres CONTEXTO USANDO el paquete
[schema.];
• CREAR [O REEMPLAZAR] el espacio de nombres CONTEXTO UTILIZANDO el paquete
[esquema.] INICIALIZADO EXTERNAMENTE;
• CREAR [O REEMPLAZAR] el espacio de nombres CONTEXTO UTILIZANDO el paquete
[esquema.] INICIALIZADO GLOBALMENTE;
• CREAR [O REEMPLAZAR] el espacio de nombres CONTEXTO UTILIZANDO el paquete
[schema.] ACCESSED GLOBALLY;
Parámetros
Parámetro Detalles
espacio de Nombre del contexto: este es el espacio de nombres para las llamadas a
nombres SYS_CONTEXT
Especifique una entidad que no sea Oracle Database que pueda establecer
INITIALIZED
el contexto.
Observaciones
Documentación de Oracle (12cR1):
http://docs.oracle.com/database/121/SQLRF/statements_5003.htm
https://riptutorial.com/es/home 17
Examples
Crear un contexto
Esto crea un contexto que solo se puede configurar mediante rutinas en el paquete de base de
datos my_pkg , por ejemplo:
my_pkg.set_ctx;
Value
https://riptutorial.com/es/home 18
Capítulo 8: Delimitando palabras clave o
caracteres especiales
Examples
Delimite el nombre de la tabla o columna con caracteres especiales
Seleccione * de firm's_address;
Seleccione * de "firm's_address";
Supongamos que tiene una tabla con el nombre de tabla o que desea crear una tabla con nombre
que también sea una palabra clave. Debe incluir la tabla de nombres en un par de comillas dobles
"tabla"
Seleccione * de la tabla; La consulta anterior fallará con un error de sintaxis, donde la consulta
siguiente funcionará bien.
Seleccione * de "tabla";
https://riptutorial.com/es/home 19
Capítulo 9: Diccionario de datos
Observaciones
Las vistas del diccionario de datos, también conocidas como vistas de catálogo, le permiten
monitorear el estado de la base de datos en tiempo real:
Las vistas con el prefijo USER_ , ALL_ y DBA_ muestran información sobre los objetos de esquema
que le pertenecen ( USER_ ), a los que puede acceder ( ALL_ ) o a los que puede acceder un usuario
con privilegio de SYSDBA ( DBA_ ). Por ejemplo, la vista ALL_TABLES muestra todas las tablas en las
que tiene privilegios.
Las vistas _PRIVS muestran información de privilegios para diferentes combinaciones de usuarios,
roles y objetos.
Examples
Origen del texto de los objetos almacenados.
USER_SOURCE describe la fuente de texto de los objetos almacenados que son propiedad del usuario
actual. Esta vista no muestra la columna OWNER .
ALL_SOURCE describe la fuente de texto de los objetos almacenados accesibles para el usuario
actual.
DBA_SOURCE describe la fuente de texto de todos los objetos almacenados en la base de datos.
ALL_TAB_COLUMNS describe las columnas de las tablas, vistas y clusters accesibles para el usuario
actual. COLS es un sinónimo de USER_TAB_COLUMNS .
https://riptutorial.com/es/home 20
select *
from all_tab_columns
where table_name = :tname
Información de privilegio
select *
from dba_role_privs
where grantee= :username
select *
from dba_sys_privs
where grantee = :username
2. concesión de objeto
select *
from dba_tab_privs
where grantee = :username
select *
from role_role_privs
where role in (select granted_role from dba_role_privs where grantee= :username)
select *
from role_sys_privs
where role in (select granted_role from dba_role_privs where grantee= :username)
2. concesión de objeto
select *
from role_tab_privs
where role in (select granted_role from dba_role_privs where grantee= :username)
Versión de Oracle
select *
from v$version
https://riptutorial.com/es/home 21
Describe todos los objetos en la base de datos.
select *
from dba_objects
Para ver todas las vistas del diccionario de datos a las que tiene acceso.
https://riptutorial.com/es/home 22
Capítulo 10: Diferentes formas de actualizar
registros.
Sintaxis
• ACTUALIZAR nombre-tabla [[AS] nombre-correlación] SET columna-Nombre = Valor [,
columna-Nombre = Valor}] * [cláusula WHERE]
• ACTUALIZAR nombre-tabla AJUSTE columna-Nombre = Valor [, columna-Nombre = Valor]
* DÓNDE ACTUALMENTE
Examples
Actualice la sintaxis con el ejemplo
Actualización normal
UPDATE
TESTTABLE
SET
TEST_COLUMN= 'Testvalue',TEST_COLUMN2= 123
WHERE
EXISTS
(SELECT MASTERTABLE.TESTTABLE_ID
FROM MASTERTABLE
WHERE ID_NUMBER=11);
Nota : Si se enfrenta a un error de fila no conservada por clave, agregue un índice para resolver
el mismo y así poder actualizarlo.
UPDATE
(SELECT
TESTTABLE.TEST_COLUMN AS OLD,
'Testvalue' AS NEW
FROM
TESTTABLE
INNER JOIN
MASTERTABLE
ON TESTTABLE.TESTTABLE_ID = MASTERTABLE.TESTTABLE_ID
WHERE ID_NUMBER=11) T
SET
T.OLD = T.NEW;
https://riptutorial.com/es/home 23
Utilizando Merge
MERGE INTO
TESTTABLE
USING
(SELECT
T1.ROWID AS RID,
T2.TESTTABLE_ID
FROM
TESTTABLE T1
INNER JOIN
MASTERTABLE T2
ON TESTTABLE.TESTTABLE_ID = MASTERTABLE.TESTTABLE_ID
WHERE ID_NUMBER=11)
ON
( ROWID = RID )
WHEN MATCHED
THEN
UPDATE SET TEST_COLUMN= 'Testvalue';
--
https://riptutorial.com/es/home 24
a.code = c.code
)
when matched then update set a.old = c.old
;
--
select * from table01 a where a.code in (select b.codetable01 from table02 b);
--
select * from table01 a where a.code not in (select b.codetable01 from table02 b);
https://riptutorial.com/es/home 25
Capítulo 11: División de cadenas delimitadas
Examples
División de cadenas mediante una cláusula de factorización de subconsulta
recursiva
Datos de muestra :
Consulta :
Salida :
ID ITEM LVL
---------- ------- ----------
1 a 1
1 b 2
1 c 3
1 d 4
2 e 1
3 (NULL) 1
4 f 1
https://riptutorial.com/es/home 26
4 (NULL) 2
4 g 3
Función PL / SQL :
Datos de muestra :
Consulta :
SELECT t.id,
v.column_value AS value,
ROW_NUMBER() OVER ( PARTITION BY id ORDER BY ROWNUM ) AS lvl
FROM table_name t,
TABLE( split_String( t.list ) ) (+) v
Salida :
ID ITEM LVL
---------- ------- ----------
https://riptutorial.com/es/home 27
1 a 1
1 b 2
1 c 3
1 d 4
2 e 1
3 (NULL) 1
4 f 1
4 (NULL) 2
4 g 3
Datos de muestra :
Consulta :
SELECT t.id,
v.COLUMN_VALUE AS value,
ROW_NUMBER() OVER ( PARTITION BY id ORDER BY ROWNUM ) AS lvl
FROM table_name t,
TABLE(
CAST(
MULTISET(
SELECT REGEXP_SUBSTR( t.list, '([^,]*)(,|$)', 1, LEVEL, NULL, 1 )
FROM DUAL
CONNECT BY LEVEL < REGEXP_COUNT( t.list, '[^,]*(,|$)' )
)
AS SYS.ODCIVARCHAR2LIST
)
) v;
Salida :
ID ITEM LVL
---------- ------- ----------
1 a 1
1 b 2
1 c 3
1 d 4
2 e 1
3 (NULL) 1
4 f 1
4 (NULL) 2
4 g 3
Datos de muestra :
https://riptutorial.com/es/home 28
CREATE TABLE table_name ( id, list ) AS
SELECT 1, 'a,b,c,d' FROM DUAL UNION ALL -- Multiple items in the list
SELECT 2, 'e' FROM DUAL UNION ALL -- Single item in the list
SELECT 3, NULL FROM DUAL UNION ALL -- NULL list
SELECT 4, 'f,,g' FROM DUAL; -- NULL item in the list
Consulta :
SELECT t.id,
REGEXP_SUBSTR( list, '([^,]*)(,|$)', 1, LEVEL, NULL, 1 ) AS value,
LEVEL AS lvl
FROM table_name t
CONNECT BY
id = PRIOR id
AND PRIOR SYS_GUID() IS NOT NULL
AND LEVEL < REGEXP_COUNT( list, '([^,]*)(,|$)' )
Salida :
ID ITEM LVL
---------- ------- ----------
1 a 1
1 b 2
1 c 3
1 d 4
2 e 1
3 (NULL) 1
4 f 1
4 (NULL) 2
4 g 3
Esta solución utiliza la función ora:tokenize XQuery que está disponible en Oracle 11.
Datos de muestra :
Consulta :
SELECT t.id,
x.item,
x.lvl
FROM table_name t,
XMLTABLE(
'let $list := ora:tokenize(.,","),
$cnt := count($list)
for $val at $r in $list
where $r < $cnt
return $val'
https://riptutorial.com/es/home 29
PASSING list||','
COLUMNS
item VARCHAR2(100) PATH '.',
lvl FOR ORDINALITY
) (+) x;
Salida :
ID ITEM LVL
---------- ------- ----------
1 a 1
1 b 2
1 c 3
1 d 4
2 e 1
3 (NULL) (NULL)
4 f 1
4 (NULL) 2
4 g 3
Datos de muestra :
Consulta :
SELECT t.id,
REGEXP_SUBSTR( t.list, '([^,]*)($|,)', 1, l.lvl, NULL, 1 ) AS item,
l.lvl
FROM table_name t
CROSS APPLY
(
SELECT LEVEL AS lvl
FROM DUAL
CONNECT BY LEVEL <= REGEXP_COUNT( t.list, ',' ) + 1
) l;
Salida :
ID ITEM LVL
---------- ------- ----------
1 a 1
1 b 2
1 c 3
1 d 4
2 e 1
3 (NULL) 1
4 f 1
4 (NULL) 2
https://riptutorial.com/es/home 30
4 g 3
Datos de muestra :
Consulta :
SELECT t.id,
SUBSTR( x.item.getStringVal(), 2 ) AS item,
x.lvl
FROM table_name t
CROSS JOIN
XMLTABLE(
( '"#' || REPLACE( t.list, ',', '","#' ) || '"' )
COLUMNS item XMLTYPE PATH '.',
lvl FOR ORDINALITY
) x;
(Nota: el carácter # se adjunta para facilitar la extracción de valores NULL ; luego se elimina
mediante SUBSTR( item, 2 ) . Si no se requieren valores NULL , puede simplificar la consulta y omitir
esto).
Salida :
ID ITEM LVL
---------- ------- ----------
1 a 1
1 b 2
1 c 3
1 d 4
2 e 1
3 (NULL) 1
4 f 1
4 (NULL) 2
4 g 3
https://riptutorial.com/es/home 31
Capítulo 12: Enlaces de base de datos
Examples
Creando un enlace de base de datos
Para probar una conexión de enlace de base de datos sin necesidad de conocer ninguno de los
nombres de objeto en la base de datos vinculada, use la siguiente consulta:
Para especificar explícitamente un dominio para el servicio de base de datos vinculado, el nombre
de dominio se agrega a la declaración USING . Por ejemplo:
USING 'tns_service_name.WORLD'
• 10g: https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_5005.htm
• 11g: https://docs.oracle.com/cd/B28359_01/server.111/b28310/ds_concepts002.htm
• 12g: https://docs.oracle.com/database/121/SQLRF/statements_5006.htm#SQLRF01205
Supongamos que tenemos dos bases de datos "ORA1" y "ORA2". Podemos acceder a los
objetos de "ORA2" desde la base de datos "ORA1" utilizando un enlace de base de datos.
Requisitos previos: para crear un enlace de base de datos privado necesita un privilegio CREATE
DATABASE LINK . Para crear un enlace de base de datos privado, necesita el privilegio CREATE PUBLIC
DATABASE LINK .
https://riptutorial.com/es/home 32
Desde ORA1:
SQL> create <public> database link ora2 connect to user1 identified by pass1 using <tns name
of ora2>;
Ahora que hemos configurado el enlace DB, podemos demostrar que ejecutando lo siguiente
desde ORA1:
También puede acceder a los Objetos de DB de "ORA2" desde "ORA1", dado que el usuario
user1 tiene el privilegio SELECT sobre esos objetos en ORA2 (como la TABLA 1 a continuación):
Pre-requisitos:
https://riptutorial.com/es/home 33
Capítulo 13: Factoraje de subconsultas
recursivas utilizando la cláusula WITH
(expresiones de tabla comunes AKA)
Observaciones
La factorización de subconsultas recursiva está disponible en Oracle 11g R2.
Examples
Un simple generador de enteros
Consulta :
Salida :
VALUE
-----
1
2
3
4
5
6
7
8
9
10
Datos de muestra :
https://riptutorial.com/es/home 34
Consulta :
Salida :
https://riptutorial.com/es/home 35
Capítulo 14: fechas
Examples
Fechas de generación sin componente de tiempo
Todos los DATE s tienen un componente de tiempo; sin embargo, es habitual almacenar fechas
que no necesitan incluir información de tiempo con las horas / minutos / segundos establecidos en
cero (es decir, medianoche).
(Puede encontrar más información sobre los modelos de formato de fecha en la documentación
de Oracle).
o:
SELECT TO_DATE(
'January 1, 2000, 00:00 A.M.',
'Month dd, YYYY, HH12:MI A.M.',
'NLS_DATE_LANGUAGE = American'
)
FROM DUAL;
(Si está convirtiendo términos específicos del idioma, como los nombres de los meses, es una
buena práctica incluir el tercer parámetro nlsparam en la función TO_DATE() y especificar el idioma
que se espera).
https://riptutorial.com/es/home 36
Oracle implícitamente emitirá un TIMESTAMP a una DATE cuando lo almacene en una columna DATE
de una tabla; sin embargo, puede CAST() explícitamente CAST() el valor a una DATE :
En Oracle, un tipo de datos DATE no tiene un formato; cuando Oracle envía una DATE al programa
cliente (SQL / Plus, SQL / Developer, Toad, Java, Python, etc.) enviará 7- u 8 bytes que
representan la fecha.
Una DATE que no se almacena en una tabla (es decir, generada por SYSDATE y que tiene "tipo 13"
cuando se usa el comando DUMP() ) tiene 8 bytes y tiene la estructura (los números a la derecha
son la representación interna de 2012-11-26 16:41:09 ):
Una DATE que se almacena en una tabla ("tipo 12" cuando se usa el comando DUMP() ) tiene 7
bytes y tiene la estructura (los números a la derecha son la representación interna de 2012-11-26
16:41:09 ):
Si desea que la fecha tenga un formato específico, deberá convertirlo a algo que tenga un formato
(es decir, una cadena). El cliente SQL puede hacer esto implícitamente o puede convertir
explícitamente el valor en una cadena usando TO_CHAR( date, format_model, nls_params ) .
https://riptutorial.com/es/home 37
de formato).
Entonces:
Salidas:
FORMATTED_DATE
--------------
2000-01-01
2016-07-21
2016-07-21
Y:
SELECT TO_CHAR(
date_value,
'FMMonth d yyyy, hh12:mi:ss AM',
'NLS_DATE_LANGUAGE = French'
) AS formatted_date
FROM table_name;
Salidas:
FORMATTED_DATE
-----------------------------
Janvier 01 2000, 12:00:00 AM
Juillet 21 2016, 08:00:00 AM
Juillet 21 2016, 19:08:31 PM
Cuando Oracle se convierte implícitamente de una DATE a una cadena o viceversa (o cuando
TO_CHAR() o TO_DATE() se llaman explícitamente sin un modelo de formato), el parámetro de sesión
NLS_DATE_FORMAT se usará como el modelo de formato en la conversión. Si el literal no coincide con
el modelo de formato, se generará una excepción.
https://riptutorial.com/es/home 38
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
Cuando SQL / Plus o SQL Developer muestran fechas, realizarán una conversión implícita a una
cadena utilizando el modelo de formato de fecha predeterminado (consulte el ejemplo
Configuración del modelo de formato de fecha predeterminado).
Puede cambiar la forma en que se muestra una fecha cambiando el parámetro NLS_DATE_FORMAT .
En Oracle, la diferencia (en días y / o fracciones de los mismos) entre dos DATE se puede
encontrar mediante la resta:
DIFFERENCE
----------
89
Y:
DIFFERENCE
----------
1.0425
La diferencia en horas, minutos o segundos puede encontrarse multiplicando este número por 24 ,
24*60 o 24*60*60 respectivamente.
El ejemplo anterior se puede cambiar para obtener los días, horas, minutos y segundos entre dos
fechas utilizando:
https://riptutorial.com/es/home 39
TRUNC( MOD( difference * 24, 24 ) ) AS hours,
TRUNC( MOD( difference * 24*60, 60 ) ) AS minutes,
TRUNC( MOD( difference * 24*60*60, 60 ) ) AS seconds
FROM (
SELECT TO_DATE( '2016-01-02 01:01:12', 'YYYY-MM-DD HH24:MI:SS' )
- TO_DATE( '2016-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS' )
AS difference
FROM DUAL
);
(Nota: TRUNC() se usa en lugar de FLOOR() para manejar correctamente las diferencias negativas.)
Salidas:
La diferencia en meses entre dos fechas se puede encontrar utilizando el MONTHS_BETWEEN( date1,
date2 ) :
Salidas:
DIFFERENCE
----------
12
Si la diferencia incluye meses parciales, devolverá la fracción del mes según que haya 31 días en
cada mes:
https://riptutorial.com/es/home 40
Salidas:
DIFFERENCE
----------
1.4516129
Debido a que MONTHS_BETWEEN supone 31 días al mes cuando puede haber menos días al mes, esto
puede MONTHS_BETWEEN valores diferentes para las diferencias que abarcan los límites entre los
meses.
Ejemplo:
Salida:
La diferencia en años se puede encontrar al dividir la diferencia del mes entre 12.
Extraiga los componentes del año, mes, día, hora, minuto o segundo de una
fecha
Los componentes de año, mes o día de un tipo de datos DATE se pueden encontrar utilizando
EXTRACT( [ YEAR | MONTH | DAY ] FROM datevalue )
Salidas:
Por ejemplo:
https://riptutorial.com/es/home 41
SELECT EXTRACT( HOUR FROM CAST( datetime AS TIMESTAMP ) ) AS Hours,
EXTRACT( MINUTE FROM CAST( datetime AS TIMESTAMP ) ) AS Minutes,
EXTRACT( SECOND FROM CAST( datetime AS TIMESTAMP ) ) AS Seconds
FROM (
SELECT TO_DATE( '2016-01-01 09:42:01', 'YYYY-MM-DD HH24:MI:SS' ) AS datetime FROM DUAL
);
Salidas:
El tipo de datos DATE no controla las zonas horarias ni los cambios en el horario de verano.
Ya sea:
Una DATE se puede almacenar como hora universal coordinada (UTC) y se puede convertir a la
zona horaria de la sesión actual de esta manera:
SELECT FROM_TZ(
CAST(
TO_DATE( '2016-01-01 12:00:00', 'YYYY-MM-DD HH24:MI:SS' )
AS TIMESTAMP
),
'UTC'
)
AT LOCAL AS time
FROM DUAL;
TIME
------------------------------------
2016-01-01 13:00:00.000000000 +01:00
TIME
------------------------------------
2016-01-01 04:00:00.000000000 PST
Leap Seconds
Oracle no maneja segundos de salto . Consulte la nota 2019397.2 y 730795.1 de My Oracle Support
para obtener más detalles.
https://riptutorial.com/es/home 42
Obtención del día de la semana
Salidas 5
ALTER SESSION SET NLS_TERRITORY = 'UNITED KINGDOM'; -- First day of week is Monday
SELECT TO_CHAR( DATE '1970-01-01', 'D' ) FROM DUAL;
Salidas 4
Para hacer esto independientemente de la configuración de NLS , puede truncar la fecha hasta la
medianoche del día actual (para eliminar cualquier fracción de días) y restar la fecha truncada al
inicio de la iso-semana actual (que siempre comienza el lunes):
https://riptutorial.com/es/home 43
Capítulo 15: Funciones de ventana
Sintaxis
• Ratio_To_Report (expr) OVER (query_partition_clause)
Examples
Ratio_To_Report
Proporciona la relación del valor de las filas actuales a todos los valores dentro de la ventana.
--Data
CREATE TABLE Employees (Name Varchar2(30), Salary Number(10));
INSERT INTO Employees Values ('Bob',2500);
INSERT INTO Employees Values ('Alice',3500);
INSERT INTO Employees Values ('Tom',2700);
INSERT INTO Employees Values ('Sue',2000);
--Query
SELECT Name, Salary, Ratio_To_Report(Salary) OVER () As Ratio
FROM Employees
ORDER BY Salary, Name, Ratio;
--Output
NAME SALARY RATIO
------------------------------ ---------- ----------
Sue 2000 .186915888
Bob 2500 .23364486
Tom 2700 .252336449
Alice 3500 .327102804
https://riptutorial.com/es/home 44
Capítulo 16: Funciones estadisticas
Examples
Cálculo de la mediana de un conjunto de valores.
La función MEDIANA desde Oracle 10g es una función de agregación fácil de usar:
SELECT MEDIAN(SAL)
FROM EMP
Desde Oracle 9i puede usar PERCENTILE_CONT que funciona igual que la función MEDIAN con
valores predeterminados de valor percentil de 0.5
DIFERENCIA
La varianza mide qué tan lejos se distribuyen los números determinados de su media. Desde la
perspectiva práctica, es la distancia al cuadrado de su media (centro): cuanto mayor sea el
número, más lejos estará el punto.
STDDEV
La base de datos Oracle calcula la desviación estándar como la raíz cuadrada de la varianza
https://riptutorial.com/es/home 45
definida para la función agregada VARIANCE.
Esta función toma como argumento cualquier tipo de datos numérico o cualquier tipo de datos no
numéricos que puedan convertirse implícitamente en un tipo de datos numérico. La función
devuelve el mismo tipo de datos que el tipo de datos numérico del argumento.
Deviation
----------
3909.36575
https://riptutorial.com/es/home 46
Capítulo 17: Índices
Introducción
Aquí explicaré diferentes índices usando ejemplos, cómo el índice aumenta el rendimiento de las
consultas, cómo el índice disminuye el rendimiento del DML, etc.
Examples
índice de árbol b
Por defecto, si no mencionamos nada, Oracle crea un índice como un índice B-tree. Pero
debemos saber cuándo usarlo. El índice de árbol B almacena los datos como formato de árbol
binario. Como sabemos, el índice es un objeto de esquema que almacena algún tipo de entrada
para cada valor para la columna indexada. Por lo tanto, siempre que se realice una búsqueda en
esas columnas, verifica en el índice la ubicación exacta de ese registro para acceder
rápidamente. Algunos puntos sobre la indexación:
• Para buscar una entrada en el índice, se utiliza algún tipo de algoritmo de búsqueda binario.
• Cuando la cardinalidad de los datos es alta, el índice b-tree es perfecto para usar.
• El índice hace que el DML sea lento, ya que para cada registro, debe haber una entrada en
el índice para la columna indexada.
• Por lo tanto, si no es necesario, deberíamos evitar crear índices.
https://riptutorial.com/es/home 47
de fila, y estos valores de ID de fila pueden acceder directamente a la información
requerida.
SELECT *
FROM user_data
WHERE UPPER(first_name) = 'JOHN2';
https://riptutorial.com/es/home 48
Capítulo 18: Limitar las filas devueltas por
una consulta (Paginación)
Examples
Obtener las primeras N filas con la cláusula de limitación de fila
SELECT val
FROM mytable
ORDER BY val DESC
FETCH FIRST 5 ROWS ONLY;
SELECT * FROM (
SELECT val
FROM mytable
ORDER BY val DESC
) WHERE ROWNUM <= 5;
Paginación en SQL
SELECT val
FROM (SELECT val, rownum AS rnum
FROM (SELECT val
FROM rownum_order_test
ORDER BY val)
WHERE rownum <= :upper_limit)
WHERE rnum >= :lower_limit ;
De esta manera podemos paginar los datos de la tabla, al igual que la página de servicio web
select * from
(
select val from mytable
) where rownum<=5
Si queremos el primer o último registro, queremos una cláusula orden por en la consulta interna
que dará un resultado basado en el pedido.
https://riptutorial.com/es/home 49
select * from
(
select val from mytable order by val desc
) where rownum<=5
select * from
(
select val from mytable order by val
) where rownum<=5
with t as (
select col1
, col2
, row_number() over (order by col1, col2) rn
from table
)
select col1
, col2
from t
where rn between N and M; -- N and M are both inclusive
En Oracle 12g +
En versiones anteriores
SELECT Id,
Col1
FROM (SELECT Id,
Col1,
row_number() over (order by Id) RowNumber
FROM TableName)
WHERE RowNumber BETWEEN 21 AND 40
En Oracle 12g +
https://riptutorial.com/es/home 50
SELECT Id, Col1
FROM TableName
ORDER BY Id
OFFSET 5 ROWS;
En versiones anteriores
SELECT Id,
Col1
FROM (SELECT Id,
Col1,
row_number() over (order by Id) RowNumber
FROM TableName)
WHERE RowNumber > 20
Lea Limitar las filas devueltas por una consulta (Paginación) en línea:
https://riptutorial.com/es/oracle/topic/4300/limitar-las-filas-devueltas-por-una-consulta--paginacion-
https://riptutorial.com/es/home 51
Capítulo 19: Manejo de valores nulos
Introducción
Una columna es NULA cuando no tiene valor, independientemente del tipo de datos de esa
columna. Una columna nunca debe compararse con NULL usando esta sintaxis a = NULL ya que el
resultado sería DESCONOCIDO. En su lugar, utilice las condiciones a IS NULL o a IS NOT NULL .
NULL no es igual a NULL. Para comparar dos expresiones donde puede ocurrir una nula, use una
de las funciones que se describen a continuación. Todos los operadores, excepto la
concatenación, devuelven NULL si uno de sus operandos es NULL. Por ejemplo, el resultado de 3
* NULL + 5 es nulo.
Observaciones
NULL no puede aparecer en columnas restringidas por una CLAVE PRINCIPAL o una restricción
NOT NULL. (La excepción es una nueva restricción con la cláusula NOVALIDATE)
Examples
Las columnas de cualquier tipo de datos pueden contener NULLs
NUM_COLUMN VARCHAR2_COLUMN
1 foo
(nulo) (nulo)
UNA segundo
1 (nulo)
https://riptutorial.com/es/home 52
3 * NULL + 5 'HOLA' || NULL || 'MUNDO'
COLUMN_WITH_NULL COLUMN_WITHOUT_NULL
(nulo) N/A
NVL es útil para comparar dos valores que pueden contener valores nulos:
SELECT
CASE WHEN a = b THEN 1 WHEN a <> b THEN 0 else -1 END comparison_without_nvl,
CASE WHEN NVL(a, -1) = NVL(b, -1) THEN 1 WHEN NVL(a, -1) <> NVL(b, -1) THEN 0 else -1 END
comparison_with_nvl
FROM
(select null a, 3 b FROM DUAL
UNION ALL
SELECT NULL, NULL FROM DUAL);
COMPARISON_WITHOUT_NVL COMPARACIÓN_WITH_NVL
-1 0
-1 1
Bar Foo
https://riptutorial.com/es/home 53
COALESCE (A, B, C, D, 5)
En algunos casos, usar COALESCE con dos parámetros puede ser más rápido que usar NVL
cuando el segundo parámetro no es una constante. NVL siempre evaluará ambos parámetros.
COALESCE se detendrá en el primer valor no NULL que encuentre. Esto significa que si el primer
valor no es NULL, COALESCE será más rápido.
https://riptutorial.com/es/home 54
Capítulo 20: Manipulación de cuerdas
Examples
Concatenación: Operador || o función concat ()
Ejemplo:
id firstname lastname
--- ----------- ----------
1 Thomas Woody
Consulta:
Salida:
My Sentence
---------------------------------
Thomas Woody is in my database.
Ejemplo:
Consulta:
Salida:
Expr1
---------------------------------
Thomas is in my database.
SUPERIOR
La función SUPERIOR le permite convertir todas las letras minúsculas de una cadena a
mayúsculas.
https://riptutorial.com/es/home 55
SELECT UPPER('My text 123!') AS result FROM dual;
Salida:
RESULT
------------
MY TEXT 123!
INITCAP
La función INITCAP convierte el caso de una cadena de modo que cada palabra comience con una
letra mayúscula y todas las letras subsiguientes estén en minúscula.
Salida
NEW
-------------------
Hello Mr Macdonald!
INFERIOR
Salidas:
texto
hola world123!
Expresión regular
Digamos que queremos reemplazar solo números con 2 dígitos: la expresión regular los
encontrará con (\d\d)
SELECT REGEXP_REPLACE ('2, 5, and 10 are numbers in this example', '(\d\d)', '#')
FROM dual;
Resultados en:
Si quiero intercambiar partes del texto, uso \1 , \2 , \3 para llamar a las cadenas coincidentes:
https://riptutorial.com/es/home 56
SELECT REGEXP_REPLACE ('swap around 10 in that one ', '(.*)(\d\d )(.*)', '\3\2\1\3')
FROM dual;
SUBSTR
SUBSTR recupera parte de una cadena indicando la posición inicial y el número de caracteres que
se extraerán
devoluciones:
bcd
Para contar desde el final de la cadena, SUBSTR acepta un número negativo como segundo
parámetro, por ejemplo
devoluciones:
de
LTRIM / RTRIM
LTRIMy RTRIM eliminan los caracteres del principio o del final (respectivamente) de una cadena. Se
puede suministrar un conjunto de uno o más caracteres (el valor predeterminado es un espacio)
para eliminar.
Por ejemplo,
Devoluciones:
HELLO<===>
<===>HELLO
https://riptutorial.com/es/home 57
Capítulo 21: Mesa doble
Observaciones
DUAL tabla DUAL tiene una columna DUMMY , definida como VARCHAR2(1) y solo una fila con un valor x .
DUALtabla DUAL se crea automáticamente en el esquema SYS cuando se crea la base de datos.
Puedes acceder desde cualquier esquema.
Puede usar la tabla DUAL para llamar a cualquier función desde la declaración SQL. Es útil porque
solo tiene una fila y Oracle Optimizer lo sabe todo al respecto.
Examples
El siguiente ejemplo devuelve la fecha y hora actuales del sistema operativo
https://riptutorial.com/es/home 58
Capítulo 22: Oracle Advanced Queuing (AQ)
Observaciones
• Nunca use DDL o DML contra tablas creadas por dbms_aqadm.create_queue_table . Utilice solo
dbms_aqadm y dbms_aq para trabajar con estas tablas. Oracle puede crear varias tablas de
soporte, índices, etc. de los que no tendrá conocimiento. La ejecución manual de DDL o
DML en la tabla puede llevarlo a un escenario en el que el soporte de Oracle necesitará que
suelte y vuelva a crear la tabla y las colas para resolver la situación.
Examples
Productor / Consumidor Simple
Visión general
Crea una cola a la que podamos enviar un mensaje. Oracle notificará a nuestro procedimiento
almacenado que un mensaje ha sido puesto en cola y debe ser trabajado. También agregaremos
algunos subprogramas que podemos usar en una emergencia para evitar que los mensajes se
desactualicen, permitir que se vuelva a poner en cola y ejecutar un trabajo por lotes simple para
trabajar con todos los mensajes.
Estos ejemplos se probaron en Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit
Production.
Crear cola
Crearemos un tipo de mensaje, una tabla de cola que puede contener los mensajes y una cola.
Los mensajes en la cola se eliminarán en primer lugar por prioridad y luego su tiempo de salida.
Si algo sale mal al trabajar el mensaje y la salida de la cola se retrotrae, AQ hará que el mensaje
esté disponible para la salida 3600 segundos después. Lo hará 48 veces antes de moverlo a una
cola de excepciones.
https://riptutorial.com/es/home 59
create type message_t as object
(
sender varchar2 ( 50 ),
message varchar2 ( 512 )
);
/
-- Type MESSAGE_T compiled
begin dbms_aqadm.create_queue_table(
queue_table => 'MESSAGE_Q_TBL',
queue_payload_type => 'MESSAGE_T',
sort_list => 'PRIORITY,ENQ_TIME',
multiple_consumers => false,
compatible => '10.0.0');
end;
/
-- PL/SQL procedure successfully completed.
begin dbms_aqadm.create_queue(
queue_name => 'MESSAGE_Q',
queue_table => 'MESSAGE_Q_TBL',
queue_type => 0,
max_retries => 48,
retry_delay => 3600,
dependency_tracking => false);
end;
/
-- PL/SQL procedure successfully completed.
Ahora que tenemos un lugar para colocar los mensajes, podemos crear un paquete para
administrar y trabajar los mensajes en la cola.
-- prevents messages from being worked but will still allow them to be created and enqueued
procedure disable_dequeue;
end;
/
https://riptutorial.com/es/home 60
-25228);
-- prevents messages from being worked but will still allow them to be created and enqueued
procedure disable_dequeue
as
begin
dbms_aqadm.stop_queue (queue_name => queue_name_c, dequeue => true, enqueue => false);
end disable_dequeue;
https://riptutorial.com/es/home 61
procedure work_old_messages
as
pragma autonomous_transaction;
dequeue_options_l dbms_aq.dequeue_options_t;
message_id_l raw (16);
message_l message_t;
message_properties_l dbms_aq.message_properties_t;
begin
dequeue_options_l.wait := dbms_aq.no_wait;
dequeue_options_l.navigation := dbms_aq.first_message;
begin
dbms_aq.register (
sys.aq$_reg_info_list (
sys.aq$_reg_info (user || '.' || message_worker_pkg.queue_name_c,
dbms_aq.namespace_aq,
'plsql://' || user || '.message_worker_pkg.on_message_enqueued',
hextoraw ('FF'))),
1);
commit;
end;
declare
enqueue_options_l dbms_aq.enqueue_options_t;
message_properties_l dbms_aq.message_properties_t;
message_id_l raw (16);
message_l message_t;
begin
-- only need to do this next line ONCE
dbms_aqadm.start_queue (queue_name => message_worker_pkg.queue_name_c, enqueue => true ,
dequeue => true);
https://riptutorial.com/es/home 62
message_properties => message_properties_l,
payload => message_l,
msgid => message_id_l);
commit;
end;
https://riptutorial.com/es/home 63
Capítulo 23: Oracle MAF
Examples
Para obtener valor de Binding
AdfmfContainerUtilities.invokeContainerJavaScriptFunction(AdfmfJavaUtilities.getFeatureId(),
<function>, new Object[] {
});
https://riptutorial.com/es/home 64
Capítulo 24: Particionamiento de tablas
Introducción
La partición es una funcionalidad para dividir tablas e índices en partes más pequeñas. Se utiliza
para mejorar el rendimiento y para gestionar las piezas más pequeñas de forma individual. La
clave de partición es una columna o un conjunto de columnas que define en qué partición se
almacenará cada fila. Resumen de particiones en la documentación oficial de Oracle
Observaciones
La partición es una opción de costo adicional y solo está disponible para la Edición Enterprise.
Examples
Particionamiento hash
Esto crea una tabla particionada por hash, en este ejemplo en el ID de tienda.
Debería usar una potencia de 2 para el número de particiones hash, de modo que obtenga una
distribución uniforme en el tamaño de la partición.
Partición de rango
Esto crea una tabla particionada por rangos, en este ejemplo en valores de orden.
https://riptutorial.com/es/home 65
Compruebe las particiones existentes en el esquema
Lista de particionamiento
Esto crea una tabla particionada por listas, en este ejemplo en el ID de tienda.
Soltar partición
https://riptutorial.com/es/home 66
ADD PARTITION new_partition VALUES LESS THAN(400);
Partición dividida
Fusionar particiones
Intercambie / convierta una partición a una tabla no particionada y viceversa. Esto facilita un
"movimiento" rápido de datos entre los segmentos de datos (en lugar de hacer algo como
"insertar ... seleccionar" o "crear tabla ... como seleccionar") ya que la operación es DDL (la
operación de intercambio de partición es un dato). actualización del diccionario sin mover los
datos reales) y no DML (gran sobrecarga de deshacer / rehacer).
1. Convierta una tabla no particionada (tabla "B") a una partición (de la tabla "A"):
La tabla "A" no contiene datos en la partición "OLD_VALUES" y la tabla "B" contiene datos
Resultado: los datos se "mueven" de la tabla "B" (no contiene datos después de la operación) a la
partición "OLD_VALUES"
La tabla "A" contiene datos en la partición "OLD_VALUES" y la tabla "B" no contiene datos
Resultado: los datos se "mueven" de la partición "OLD_VALUES" (no contiene datos después de
la operación) a la tabla "B"
Nota: hay varias opciones, características y restricciones adicionales para esta operación.
https://riptutorial.com/es/home 67
Puede encontrar más información en este enlace ---> "
https://docs.oracle.com/cd/E11882_01/server.112/e25523/part_admin002.htm#i1107555 "
(sección "Intercambiar particiones")
https://riptutorial.com/es/home 68
Capítulo 25: Recuperación jerárquica con
Oracle Database 12C
Introducción
Puede usar consultas jerárquicas para recuperar datos basados en una relación jerárquica natural
entre filas en una tabla
Examples
Usando el CONNECT BY Caluse
https://riptutorial.com/es/home 69
Capítulo 26: Registro de errores
Examples
Registro de errores al escribir en la base de datos
Cree la tabla de registro de errores de Oracle ERR $ _EXAMPLE para la tabla EXAMPLE
existente:
https://riptutorial.com/es/home 70
Capítulo 27: restricciones
Examples
Actualizar claves foráneas con nuevo valor en Oracle
Supongamos que tiene una tabla y desea cambiar una de las ID principales de esta tabla. Puedes
usar el siguiente scrpit. ID primario aquí es "PK_S"
begin
for i in (select a.table_name, c.column_name
from user_constraints a, user_cons_columns c
where a.CONSTRAINT_TYPE = 'R'
and a.R_CONSTRAINT_NAME = 'PK_S'
and c.constraint_name = a.constraint_name) loop
end loop;
end;
Supongamos que tiene la tabla T1 y tiene relación con muchas tablas y su nombre de restricción
de clave principal es "pk_t1" que desea deshabilitar estas claves externas que puede usar:
Begin
For I in (select table_name, constraint_name from user_constraint t where
r_constraint_name='pk_t1') loop
Execute immediate ' alter table ' || I.table_name || ' disable constraint ' ||
i.constraint_name;
End loop;
End;
https://riptutorial.com/es/home 71
Capítulo 28: Se une
Examples
Unirse a la cruz
Una CROSS JOIN realiza una unión entre dos tablas que no usa una cláusula de unión explícita y da
como resultado el producto cartesiano de dos tablas. Un producto cartesiano significa que cada
fila de una tabla se combina con cada fila de la segunda tabla en la unión. Por ejemplo, si TABLEA
tiene 20 filas y TABLEB tiene 20 filas, el resultado sería 20*20 = 400 filas de salida.
Ejemplo:
SELECT *
FROM TABLEA CROSS JOIN TABLEB;
SELECT *
FROM TABLEA, TABLEB;
+-------+---------+
| VALUE | NAME |
+-------+---------+
| 1 | ONE |
| 2 | TWO |
+-------+---------+
+-------+--------+
| VALUE | NAME |
+-------+--------+
| 3 | THREE |
| 4 | FOUR |
+-------+--------+
SELECT *
FROM TABLEA CROSS JOIN TABLEB;
Salida:
https://riptutorial.com/es/home 72
+-------+--------+-------+--------+
| VALUE | NAME | VALUE | NAME |
+-------+--------+-------+--------+
| 1 | ONE | 3 | THREE |
| 1 | ONE | 4 | FOUR |
| 2 | TWO | 3 | THREE |
| 2 | TWO | 4 | FOUR |
+-------+--------+-------+--------+
UNIR INTERNAMENTE
Un INNER JOIN es una operación JOIN que le permite especificar una cláusula de unión
explícita.
Sintaxis
El alcance de las expresiones en la cláusula ON incluye las tablas actuales y cualquier tabla en
bloques de consulta externos al SELECT actual. En el siguiente ejemplo, la cláusula ON se refiere
a las tablas actuales:
https://riptutorial.com/es/home 73
-- alternate form of a fullselect).
-- This query shows how a table can be derived called "X"
-- having 2 columns "R1" and "R2" and 1 row of data
SELECT *
FROM (VALUES (3, 4), (1, 5), (2, 6))
AS VALUESTABLE1(C1, C2)
JOIN (VALUES (3, 2), (1, 2),
(0, 3)) AS VALUESTABLE2(c1, c2)
ON VALUESTABLE1.c1 = VALUESTABLE2.c1
-- This results in:
-- C1 |C2 |C1 |2
-- -----------------------------------------------
-- 3 |4 |3 |2
-- 1 |5 |1 |2
Una LEFT OUTER JOIN realiza una unión entre dos tablas que requiere una cláusula de unión
explícita pero no excluye filas no coincidentes de la primera tabla.
Ejemplo:
SELECT
ENAME,
DNAME,
EMP.DEPTNO,
DEPT.DEPTNO
FROM
SCOTT.EMP LEFT OUTER JOIN SCOTT.DEPT
ON EMP.DEPTNO = DEPT.DEPTNO;
Aunque la sintaxis ANSI es la forma recomendada , es probable que se encuentre con una
sintaxis heredada muy a menudo. El uso de (+) dentro de una condición determina qué lado de la
ecuación debe considerarse como externo .
SELECT
ENAME,
DNAME,
EMP.DEPTNO,
DEPT.DEPTNO
https://riptutorial.com/es/home 74
FROM
SCOTT.EMP,
SCOTT.DEPT
WHERE
EMP.DEPTNO = DEPT.DEPTNO(+);
+-----------+---------+
| NAME | DEPTNO |
+-----------+---------+
| A | 2 |
| B | 1 |
| C | 3 |
| D | 2 |
| E | 1 |
| F | 1 |
| G | 4 |
| H | 4 |
+-----------+---------+
+---------+--------------+
| DEPTNO | DEPTNAME |
+---------+--------------+
| 1 | ACCOUNTING |
| 2 | FINANCE |
| 5 | MARKETING |
| 6 | HR |
+---------+--------------+
SELECT
*
FROM
EMPLOYEE LEFT OUTER JOIN DEPT
ON EMPLOYEE.DEPTNO = DEPT.DEPTNO;
Salida:
+-----------+---------+---------+--------------+
| NAME | DEPTNO | DEPTNO | DEPTNAME |
+-----------+---------+---------+--------------+
| F | 1 | 1 | ACCOUNTING |
| E | 1 | 1 | ACCOUNTING |
| B | 1 | 1 | ACCOUNTING |
| D | 2 | 2 | FINANCE |
| A | 2 | 2 | FINANCE |
| C | 3 | | |
| H | 4 | | |
| G | 4 | | |
+-----------+---------+---------+--------------+
https://riptutorial.com/es/home 75
JUSTE EXTERIOR DERECHO
A RIGHT OUTER JOIN realiza una unión entre dos tablas que requiere una cláusula de unión explícita
pero no excluye filas no coincidentes de la segunda tabla.
Ejemplo:
SELECT
ENAME,
DNAME,
EMP.DEPTNO,
DEPT.DEPTNO
FROM
SCOTT.EMP RIGHT OUTER JOIN SCOTT.DEPT
ON EMP.DEPTNO = DEPT.DEPTNO;
Como se incluyen las filas no SCOTT.DEPT de SCOTT.DEPT , pero no se incluyen las filas no SCOTT.EMP
de SCOTT.EMP , lo anterior es equivalente a la siguiente declaración que usa LEFT OUTER JOIN .
SELECT
ENAME,
DNAME,
EMP.DEPTNO,
DEPT.DEPTNO
FROM
SCOTT.DEPT RIGHT OUTER JOIN SCOTT.EMP
ON DEPT.DEPTNO = EMP.DEPTNO;
+-----------+---------+
| NAME | DEPTNO |
+-----------+---------+
| A | 2 |
| B | 1 |
| C | 3 |
| D | 2 |
| E | 1 |
| F | 1 |
| G | 4 |
| H | 4 |
+-----------+---------+
+---------+--------------+
| DEPTNO | DEPTNAME |
+---------+--------------+
| 1 | ACCOUNTING |
| 2 | FINANCE |
| 5 | MARKETING |
| 6 | HR |
https://riptutorial.com/es/home 76
+---------+--------------+
SELECT
*
FROM
EMPLOYEE RIGHT OUTER JOIN DEPT
ON EMPLOYEE.DEPTNO = DEPT.DEPTNO;
Salida:
+-----------+---------+---------+--------------+
| NAME | DEPTNO | DEPTNO | DEPTNAME |
+-----------+---------+---------+--------------+
| A | 2 | 2 | FINANCE |
| B | 1 | 1 | ACCOUNTING |
| D | 2 | 2 | FINANCE |
| E | 1 | 1 | ACCOUNTING |
| F | 1 | 1 | ACCOUNTING |
| | | 5 | MARKETING |
| | | 6 | HR |
+-----------+---------+---------+--------------+
SELECT *
FROM EMPLOYEE, DEPT
WHERE EMPLOYEE.DEPTNO(+) = DEPT.DEPTNO;
ÚNICAMENTE EN EL EXTERIOR
Un FULL OUTER JOIN realiza una unión entre dos tablas que requiere una cláusula de unión explícita
pero no excluye filas no coincidentes en ninguna de las tablas. En otras palabras, devuelve todas
las filas en cada tabla.
Ejemplo:
SELECT
*
FROM
EMPLOYEE FULL OUTER JOIN DEPT
ON EMPLOYEE.DEPTNO = DEPT.DEPTNO;
+-----------+---------+
| NAME | DEPTNO |
+-----------+---------+
| A | 2 |
https://riptutorial.com/es/home 77
| B | 1 |
| C | 3 |
| D | 2 |
| E | 1 |
| F | 1 |
| G | 4 |
| H | 4 |
+-----------+---------+
+---------+--------------+
| DEPTNO | DEPTNAME |
+---------+--------------+
| 1 | ACCOUNTING |
| 2 | FINANCE |
| 5 | MARKETING |
| 6 | HR |
+---------+--------------+
SELECT
*
FROM
EMPLOYEE FULL OUTER JOIN DEPT
ON EMPLOYEE.DEPTNO = DEPT.DEPTNO;
Salida
+-----------+---------+---------+--------------+
| NAME | DEPTNO | DEPTNO | DEPTNAME |
+-----------+---------+---------+--------------+
| A | 2 | 2 | FINANCE |
| B | 1 | 1 | ACCOUNTING |
| C | 3 | | |
| D | 2 | 2 | FINANCE |
| E | 1 | 1 | ACCOUNTING |
| F | 1 | 1 | ACCOUNTING |
| G | 4 | | |
| H | 4 | | |
| | | 6 | HR |
| | | 5 | MARKETING |
+-----------+---------+---------+--------------+
Aniquilar
Un antijoin devuelve filas desde el lado izquierdo del predicado para el que no hay filas
correspondientes en el lado derecho del predicado. Devuelve las filas que no logran coincidir (NO
EN) con la subconsulta en el lado derecho.
https://riptutorial.com/es/home 78
WHERE department_id NOT IN
(SELECT department_id FROM departments
WHERE location_id = 1700)
ORDER BY last_name;
+-----------+---------+
| NAME | DEPTNO |
+-----------+---------+
| A | 2 |
| B | 1 |
| C | 3 |
| D | 2 |
| E | 1 |
| F | 1 |
| G | 4 |
| H | 4 |
+-----------+---------+
+---------+--------------+
| DEPTNO | DEPTNAME |
+---------+--------------+
| 1 | ACCOUNTING |
| 2 | FINANCE |
| 5 | MARKETING |
| 6 | HR |
+---------+--------------+
SELECT
*
FROM
EMPLOYEE WHERE DEPTNO NOT IN
(SELECT DEPTNO FROM DEPT);
Salida:
+-----------+---------+
| NAME | DEPTNO |
+-----------+---------+
| C | 3 |
| H | 4 |
| G | 4 |
+-----------+---------+
La salida muestra que solo las filas de la tabla EMPLOYEE, de las cuales DEPTNO no estaban
presentes en la tabla DEPT.
https://riptutorial.com/es/home 79
SEMIJOIN
Se puede usar una consulta de semijoin, por ejemplo, para encontrar todos los departamentos
con al menos un empleado cuyo salario exceda de 2500.
Esto es más eficiente que las alternativas de unión completa, ya que la unión interna de los
empleados y luego una cláusula donde se detalla que el salario debe ser superior a 2500 podría
devolver el mismo departamento varias veces. Diga si el departamento de Bomberos tiene n
empleados, todos con el salario 3000, select * from departments, employees con las inscripciones
necesarias en las identificaciones y nuestra cláusula de dónde devolvería el departamento de
Bomberos n veces.
UNIRSE
La operación JOIN realiza una unión entre dos tablas, excluyendo cualquier fila no coincidente de
la primera tabla. Desde Oracle 9i adelante, la función JOIN es equivalente en función a la INNER
JOIN . Esta operación requiere una cláusula de unión explícita, a diferencia de los operadores
CROSS JOIN y NATURAL JOIN .
Ejemplo:
select t1.*,
t2.DeptId
from table_1 t1
join table_2 t2 on t2.DeptNo = t1.DeptNo
Documentación de Oracle:
• 10g
• 11g
• 12g
Unirse natural
La unión natural no requiere una condición de unión explítica; construye uno basado en todos los
campos con el mismo nombre en las tablas unidas.
https://riptutorial.com/es/home 80
insert into tab2 values(3, 'three');
SQL> select *
2 from tab1
3 natural join
4 tab2;
ID DESCR
---------- ----------
3 three
SQL> select *
2 from (select id as id, descr as descr1 from tab1)
3 natural join
4 (select id as id, descr as descr2 from tab2);
ID DESCR1 DESCR2
---------- ---------- ----------
1 one ONE
3 three three
Si las tablas unidas no tienen columnas comunes, se realizará una ÚNETE sin condiciones:
SQL> select *
2 from (select id as id1, descr as descr1 from tab1)
3 natural join
4 (select id as id2, descr as descr2 from tab2);
https://riptutorial.com/es/home 81
Capítulo 29: Secuencias
Sintaxis
• CREAR SECUENCIA SCHEMA.SEQUENCE {INCREMENTO DE INTEGER | COMENZAR
CON INTEGER | MAXVALUE INTEGER | INTEGER NOMAXVALUE | MINVALUE INTEGER
| NOMINVALUE INTEGER | CICLO INTEGER | INTEGER DE CICLO | CACHE | NOCACHE
| ORDEN | NOODER}
Parámetros
Parámetro Detalles
nociciclo Defecto
nocache Defecto
Examples
Creando una secuencia: Ejemplo
Propósito
Utilice la instrucción CREATE SEQUENCE para crear una secuencia, que es un objeto de base
https://riptutorial.com/es/home 82
de datos desde el cual varios usuarios pueden generar enteros únicos. Puedes usar secuencias
para generar automáticamente valores de clave primaria.
Los números de secuencia se generan independientemente de las tablas, por lo que la misma
secuencia se puede usar para una o varias tablas. Es posible que los números de secuencia
individuales parezcan omitidos, ya que se generaron y usaron en una transacción que finalmente
se retrotrajo. Además, un solo usuario puede no darse cuenta de que otros usuarios están
dibujando desde la misma secuencia.
Después de crear una secuencia, puede acceder a sus valores en sentencias de SQL con la
pseudocolumna CURRVAL, que devuelve el valor actual de la secuencia, o la pseudocolumna
NEXTVAL, que incrementa la secuencia y devuelve el nuevo valor.
Prerrequisitos
Para crear una secuencia en su propio esquema, debe tener el privilegio del sistema CREATE
SEQUENCE.
Para crear una secuencia en el esquema de otro usuario, debe tener el privilegio del sistema
CREAR CUALQUIER SECUENCIA.
https://riptutorial.com/es/home 83
Capítulo 30: Seguridad de aplicación real
Introducción
Oracle Real Application Security se introdujo en Oracle 12c. Resume muchos temas de
seguridad, como el modelo de rol del usuario, el control de acceso, la aplicación frente a la base
de datos, la seguridad del usuario final o la seguridad a nivel de fila y columna.
Examples
Solicitud
Para asociar una aplicación con algo en la base de datos hay tres partes principales:
XS$PRIVILEGE(
name=>'privilege_name'
[, implied_priv_list=>XS$NAME_LIST('"SELECT"', '"INSERT"', '"UPDATE"', '"DELETE"')]
)
XS$PRIVILEGE_LIST(
XS$PRIVILEGE(...),
XS$PRIVILEGE(...),
...
);
Usuario de la aplicación:
BEGIN
SYS.XS_PRINCIPAL.CREATE_USER('user_name');
END;
BEGIN
SYS.XS_PRINCIPAL.CREATE_USER(name => 'user_name', schema => 'schema_name');
END;
BEGIN
SYS.XS_PRINCIPAL.SET_PASSWORD('user_name', 'password');
END;
CREATE PROFILE prof LIMIT
PASSWORD_REUSE_TIME 1/4440
PASSWORD_REUSE_MAX 3
PASSWORD_VERIFY_FUNCTION Verify_Pass;
https://riptutorial.com/es/home 84
BEGIN
SYS.XS_PRINCIPAL.SET_PROFILE('user_name', 'prof');
END;
BEGIN
SYS.XS_PRINCIPAL.GRANT_ROLES('user_name', 'XSONNCENT');
END;
(Opcional:)
BEGIN
SYS.XS_PRINCIPAL.SET_VERIFIER('user_name', '6DFF060084ECE67F', XS_PRINCIPAL.XS_SHA512“);
END;
Papel de la aplicación:
DECLARE
st_date TIMESTAMP WITH TIME ZONE;
ed_date TIMESTAMP WITH TIME ZONE;
BEGIN
st_date := SYSTIMESTAMP;
ed_date := TO_TIMESTAMP_TZ('2013-06-18 11:00:00 -5:00','YYYY-MM-DD HH:MI:SS');
SYS.XS_PRINCIPAL.CREATE_ROLE
(name => 'app_regular_role',
enabled => TRUE,
start_date => st_date,
end_date => ed_date);
END;
Rol de aplicación dinámica: (se habilita dinámicamente en función del estado de autenticación)
BEGIN
SYS.XS_PRINCIPAL.CREATE_DYNAMIC_ROLE
(name => 'app_dynamic_role',
duration => 40,
scope => XS_PRINCIPAL.SESSION_SCOPE);
END;
Regular:
• XSPUBLIC
• XSBYPASS
• XSSESSIONADMIN
• XSNAMESPACEADMIN
• XSPROVISIONER
• XSCACHEADMIN
• XSDISPATCHER
https://riptutorial.com/es/home 85
• DBMS_AUTH : (inicio de sesión directo u otro método de autenticación de base de datos)
• EXTERNAL_DBMS_AUTH : (inicio de sesión directo u otro método de autenticación de base de
datos y el usuario es externo)
• DBMS_PASSWD : (inicio de sesión directo con contraseña)
• MIDTIER_AUTH : (autenticación a través de la aplicación de nivel medio)
• XSAUTHENTICATED : (aplicación de nivel directo o medio)
• XSSWITCH : (usuario cambiado de usuario proxy a usuario de aplicación)
https://riptutorial.com/es/home 86
Capítulo 31: SQL dinámico
Introducción
SQL dinámico le permite ensamblar un código de consulta SQL en el tiempo de ejecución. Esta
técnica tiene algunas desventajas y debe ser usada muy cuidadosamente. Al mismo tiempo, le
permite implementar una lógica más compleja. PL / SQL requiere que todos los objetos, utilizados
en el código, tengan que existir y ser válidos en el momento de la compilación. Es por eso que no
puede ejecutar sentencias DDL en PL / SQL directamente, pero SQL dinámico le permite hacer
eso.
Observaciones
Algunas observaciones importantes:
1. Nunca use la concatenación de cadenas para agregar valores a la consulta, use parámetros
en su lugar. Esto está mal:
Y esto es correcto:
execute immediate 'update my_table set value = ''I have bad news for you'' where id = '
|| id;
La segunda razón es el rendimiento. Oracle analizará la consulta sin parámetros cada vez
que se ejecute, mientras que la consulta con el parámetro se analizará solo una vez en la
sesión.
2. Tenga en cuenta que cuando el motor de base de datos ejecuta una sentencia DDL, ejecuta
un compromiso implícito antes.
Examples
Seleccionar valor con SQL dinámico
Digamos que un usuario quiere seleccionar datos de diferentes tablas. Una tabla es especificada
https://riptutorial.com/es/home 87
por el usuario.
declare
table_name varchar2(30) := 'my_table';
id number := 1;
begin
dbms_output.put_line(get_value(table_name, id));
end;
Tabla a probar:
declare
query_text varchar2(1000) := 'insert into my_table(id, column_value) values (:P_ID,
:P_VAL)';
id number := 2;
value varchar2(100) := 'Bonjour!';
begin
execute immediate query_text using id, value;
end;
/
declare
query_text varchar2(1000) := 'update my_table set column_value = :P_VAL where id = :P_ID';
id number := 2;
value varchar2(100) := 'Bonjour le monde!';
begin
execute immediate query_text using value, id;
end;
/
https://riptutorial.com/es/home 88
Este código crea la tabla:
begin
execute immediate 'create table my_table (id number, column_value varchar2(100))';
end;
/
Puede ejecutar bloque anónimo. Este ejemplo muestra también cómo devolver valor desde SQL
dinámico:
declare
query_text varchar2(1000) := 'begin :P_OUT := cos(:P_IN); end;';
in_value number := 0;
out_value number;
begin
execute immediate query_text using out out_value, in in_value;
dbms_output.put_line('Result of anonymous block: ' || to_char(out_value));
end;
/
https://riptutorial.com/es/home 89
Capítulo 32: Trabajando con fechas
Examples
Fecha aritmética
Oracle admite los tipos de datos DATE (incluye el tiempo al segundo más cercano) y TIMESTAMP
(incluye el tiempo a fracciones de un segundo), lo que permite la aritmética (suma y resta) de
forma nativa. Por ejemplo:
Para seleccionar filas en las que hire_date sea hace 30 días o más:
Oracle también proporciona el INTERVAL tipo de datos incorporado, que representa una duración de
https://riptutorial.com/es/home 90
tiempo (por ejemplo, 1,5 días, 36 horas, 2 meses, etc.). También se pueden usar con aritmética
con expresiones DATE y TIMESTAMP . Por ejemplo:
select * from logfile where last_updated >= sysdate - interval '1' hour;
Función Add_months
METRO
2015-03-12
METRO
2014-11-12
Cuando el mes calculado tenga menos días como la fecha dada, se devolverá el último día del
mes calculado.
METRO
2015-02-28
https://riptutorial.com/es/home 91
Capítulo 33: Transacciones Autónomas
Observaciones
Los casos típicos de uso para transacciones autónomas son.
1. Para crear cualquier tipo de marco de registro como el marco de registro de errores
explicado en el ejemplo anterior.
2. Para auditar operaciones DML en disparadores en tablas, independientemente del estado
final de la transacción (COMPROMISO o ROLLBACK).
Examples
Uso de transacciones autónomas para errores de registro
El siguiente procedimiento es genérico y se utilizará para registrar todos los errores en una
aplicación en una tabla de registro de errores común.
BEGIN
DELETE FROM dept WHERE deptno = 10;
EXCEPTION
WHEN OTHERS THEN
log_errors('Delete dept',sqlcode, sqlerrm);
RAISE;
END;
https://riptutorial.com/es/home 92
CALLING_PROGRAM ERROR_CODE ERROR_DESCRIPTION
ERROR_DATETIME DB_USER
Delete dept -2292 ORA-02292: integrity constraint violated - child record found
08/09/2016 APEX_PUBLIC_USER
https://riptutorial.com/es/home 93
Creditos
S.
Capítulos Contributors
No
Actualizar con
2 mathguy
uniones
Bloque PL / SQL
3 Jon Heller, Skynet, Zohar Elkayam
anónimo
Delimitando palabras
8 clave o caracteres dev
especiales
Diferentes formas de
10 nimour pristou, Nogueira Jr, SriniV
actualizar registros.
División de cadenas
11 Arkadiusz Łukasiewicz, MT0
delimitadas
Enlaces de base de
12 carlosb, Daniel Langemann, g00dy, kasi
datos
Factoraje de
subconsultas
recursivas utilizando
13 B Samedi, MT0
la cláusula WITH
(expresiones de
tabla comunes AKA)
https://riptutorial.com/es/home 94
ventana
Funciones
16 Evgeniy K., Matas Vaitkevicius, ppeterka, Pranav Shah
estadisticas
17 Índices smshafiqulislam
Manejo de valores
19 Dalex, JeromeFr
nulos
Oracle Advanced
22 Jon Theriault
Queuing (AQ)
Recuperación
jerárquica con
25 Muntasir, Vahid
Oracle Database
12C
27 restricciones SSD
Seguridad de
30 Ben H
aplicación real
Trabajando con David Aldridge, Florin Ghita, Jeffrey Kemp, Mark Stewart,
32
fechas tonirush, zygimantus
https://riptutorial.com/es/home 95
Transacciones
33 phonetic_man
Autónomas
https://riptutorial.com/es/home 96