Professional Documents
Culture Documents
1
2015 Servicio de Base de Datos.
2
2015 Servicio de Base de Datos.
3
2015 Servicio de Base de Datos.
END;
/
*
ERROR en lnea 2:
ORA-06550: lnea 2, columna 20:
PLS-00218: una variable declarada como NOT NULL deben tener una asignacin de
inicializacin
SQL>
DECLARE
l_simple_integer SIMPLE_INTEGER: = 0;
INICIO
l_simple_integer: = NULL;
END;
/
*
ERROR en la lnea 4:
ORA-06550: lnea 4, columna 23:
PLS-00382: la expresin es de tipo incorrecto
ORA-06550: lnea 4, columna 3:
PL / SQL: Instruccin omite
SQL>
La eliminacin de desbordamiento y el resultado NULL comprobacin en una reduccin significativa en los
gastos generales en comparacin con PLS_INTEGER .
CONTINUAR Declaracin
El CONTINUE saltos declaracin de la iteracin de bucle de corriente y empieza el siguiente. Se puede
utilizar por s mismo, o como parte de un CONTINUE WHEN la declaracin, como se muestra a continuacin.
JUEGO DE serveroutput
DECLARE
NMERO l_number: = 0;
INICIO
For i in 1 .. 100 LOOP
Continuar cuando MOD (i, 2) = 0;
- Hacer algo aqu!
l_number: = l_number + 1;
END LOOP;
DBMS_OUTPUT.PUT_LINE ("continuar cuando: '| | l_number);
l_number: = 0;
For i in 1 .. 100 LOOP
SI MOD (i, 2) = 0 THEN
CONTINUE;
END IF;
- Hacer algo aqu!
l_number: = l_number + 1;
END LOOP;
DBMS_OUTPUT.PUT_LINE ("SI .. CONTINUAR: '| | l_number);
END;
4
2015 Servicio de Base de Datos.
/
Continuar cuando: 50
SI .. CONTINUAR: 50
PL / SQL terminado con xito.
SQL>
Este tipo de proceso siempre ha sido posible utilizando IF declaraciones ya sea por su propia cuenta o con
las excepciones o GOTO declaraciones, pero la CONTINUE declaracin es ms claro y trae PL / SQL en lnea
con langauges otros. Los siguientes ejemplos muestran el tipo de cdigo necesario para realizar la misma
tarea antes de la CONTINUE sentencia se aadi a PL / SQL.
JUEGO DE serveroutput
DECLARE
ex_continue excepcin;
NMERO l_number: = 0;
INICIO
For i in 1 .. 100 LOOP
INICIO
SI MOD (i, 2)! = 0 THEN
RAISE ex_continue;
END IF;
- Hacer algo aqu!
l_number: = l_number + 1;
EXCEPCIN
CUANDO ENTONCES ex_continue
NULL;
END;
END LOOP;
DBMS_OUTPUT.PUT_LINE ("Excepcin: '| | l_number);
l_number: = 0;
For i in 1 .. 100 LOOP
SI MOD (i, 2)! = 0 THEN
- Hacer algo aqu!
l_number: = l_number + 1;
END IF;
END LOOP;
DBMS_OUTPUT.PUT_LINE ("SI: '| | l_number);
l_number: = 0;
For i in 1 .. 100 LOOP
SI MOD (i, 2) = 0 THEN
GOTO label_continue;
END IF;
- Hacer algo aqu!
l_number: = l_number + 1;
<<Label_continue>>
NULL;
5
2015 Servicio de Base de Datos.
END LOOP;
DBMS_OUTPUT.PUT_LINE ("GOTO: '| | l_number);
END;
/
EXCEPCIN: 50
SI: 50
GOTO: 50
PL / SQL terminado con xito.
SQL>
6
2015 Servicio de Base de Datos.
7
2015 Servicio de Base de Datos.
Generalizada Invocacin
Generalizada invocacin permite un subtipo para invocar un mtodo de un tipo primario (supertipo) con la
siguiente sintaxis.
(AUTO COMO supertype_name). Method_name
El siguiente ejemplo muestra esto en accin.
En primer lugar, crear un tipo con algunos atributos y una funcin miembro.
CREAR O CAMBIAR TIPO my_type como objeto (
nmero de identificacin,
Descripcin VARCHAR2 (50),
Show_attributes funciones miembro RETORNO VARCHAR2)
NO FINAL;
/
CREAR O CAMBIAR my_type tipo de cuerpo como
Show_attributes funciones miembro RETORNO VARCHAR2 IS
INICIO
RETURN 'id =' | | Identificacin | | 'descripcin =' | | descripcin;
8
2015 Servicio de Base de Datos.
END;
END;
/
A continuacin, crear un subtipo de este objeto, lo que aade un nuevo atributo y mtodo, as como anular
la show_attributes funcin miembro.
CREAR O CAMBIAR my_subtype tipo bajo my_type (
short_desc VARCHAR2 (10),
ABSOLUTA show_attributes funcin miembro RETORNO VARCHAR2,
Show_parent_attributes funciones miembro RETORNO VARCHAR2);
/
CREAR O CAMBIAR my_subtype tipo de cuerpo como
ABSOLUTA show_attributes miembro de devolucin de funciones VARCHAR2 IS
INICIO
RETURN (yo como my_type) show_attributes | | 'short_desc =' | |
short_desc.;
END;
Show_parent_attributes funciones miembro RETORNO VARCHAR2 IS
INICIO
RETURN (yo como my_type) show_attributes.;
END;
END;
/
Observe el mtodo del tipo de padres que se accede utilizando la sintaxis de invocacin generalizada. El
cdigo siguiente crea un subtipo, y llama a sus funciones miembro.
JUEGO DE serveroutput
DECLARE
my_subtype l_subtype: = my_subtype (1, 'Descripcin extensa para el 1', 'S
descripcin 1');
INICIO
DBMS_OUTPUT.PUT_LINE ("show_attributes = '| | l_subtype.show_attributes);
DBMS_OUTPUT.PUT_LINE ("show_parent_attributes = '| |
l_subtype.show_parent_attributes);
END;
/
show_attributes = id = 1 Descripcin descripcin = largo por 1 short_desc Desc
= S 1
show_parent_attributes = id = 1 = Descripcin detallada descripcin de un
PL / SQL terminado con xito.
SQL>
Un tipo se puede invocar a las funciones de miembro de cualquier tipo primario de esta manera,
independientemente de la profundidad de la herencia.
9
2015 Servicio de Base de Datos.
10
2015 Servicio de Base de Datos.
Estas pruebas utilizan un bloque annimo con una funcin definida en el bloque de declaraciones. La
funcin se llama repetidamente en un bucle. Los ajustes para PLSQL_OPTIMIZE_LEVEL y
el INLINEpragma son alterados para cambiar subprograma procesos en lnea y fuera. En primer lugar, nos
aseguramos de PLSQL_OPTIMIZE_LEVEL=2 y ejecutar el cdigo sin INLINE conjunto pragma. Con estos
ajustes, no podemos esperar para ver subprograma inline llevando a cabo.
ALTER SET SESSION PLSQL_OPTIMIZE_LEVEL = 2;
JUEGO DE serveroutput
DECLARE
NMERO l_loops: = 10000000;
l_start nmero;
l_return nmero;
Add_numbers FUNCIN (p_1 en nmero,
p_2 en nmero)
Devuelve el nmero AS
INICIO
RETORNO p_1 + p_2;
Add_numbers END;
INICIO
l_start: DBMS_UTILITY.get_time =;
For i in 1 .. l_loops LOOP
- PRAGMA en lnea (add_numbers, 'YES');
l_return: = add_numbers (1, i);
END LOOP;
DBMS_OUTPUT.PUT_LINE ("Tiempo transcurrido: '| | (DBMS_UTILITY.get_time l_start) | |' hsecs ');
END;
/
Tiempo transcurrido: 509 hsecs
PL / SQL terminado con xito.
SQL>
Esto se traduce en un lapso de tiempo de 509 hsecs.
A continuacin, mantenga la configuracin de la optimizacin de lo mismo, pero incluyen la INLINE pragma
con un ajuste de "S" para las llamadas a la ADD_NUMBERS funcin. Ahora se espera subprograma procesos
en lnea para tomar su lugar.
ALTER SET SESSION PLSQL_OPTIMIZE_LEVEL = 2;
JUEGO DE serveroutput
DECLARE
NMERO l_loops: = 10000000;
l_start nmero;
l_return nmero;
Add_numbers FUNCIN (p_1 en nmero,
p_2 en nmero)
Devuelve el nmero AS
INICIO
RETORNO p_1 + p_2;
Add_numbers END;
11
2015 Servicio de Base de Datos.
INICIO
l_start: DBMS_UTILITY.get_time =;
For i in 1 .. l_loops LOOP
PRAGMA en lnea (add_numbers, 'YES');
l_return: = add_numbers (1, i);
END LOOP;
DBMS_OUTPUT.PUT_LINE ("Tiempo transcurrido: '| | (DBMS_UTILITY.get_time l_start) | |' hsecs ');
END;
/
Tiempo transcurrido: 245 hsecs
PL / SQL terminado con xito.
SQL>
Esto le da un tiempo transcurrido de 245 HSEC, que es aproximadamente la mitad de la prueba anterior, lo
que implica que inline subprograma est llevando a cabo.
A continuacin, asegrese de que PLSQL_OPTIMIZE_LEVEL=3 y ejecutar el cdigo sin INLINE conjunto
pragma. Ahora se espera que el optimizador elija implcitamente a la lnea ADD_NUMBERS llamada.
ALTER SET SESSION PLSQL_OPTIMIZE_LEVEL = 3;
JUEGO DE serveroutput
DECLARE
NMERO l_loops: = 10000000;
l_start nmero;
l_return nmero;
Add_numbers FUNCIN (p_1 en nmero,
p_2 en nmero)
Devuelve el nmero AS
INICIO
RETORNO p_1 + p_2;
Add_numbers END;
INICIO
l_start: DBMS_UTILITY.get_time =;
For i in 1 .. l_loops LOOP
- PRAGMA en lnea (add_numbers, 'YES');
l_return: = add_numbers (1, i);
END LOOP;
DBMS_OUTPUT.PUT_LINE ("Tiempo transcurrido: '| | (DBMS_UTILITY.get_time l_start) | |' hsecs ');
END;
/
Tiempo transcurrido: 245 hsecs
PL / SQL terminado con xito.
SQL>
Esto le da un tiempo transcurrido de 245 HSEC, lo que implica que inline subprograma est an en marcha.
12
2015 Servicio de Base de Datos.
Por ltimo, nos aseguramos de PLSQL_OPTIMIZE_LEVEL=3 y ejecutar el cdigo con un INLINE pragma
en "NO". Es de esperar que no haya procesos en lnea de la ADD_NUMBERS llame ahora.
ALTER SET SESSION PLSQL_OPTIMIZE_LEVEL = 3;
JUEGO DE serveroutput
DECLARE
NMERO l_loops: = 10000000;
l_start nmero;
l_return nmero;
Add_numbers FUNCIN (p_1 en nmero,
p_2 en nmero)
Devuelve el nmero AS
INICIO
RETORNO p_1 + p_2;
Add_numbers END;
INICIO
l_start: DBMS_UTILITY.get_time =;
For i in 1 .. l_loops LOOP
PRAGMA en lnea (add_numbers, 'NO');
l_return: = add_numbers (1, i);
END LOOP;
DBMS_OUTPUT.PUT_LINE ("Tiempo transcurrido: '| | (DBMS_UTILITY.get_time l_start) | |' hsecs ');
END;
/
Tiempo transcurrido: 500 hsecs
PL / SQL terminado con xito.
SQL>
Esto le da un tiempo transcurrido de 500 hsecs, lo que implica que inline no se llev a cabo como se
esperaba.
El INLINE pragma slo afecta a los siguientes tipos de declaraciones.
Asignacin
Llamar
Condicional
CASE
CONTINUE-WHEN
EXECUTE IMMEDIATE
EXIT-WHEN
LOOP
13
2015 Servicio de Base de Datos.
RETURN
PL / mbito de aplicacin
PL / Scope es una herramienta que recoge informacin acerca de los identificadores definidos por el usuario
en tiempo de compilacin. La recopilacin de datos PL / mbito de aplicacin es controlada por
elPLSCOPE_SETTINGS parmetro, que tiene un valor predeterminado de " IDENTIFIERS:NONE ". Cambiar
este valor a " IDENTIFIERS:ALL "para permitir la recopilacin.
SQL> ALTER SESIN "IDENTIFICADORES: ALL 'PLSCOPE_SETTINGS =;
Sesin alterado.
SQL>
La recoleccin de datos se realiza para todos los objetos compilados despus de la bandera es definida, por
lo que ahora debe crear un objeto de reunir algunos datos.
CREAR O CAMBIAR test_plscope PROCEDIMIENTO (p_in EN nmero)
l_var nmero;
INICIO
l_var: = p_in;
l_var: = l_var + 1;
END;
/
Los datos se almacenan en el espacio de tablas SYSAUX, por lo que el espacio actual utilizado para PL /
mbito de datos se pueden visualizar con la siguiente consulta.
SELECCIONAR space_usage_kbytes
DESDE $ v sysaux_occupants
DONDE occupant_name = 'PL / SCOPE;
SPACE_USAGE_KBYTES
-----------------384
Una fila seleccionada.
SQL>
Los datos de PL / mbito de aplicacin est disponible en el _IDENTIFIERS% puntos de vista. La consulta
siguiente muestra los datos recopilados durante la elaboracin del test_plscope procedimiento.
COLUMNA FORMATO nombre A30
SELECCIONAR LPAD ('', nivel * 2, '') | | nombre como nombre, tipo, uso,
usage_id, lnea, columna
DE user_identifiers
EMPIECE CON usage_context_id = 0
ANTES DE CONECTAR POR usage_id = usage_context_id;
14
2015 Servicio de Base de Datos.
En estas versiones de la base de datos, el cdigo PL / SQL se convierte en cdigo C, compilar y ejecutar los
procedimientos externos. Compilados de forma nativa utilizando PL / SQL es necesario un compilador de C
en el servidor y la intervencin del DBA. Adems, con compilados de forma nativa PL / SQL en un entorno
RAC puede ser problemtico.
En Oracle 11g, PL / SQL compilacin como nativo no requiere compilador de C, sin intervencin del DBA y
es totalmente compatible en un entorno RAC. Al establecer la PLSQL_CODE_TYPE a un valor deNATIVE ,
ms que el valor predeterminado de INTERPRETED , el cdigo es compilado en cdigo mquina y se
almacena en el tablespace SYSTEM. Cuando el cdigo se llama, se carga en la memoria compartida, por lo
que es accesible para todas las sesiones de esa instancia. El %_PLSQL_OBJECT_SETTINGS vistas incluyen
la corriente PLSQL_CODE_TYPE ajuste para cada objeto de PL / SQL.
Recuerde, la compilacin nativa mejorar la velocidad de cdigo de procedimiento, pero no tiene efecto
sobre el rendimiento de SQL. Cuando el cdigo lleva a cabo muchas operaciones matemticas, como
elSIMPLE_INTEGER ejemplo, la compilacin nativa puede producir considerables mejoras de
rendimiento. Si el cdigo es predominantemente realizar SQL, poca mejora se notar.
Al igual que con versiones anteriores de base de datos, es posible compilar de forma nativa todo el cdigo
PL / SQL en la base de datos, siempre y cuando siga el procedimiento de apoyo .
Un nuevo PL / SQL advertencia del compilador ha sido aadido a identificar WHEN OTHERS manejadores de
excepciones que no hacen re-raise errores usando RAISE o RAISE_APPLICATION_ERROR .Manipuladores
de tal excepcin a menudo puede ocultar los fracasos de cdigo que generan difcil de identificar los
errores. El siguiente ejemplo muestra la advertencia del compilador espera que cuando
elPLSQL_WARNINGS bandera est activa.
SQL> ALTER SESIN plsql_warnings = SET "permite: todos;
Sesin alterado.
SQL> CREATE OR REPLACE others_test PROCEDIMIENTO AS
2 EMPEZAR
3 RAISE_APPLICATION_ERROR (-20000, 'Fuerza y de excepcin');
4 EXCEPCIN
5 CUANDO OTROS ENTONCES
6 NULL;
7 END;
8 /
SP2-0804: Procedimiento creado con advertencias de compilacin
SQL> SHOW ERRORES
Los errores de OTHERS_TEST PROCEDIMIENTO:
Line / Error COL
-------- ------------------------------------------ ----------------------5.8 PLW-06009: Procedimiento "OTHERS_TEST" manejador de los dems no terminan
en
Suba o RAISE_APPLICATION_ERROR
SQL>
Esto es slo un mensaje de advertencia, por lo que slo identifica el cdigo posible problema, no la impide.
forall_test
forall_test
forall_test
forall_test
forall_test
VALUES
VALUES
VALUES
VALUES
VALUES
(1,
(2,
(3,
(4,
(5,
'uno');
'dos');
'tres');
'cuatro');
'cinco');
El bloque de PL / SQL a continuacin rellena una coleccin con los datos existentes, que modifica los datos
de la coleccin, a continuacin, actualiza la tabla con los datos modificados. La consulta final muestra los
datos modificados en la tabla.
DECLARE
TIPO ES t_forall_test_tab TABLA DE ROWTYPE forall_test%;
l_tab t_forall_test_tab;
16
2015 Servicio de Base de Datos.
INICIO
- Recuperar los datos existentes en una coleccin.
SELECT *
A GRANEL EN RECOGER l_tab
DE forall_test;
- Modificar los datos de la coleccin.
For i in l_tab.first .. l_tab.last LOOP
l_tab (i) Descripcin: = 'Descripcin para' | | i;.
END LOOP;
- Actualizacin de la tabla utilizando la coleccin.
ParaTodos i EN l_tab.first .. l_tab.last
ACTUALIZACIN forall_test
Descripcin SET = l_tab (i). Descripcin
WHERE id = l_tab (i) Identificacin.;
COMMIT;
END;
/
SELECT * FROM forall_test;
ID
---------1
2
3
4
5
DESCRIPCIN
--------------------------Descripcin de una
Descripcin de dos
Descripcin de tres
Descripcin de 4
Descripcin de 5
5 filas seleccionadas.
SQL>
Notificacin tanto en el SET y WHERE clusulas contienen referencias a columnas individuales de la
coleccin. Esto hace que el uso a granel-se une a DML an ms fcil ya que no es necesario para mantener
las colecciones mltiples si es necesario hacer referencia a las columnas de la WHERE clusula. Tambin
puede mejorar el rendimiento de las actualizaciones, como las versiones anteriores requiere la actualizacin
de toda la fila con el ROW palabra clave, que incluyen cambios potencialmente innecesario de la clave
principal y las columnas de clave
17
2015 Servicio de Base de Datos.
18
2015 Servicio de Base de Datos.
19
2015 Servicio de Base de Datos.
20
2015 Servicio de Base de Datos.
Tipos deINSERT
Los diferentes tipos de INSERT mltitablas son:
Incondicional INSERT
Condicional INSERT ALL
Pivoteado INSERT
Condicional INSERT FIRST
conditional_insert_clause:
[ALL] [FIRST]
[WHEN condition THEN] [insert_into_clause values_clause]
[ELSE] [insert_into_clause values_clause]
21
2015 Servicio de Base de Datos.
22
2015 Servicio de Base de Datos.
23
2015 Servicio de Base de Datos.
Declaracin MERGE
Usted puede condicionalmente hacer un insert, una actualizacin o un borrado de registros en una tabla,
utilizando MERGE.
24
2015 Servicio de Base de Datos.
25
2015 Servicio de Base de Datos.
26
2015 Servicio de Base de Datos.
ndices virtuales
El proceso de afinamiento de instrucciones SQL, requiere que de manera alterna, podamos definir
estrategias de indexacin, para observar su efecto en los planes de ejecucin.
Crear ndices adicionales, no es el problema.
El problema es, que crear ndices extras sobre tablas grandes, puede tomar un monto considerado de
tiempo y espacio en disco. Adicionalmente, los ndices creados pueden ser utilizados por otras sesiones de
usuarios y podra afectar el rendimiento en otras partes de la aplicacin. Esto puede ser problemtico
cuando estamos intentando identificar el problema en un sistema en produccin.
En contraste a los ndices convencionales, los ndices virtuales no estn asociados a un segmento,
el tiempo de creacin y el espacio asociado en disco es irrelevante. Adicionalmente, no pueden ser vistos
por otras sesiones, por tanto, no se ve afectado el normal funcionamiento del sistema.
Este clase muestra de manera sencilla como utilizarlos y las consideraciones que debemos tener en
cuenta.
Columnas Virtuales
Triggers - caros
Vistas- a veces se olvidan
Re-diseo Mucho trabajo duro!
27
2015 Servicio de Base de Datos.