You are on page 1of 3

Compilacin Nativa

Introduccin
En versiones anteriores a Oracle 9i , todas las unidades de programa almacenados PL/SQL son compiladas a P-Code (precompiled code machine). El resultado del P-Code se almacena en la base de datos y es interpretado en tiempo de ejecucin. Una de sus principales ventajas es la portabilidad del cdigo, sin embargo su rendimiento es psimo ya que la ejecucin es lenta; La interpretacin del leguaje es por lo general ms lento que la compilacin del leguaje en su forma nativa. Como una mejora del rendimiento, Oracle9i proporciona la capacidad de compilar el cdigo PL/SQL de forma nativa en libreras compartidas. Estas libreras compartidas se cargan y ejecutan cada vez que la correspondiente unidad de programa PL/SQL es invocada en tiempo de ejecucin. La compilacin nativa de PL/SQL, una vez que se ha configurado correctamente, es transparente tanto para el usuario que compila la unidad de programa en PL/SQL como para el usuario final que invoca a esa misma unidad de programa. Oracle genera el cdigo C correspondiente al cdigo PL/SQL, lo compila y enlaza con el cdigo C resultante dentro de las libreras compartidas. Por tanto, es necesario que el compilador de C est instalado en la misma mquina donde vayamos a trabajar con la compilacin nativa. La siguiente seccin describe los parmetros de inicializacin que se utiliza para configurar la compilacin nativa de PL/SQL. Las secciones posteriores hablan de cuando usar la compilacin nativa.

Parmetros de inicializacin relacionados con la compilacin nativa de PL/SQL.


plsql_code_type Determina si el cdigo PL/SQL se compila de forma nativa o interpretada, y si la informacin de depuracin est incluida. Este parmetro es configurable, tanto a nivel del sistema como de sesin. Los valores posibles son: 'INTERPRETED' - compilacin en modo interpretado. 'NATIVE' - compilacin en modo nativo. 'DEBUG' - incluye informacin de depuracin. 'NON_DEBUG' - no hay informacin de depuracin. Valores por defecto son: 'INTERPRETED','NON_DEBUG' Ejemplos: alter session set plsql_code_type='NATIVE'; alter session set plsql_code_type='INTERPRETED', 'DEBUG';

Combinaciones no permitidas: 'NATIVE','INTERPRETED'- por razones obvias 'DEBUG' ,'NON_DEBUG' - por razones obvias 'NATIVE','DEBUG' - la depuracin de forma nativa compilado PL/SQL an no est soportada. Este parmetro slo afecta a las unidades de programa PL/SQL que explcitamente hayan sido compiladas despus de establecer el parmetro. plsql_native_library_dir Determina el nombre del directorio utilizado para almacenar las libreras compartidas que contienen el cdigo PL/SQL compilado de forma nativa. Este parmetro es configurable slo a nivel del sistema. Este parmetro es obligatorio si plsql_code_type='NATIVE'. El usuario 'oracle' debe tener permisos de escritura en este directorio y restringir el acceso al resto de usuarios que no sean 'oracle' o ' root ' por seguridad. El directorio que se especifica tiene que existir. Oracle no crea el directorio. No hay valor por defecto, este parmetro se debe establecer de forma explcita. Ejemplos: alter system set plsql_native_library_dir='/home/oracle/plsql_libs';

Ejercicio: connect alumno/alumno CREATE OR REPLACE FUNCTION fib (n POSITIVE) RETURN INTEGER IS BEGIN IF (n = 1) OR (n = 2) THEN RETURN 1; ELSE RETURN fib(n - 1) + fib(n - 2); END IF; END fib; /

connect / as sysdba alter system flush shared_pool; alter system set plsql_native_library_dir='/home/oracle/native10g' scope=both; connect alumno/alumno alter session set plsql_code_type = 'INTERPRETED'; alter function fib compile; select object_name,param_name,param_value from user_stored_settings where object_name = 'FIB'; set serveroutput on set timing on declare x number; begin x := fib(40); dbms_output.put_line(x); end; / set timing off connect / as sysdba alter system flush shared_pool; connect testcase/manager alter session set plsql_code_type = 'NATIVE'; alter function fib compile; select object_name,param_name,param_value from user_stored_settings where object_name = 'FIB'; set serveroutput on set timing on declare x number; begin x := fib(40); dbms_output.put_line(x); end; / set timing off Salida del ejercicio: INTERPETED Elapsed: 00:06:07.96 NATIVE Elapsed: 00:03:35.74