jueves, 8 de diciembre de 2016

SQL%FOUND


Atributo booleano que se evalúa como TRUE si la última sentencia SQL afectó al menos una fila.

Puede probar el SQL%ROWCOUNT , SQL%FOUND , y atributos de SQL%NOTFOUND en la sección ejecutable de un bloque para recoger información después se ejecuta el comando apropiados DML. PL / SQL no devuelve un error si una sentencia DML no afecta a las filas de la tabla subyacente. Sin embargo, si una sentencia SELECT no recupera ninguna fila, PL / SQL devuelve una excepción.

Observe que los atributos tienen el prefijo SQL. Estos atributos del cursor se utilizan con los cursores implícitos que son creados automáticamente por PL / SQL y para los que no saben los nombres. Por lo tanto, se utiliza SQL en lugar del nombre del cursor.

El atributo SQL%NOTFOUND es lo contrario de SQL%NOTFOUND . Este atributo puede ser utilizado como la condición de salida en un bucle. Es útil en UPDATE y DELETE cuando se cambian ninguna fila porque excepciones no se devuelven en estos casos.
Usted aprenderá acerca de cursor explícito atributos en la lección titulada "Uso de los cursores explícitos".

Ejemplo:

DECLARE

CURSOR C_EMP IS
SELECT LAST_NAME
FROM HR.EMPLOYEES
WHERE EMPLOYEE_ID = 100;

V_EMP VARCHAR2(30);

BEGIN

OPEN C_EMP ;
FECTH C_EMP
INTO V_EMP;

IF C_EMP%FOUND THEN

--ALGO

END IF;

CLOSE C_EMP;


END;
Share:

SQL%NOTFOUND


Atributo booleano que se evalúa como TRUE si La última sentencia SQL no afectó incluso una fila.

Puede probar el SQL%ROWCOUNT , SQL%FOUND , y atributos de SQL%NOTFOUND en la sección ejecutable de un bloque para recoger información después se ejecuta el comando apropiados DML. PL / SQL no devuelve un error si una sentencia DML no afecta a las filas de la tabla subyacente. Sin embargo, si una sentencia SELECT no recupera ninguna fila, PL / SQL devuelve una excepción.

Observe que los atributos tienen el prefijo SQL. Estos atributos del cursor se utilizan con los cursores implícitos que son creados automáticamente por PL / SQL y para los que no saben los nombres. Por lo tanto, se utiliza SQL en lugar del nombre del cursor.

El atributo SQL%NOTFOUND es lo contrario de SQL%NOTFOUND . Este atributo puede ser utilizado como la condición de salida en un bucle. Es útil en UPDATE y DELETE cuando se cambian ninguna fila porque excepciones no se devuelven en estos casos.
Usted aprenderá acerca de cursor explícito atributos en la lección titulada "Uso de los cursores explícitos".

Ejemplo:

DECLARE

CURSOR C_EMP IS
SELECT LAST_NAME
FROM HR.EMPLOYEES
WHERE EMPLOYEE_ID = 100;

V_EMP VARCHAR2(30);

BEGIN

OPEN C_EMP ;
FECTH C_EMP
INTO V_EMP;

IF C_EMP%NOTFOUND THEN

--ALGO

END IF;

CLOSE C_EMP;


END;
Share:

SQL%ROWCOUNT


Un valor entero que representa el número de filas afectadas por la última sentencia SQL.

Puede probar el SQL%ROWCOUNT , SQL%FOUND , y atributos de SQL%NOTFOUND en la sección ejecutable de un bloque para recoger información después se ejecuta el comando apropiados DML. PL / SQL no devuelve un error si una sentencia DML no afecta a las filas de la tabla subyacente. Sin embargo, si una sentencia SELECT no recupera ninguna fila, PL / SQL devuelve una excepción.

Observe que los atributos tienen el prefijo SQL. Estos atributos del cursor se utilizan con los cursores implícitos que son creados automáticamente por PL / SQL y para los que no saben los nombres. Por lo tanto, se utiliza SQL en lugar del nombre del cursor.

El atributo SQL%NOTFOUND es lo contrario de SQL%NOTFOUND . Este atributo puede ser utilizado como la condición de salida en un bucle. Es útil en UPDATE y DELETE cuando se cambian ninguna fila porque excepciones no se devuelven en estos casos.
Usted aprenderá acerca de cursor explícito atributos en la lección titulada "Uso de los cursores explícitos".

DECLARE
  v_rows_deleted VARCHAR2(30)
  v_empno employees.employee_id%TYPE := 176;
BEGIN

  DELETE FROM  employees
  WHERE employee_id = v_empno;
  v_rows_deleted := (SQL%ROWCOUNT ||
                       ' row deleted.');
  DBMS_OUTPUT.PUT_LINE (v_rows_deleted);

END;

El ejemplo elimina una fila con employee_id 176 de la tabla de empleados. Usando el atributo% ROWCOUNT SQL, puede imprimir el número de registros borrados.

Share:

CURSORES

Un cursor es un puntero a la zona de memoria privada asignada por el servidor Oracle. Se utiliza para manejar el conjunto de resultados de una sentencia SELECT.

Hay dos tipos de cursores: implícitos y explícitos.

  1. Implícito: Creado y gestionado internamente por el servidor Oracle para procesar sentencias SQL
  2. Explícita: Declarado explícitamente por el programador


Usted ya ha aprendido que puede incluir sentencias SQL que devuelven una sola fila en un bloque PL/SQL. Los datos recuperados por la sentencia SQL deberían celebrarse en las variables mediante la cláusula INTO.

De dónde viene el proceso de declaraciones de SQL Server Oracle?
El servidor de Oracle asigna un área de memoria privada llamada el área de contexto para el procesamiento de sentencias SQL. La sentencia SQL se analiza y procesa en esta área. La información necesaria para el procesamiento y la información recuperada después de su transformación se almacenan en esta área. Usted no tiene control sobre esta zona, ya que se maneja internamente por el servidor Oracle.
Un cursor es un puntero a la zona de contexto. Sin embargo, este cursor es un cursor implícito y es gestionado automáticamente por el servidor Oracle. Cuando el bloque ejecutable emite una sentencia SQL, PL / SQL crea un cursor implícito.

Tipos de cursores
Hay dos tipos de cursores:

Implícita: se crea y gestionado por el servidor de Oracle Un cursor implícito. Usted no tiene acceso a ella. El servidor de Oracle crea un cursor como cuando tiene que ejecutar una sentencia SQL.

Explícita: Como programador, es posible que desee recuperar varias filas de una tabla de base de datos, tiene un puntero a cada fila que se recupera, y el trabajo en las filas de una en una. En tales casos, se puede declarar cursores explícitamente en función de sus necesidades de negocio. Un cursor declarado por los programadores se llama cursor explícito. Usted declara un cursor tal en la parte declarativa de un bloque PL / SQL.

1. En la parte declarativa de un bloque PL/SQL, declare el cursor por nombrarlo y la definición de la estructura de la consulta que se asocia con él.
2. Abra el cursor.  La sentencia OPEN ejecuta la consulta y se une cualquier variable que se hace referencia. Filas identificados por la consulta se llaman el conjunto activo y ahora están disponibles para ir a buscar.
3. Obtener los datos desde el cursor.  En el diagrama de flujo mostrado en la diapositiva, después de cada zona de alcance, se prueba el cursor para cualquier fila existente. Si no hay más filas para procesar, debe cerrar el cursor.
4. Cierre el cursor.  La sentencia CLOSE libera el conjunto activo de filas. Ahora es posible reabrir el cursor para establecer un conjunto activo fresco.


Un programa PL/SQL abre un cursor, procesa filas devueltas por una consulta, y luego cierra el cursor. El cursor marca la posición actual en el conjunto activo.
1. La sentencia OPEN ejecuta la consulta asociada con el cursor, identifica el conjunto activo, y posiciona el cursor en la primera fila.
2. La sentencia FETCH recupera la fila actual y avanza el cursor a la siguiente Remar hasta que no haya más filas o se cumple una condición especificada.
3. La sentencia CLOSE libera el cursor.



La sentencia OPEN ejecuta la consulta asociada con el cursor, identifica el conjunto activo, y posiciona el puntero del cursor en la primera fila. La instrucción OPEN está incluido en la sección ejecutable del bloque PL / SQL.
OPEN es una sentencia ejecutable que realiza las siguientes operaciones:
1. asigna dinámicamente la memoria para un área de contexto
2. analiza la instrucción SELECT
3. Se liga las variables de entrada (establece los valores de las variables de entrada mediante la obtención de sus direcciones de memoria)
4. Identifica el conjunto activo (el conjunto de filas que satisfacen los criterios de búsqueda). Las filas en el conjunto activo no se recuperan en variables cuando se ejecute la sentencia OPEN. Más bien, la sentencia FETCH recupera las filas desde el cursor a las variables.
5. Coloca el puntero a la primera fila en el conjunto activo
Nota: Si una consulta no devuelve ninguna fila cuando se abre el cursor, PL / SQL no plantea una excepción. Usted puede encontrar el número de filas devueltas con un cursor explícitos mediante el uso de la <cursor_name>% ROWCOUNT atributo.

La sentencia FETCH recupera las filas de la cursor uno a la vez. Después de cada zona de alcance, el cursor avanza a la siguiente fila en el conjunto activo. Usted puede utilizar el atributo% NOTFOUND para determinar si todo el conjunto activo se ha recuperado.

Considere el ejemplo mostrado en la diapositiva. Dos variables, empno y lname, se declaran para contener los valores han obtenido desde el cursor. Examine la sentencia FETCH.

Haber recogido con éxito los valores desde el cursor a las variables. Sin embargo, hay seis empleados del departamento 30, pero sólo una fila era descabellada. Para recuperar todas las filas, debe utilizar bucles. En la siguiente diapositiva, se ve cómo se utiliza un bucle para buscar a todas las filas.

La sentencia FETCH realiza las siguientes operaciones:
1. Lee los datos de la fila actual en la salida de las variables PL / SQL
2. Avanza el puntero a la siguiente fila en el conjunto activo

Puede incluir el mismo número de variables en la cláusula INTO de la sentencia FETCH ya que hay columnas en la sentencia SELECT; asegúrese de que los tipos de datos son compatibles. Relacionar cada variable para corresponder a las columnas posicionalmente. Alternativamente, también puede definir un récord para el cursor y hacer referencia al registro en el FETCH cláusula INTO. Por último, la prueba para ver si el cursor contiene filas. Si una zona de alcance adquiere ningún valor, no hay filas de izquierda a procesar en el conjunto activo y se registra ningún error.

Share:

DML EN PL-SQL


Usted manipular datos en la base de datos mediante el uso de comandos DML. Puede emitir comandos DML tales como INSERT, UPDATE, DELETE y MERGE sin restricciones en PL / SQL. Los bloqueos de fila (y bloqueos de tabla) se liberan mediante la inclusión de las declaraciones de confirmar o deshacer en el código PL / SQL.
  • La sentencia INSERT añade nuevas filas a la tabla.
  • La sentencia UPDATE modifica filas existentes en la tabla.
  • La instrucción DELETE elimina filas de la tabla.
  • La instrucción MERGE selecciona filas de una tabla a actualizar o insertar en otra mesa. La decisión de actualizar o insertar en la tabla de destino se basa en una condición en la cláusula ON.

Nota: MERGE es una afirmación determinista. Es decir, no se puede actualizar la misma fila de la tabla de destino varias veces en la misma sentencia MERGE. Debe tener INSERT y objetos UPDATE privilegios en la tabla de destino y SELECT privilegio en la tabla fuente.

Ejemplos:

DECLARE

V_CODIGO NUMBER := 1;
V_NOMBRE VARCHAR2(30) := 'JOSE';

BEGIN

INSERT INTO TABLA(C_CODIGO,C_NOMBRE)
VALUES (V_CODIGO,V_NOMBRE);

V_NOMBRE := 'JUAN';

UPDATE TABLA NOMBRE
SET C_NOMBRE = V_NOMBRE

WHERE C_CODIGO = V_CODIGO;

DELETE TABLA
WHERE C_CODIGO = V_CODIGO;

COMMIT;

END;

La instrucción MERGE inserciones o actualizaciones filas de una tabla utilizando los datos de otra tabla. Cada fila se inserta o actualiza en la tabla de destino en función de una condición de unión igualitaria.
El ejemplo que se muestra coincide con la columna empno en la tabla copy_emp a la columna de employee_id en la tabla empleados. Si se encuentra una coincidencia, la fila se actualiza para que coincida con la línea de la tabla empleados. Si no se encuentra la fila, se inserta en la tabla copy_emp.
El ejemplo completo de usar MERGE en un bloque PL / SQL se muestra en la página siguiente.

BEGIN
MERGE INTO copy_emp c
     USING employees e
     ON (e.employee_id = c.empno)
   WHEN MATCHED THEN
     UPDATE SET
       c.first_name     = e.first_name,
       c.last_name      = e.last_name,
       c.email          = e.email,
       c.phone_number   = e.phone_number,
       c.hire_date      = e.hire_date,
       c.job_id         = e.job_id,
       c.salary         = e.salary,
       c.commission_pct = e.commission_pct,
       c.manager_id     = e.manager_id,
       c.department_id  = e.department_id
   WHEN NOT MATCHED THEN
     INSERT VALUES(e.employee_id,  e.first_name, e.last_name,
          e.email, e.phone_number, e.hire_date, e.job_id,
          e.salary, e.commission_pct, e.manager_id, 
          e.department_id);
END;
/
Share:

SERVEROTUPUT

El SERVEROTUPUT es el paquete que nos permite utilizar funciones propias de ORACLE, como puede ser la salida de mensajes como mostrare a continuacion.

set SERVEROUTPUT ON

DECLARE

 V_NOMBRE VARCHAR2(30) := 'JOSE JIMENEZ';

BEGIN

--DBMS_OUTPUT = PAQUETE
--PUT_LINE = FUNCION

DBMS_OUTPUT.PUT_LINE(V_NOMBRE );

END;

Resultado: JOSE JIMENEZ
Share:

INTO


La cláusula INTO es obligatoria y se produce entre el SELECT y FROM cláusulas. Se utiliza para especificar los nombres de las variables que contienen los valores que SQL rendimientos de la cláusula SELECT. Debe especificar una variable para cada elemento seleccionado, y el orden de las variables deben corresponder con los elementos seleccionados.

Utilice la cláusula INTO para poblar bien las variables PL/SQL o variables del lenguaje principal.

Consultas debe devolver una sola fila
Sentencias SELECT dentro de un bloque caída PL/SQL en la clasificación ANSI de SQL incorporado, para el que se aplica la regla siguiente: Las consultas deben devolver una sola fila. Una consulta que devuelve más de una fila o ninguna fila genera un error.
PL/SQL gestiona estos errores al elevar excepciones estándar, que se puede manejar en la sección excepción del bloque con el NO_DATA_FOUND y TOO_MANY_ROWS excepciones. Incluya una condición WHERE en la instrucción SQL para que la declaración devuelve una sola fila. Usted aprenderá acerca de la gestión de excepciones en la lección titulada "Manejo de excepciones".

Nota: En todos los casos en que se utiliza DBMS_OUTPUT.PUT_LINE en los ejemplos de código, la SET SERVEROUTPUT ON declaración precede al bloque.


Cómo recuperar varias filas de una tabla y operar sobre los Datos
Una instrucción SELECT con la cláusula INTO puede recuperar sólo una fila a la vez. Si su requerimiento es para recuperar varias filas y operar sobre los datos, puede hacer uso de cursores explícitos. Te presentan a los cursores adelante en esta lección y aprender acerca de los cursores explícitos en la lección titulada "Uso de los cursores explícitos".


Share:

NESTED BLOCKS O BLOQUES ANIDADOS


Los bloques PL/SQL se pueden anidar.


  • Una sección ejecutable (BEGIN ... END) pueden contener bloques anidados.
  • Una sección de excepción puede contener? Bloques anidados.
Siendo procesal concede PL / SQL la capacidad de los estados de nidos. Puede bloques nido donde se permite que una sentencia ejecutable, con lo que el bloque anidado un comunicado. Si su sección ejecutable tiene código para muchas funcionalidades relacionados lógicamente para soportar múltiples requerimientos del negocio, se puede dividir la sección ejecutable en bloques más pequeños. La sección de excepción también puede contener bloques anidados.


El ejemplo mostrado tiene un (padre) bloque exterior y un bloque (niño) anidado. La variable v_outer_variable se declara en el bloque exterior y la variable v_inner_variable se declara en el bloque interno.

v_outer_variable es local en el bloque exterior sino global al bloque interior. Al acceder a esta variable en el bloque interior, PL / SQL primero busca una variable local en el interior de manzana con ese nombre. No hay ninguna variable con el mismo nombre en el bloque interior, por lo PL / SQL busca la variable en el bloque exterior. Por lo tanto, v_outer_variable se considera que es la variable global para todos los bloques de cerramiento. Puede acceder a esta variable en el bloque interior como se muestra en la diapositiva. Las variables declaradas en un bloque PL / SQL se consideran como locales en ese bloque y global a todos sus sub-bloques.

v_inner_variable es local en el bloque interno y no es global, porque el bloque interno no tiene ningún bloques anidados. Esta variable se puede acceder sólo dentro del bloque interior. Si PL / SQL no encuentra la variable declarada a nivel local, que mira hacia arriba en la parte declarativa de los bloques de los padres. PL / SQL no se parece a la baja en los bloques del niño.


La salida del bloque de muestra en el portaobjetos es el siguiente:
  • anonymous block completed
  • Father's Name: Patrick
  • Date of Birth: 12-DEC-02
  • Child's Name: Mike
  • Date of Birth: 20-APR-72

Examine la fecha de nacimiento que se imprime para el padre y el niño. La salida no proporciona la información correcta, porque el alcance y la visibilidad de las variables no se aplican correctamente.
  • El ámbito de una variable es la parte del programa en el que se declara la variable y es accesible.
  • La visibilidad de una variable es la parte del programa donde se puede acceder a la variable sin utilizar un calificador.
Scope
  • La variable v_father_name y la primera aparición de la variable v_date_of_birth se declaran en el bloque exterior. Estas variables tienen el alcance de la frase en la que se declaran. Por lo tanto, el alcance de estas variables se limita a la bloque exterior.
  • Las variables v_child_name y v_date_of_birth se declaran en el interior de manzana o el bloque anidado. Estas variables son accesibles sólo dentro del bloque anidado y no son accesibles en el bloque exterior. Cuando una variable está fuera de alcance, PL / SQL libera la memoria utilizada para almacenar la variable; por lo tanto, no pueden ser referenciados estas variables.\

Visibilidad

La variable v_date_of_birth declarado en el bloque exterior tiene un alcance incluso en el interior de manzana. Sin embargo, esta variable no es visible en el bloque interno porque el bloque interior tiene una variable local con el mismo nombre.

1. Examine el código en la sección ejecutable del bloque PL / SQL. Puede imprimir el nombre del padre, el nombre del niño y la fecha de nacimiento. Sólo la fecha de nacimiento del niño se  puede imprimir aquí porque la fecha de nacimiento del padre no es visible.
2.Fecha del padre de nacimiento es visible en el bloque exterior y, por lo tanto, se pueden imprimir.

Nota: No se puede tener variables con el mismo nombre en un bloque. Sin embargo, como se muestra en este ejemplo, se puede declarar variables con el mismo nombre en dos bloques diferentes (bloques anidados). Los dos elementos representados por identificadores son distintos; cambios en uno no afectan a la otra.

Share:

miércoles, 7 de diciembre de 2016

COMENTARIOS


Podemos comentar en PL/SQL con los siguientes comandos:

                                          /* Comentario 

                                             Comentario*/
                                          -- Comentario


Con tan solo escribir dentro de /**/ tendremos una linea o varias de comentarios, mientras que con -- podemos comentar una sola linea.
Share:

EJECUTANDO CODIGO JAVA DESDE PL/SQL

El código Java a ejecutar se puede incorporar a la base de datos cargando un archivo .jar mediante la instrucción loadjava (comando de sistema operativo que se encuentra en el directorio BIN de la base de datos) o creándolo directamente de forma similar a como se crea una función, procedimiento o paquete. En este ejemplo se usa esta segunda opción.
El siguiente código recibe por parámetro una fecha, desglosada en 6 campos numéricos (año, mes, día, hora, minuto y segundo) y la devuelve en formato texto:
CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED "JavaDate" AS
  package pruebas;
  import java.util.Calendar;

  public class JavaDate {  
    public static String getString(int anho, int mes, int dia, int hora, int minuto, int segundo) {
      Calendar calendar;        
      calendar = Calendar.getInstance();
      calendar.set(anho, mes, dia, hora, minuto, segundo);
      return calendar.getTime().toString();
    }
  }

Una vez está el código Java creado en la base de datos, hay que crear una función o procedimiento para llamarlo:

CREATE OR REPLACE FUNCTION f_javadate(p_anho NUMBER,
                                      p_mes NUMBER,
                                      p_dia NUMBER,
                                      p_hora NUMBER,
                                      p_minuto NUMBER,
                                      p_segundo NUMBER) RETURN VARCHAR2 IS LANGUAGE JAVA
 NAME 'pruebas.JavaDate.getString(int, int, int, int, int, int) return String';

Ahora ya sólo falta invocarlo donde sea necesario, por ejemplo:

SELECT f_javadate(  TO_NUMBER(TO_CHAR(SYSDATE, 'YYYY')),
                                    TO_NUMBER(TO_CHAR(SYSDATE, 'MM')),
                                    TO_NUMBER(TO_CHAR(SYSDATE, 'DD')),
                                    TO_NUMBER(TO_CHAR(SYSDATE, 'HH24')),
                                    TO_NUMBER(TO_CHAR(SYSDATE, 'MI')),
                                    TO_NUMBER(TO_CHAR(SYSDATE, 'SS')))
 FROM DUAL;


DESCARGAR SCRIPTS
Share:

viernes, 2 de diciembre de 2016

ESTRUCTURA DE UN BLOQUE DE DATOS


Los bloque de datos forman parte de lo que es la estructura de PL/SQL y se definen de la siguiente manera:

                  DECLARE

                  BEGIN

                  EXCEPTION

                  END;


  • En el DECLARE pondremos los distintos tipos de variables que podemos usar en PL/SQL.
  • Entre BEGIN y END, pondremos nuestro código.
  • En la sección de EXCEPTION atraparemos todas las posibles excepciones levantadas en el bloque.


Share:

Archivo

Cual es el tema de mayor interes para ti?