¡Descarga PLSQL - INFORMACION BASE DE DATOS CON PL-SQL y más Apuntes en PDF de Principios de la Gestión de Bases de Datos solo en Docsity!
plsql
#plsql
Tabla de contenido
- Acerca de
- Capítulo 1: Empezando con plsql
- Observaciones
- Examples
- Definición de PLSQL
- Hola Mundo
- Acerca de PLSQL
- Diferencia entre% TYPE y% ROWTYPE.
- Crear o reemplazar una vista
- Crear una tabla
- Capítulo 2: Asignaciones modelo y lenguaje.
- Examples
- Modelo de asignaciones en PL / SQL.
- Capítulo 3: Colecciones y registros
- Examples
- Utilice una colección como un tipo de retorno para una función de división
- Capítulo 4: Cursores
- Sintaxis
- Observaciones
- Examples
- Cursor parametrizado "FOR loop"
- Cursor de bucle "FOR" implícito
- Trabajando con SYS_REFCURSOR
- función devolviendo un cursor
- Y cómo usarlo:
- Capítulo 5: Declaración IF-THEN-ELSE
- Sintaxis
- Examples
- IF-THEN
- IF-THEN-ELSE
- IF-THEN-ELSIF-ELSE
- Capítulo 6: Funciones
- Sintaxis
- Examples
- Generar GUID
- Funciones de llamada
- Capítulo 7: Gatillos
- Introducción
- Sintaxis
- Examples
- Antes de activar INSERT o ACTUALIZAR
- Capítulo 8: Lazo
- Sintaxis
- Examples
- Bucle simple
- Mientras que bucle
- En bucle
- Capítulo 9: Manejo de excepciones
- Introducción
- Examples
- Manejo de excepciones
- Sintaxis
- Excepciones definidas internamente
- Excepciones predefinidas
- Excepciones definidas por el usuario
- Defina una excepción personalizada, levántela y vea de dónde viene.
- Manejo de excepciones de error de conexión
- Capítulo 10: Manejo de excepciones
- Introducción
- Examples
- Manejo de excepciones de error de conexión
- Defina una excepción personalizada, levántela y vea de dónde viene.
- Capítulo 11: Paquetes
- Sintaxis
- Examples
- Uso del paquete
- Sobrecarga
- Restricciones en la sobrecarga
- Definir un encabezado de paquete y un cuerpo con una función.
- Capítulo 12: Procedimiento PLSQL
- Introducción
- Examples
- Sintaxis
- Hola Mundo
- Parámetros de entrada / salida
- Capítulo 13: Recoger a granel
- Examples
- Procesamiento de datos a granel
- Capítulo 14: Tipos de objeto
- Observaciones
- Examples
- BASE_TYPE
- MID_TYPE
- LEAF_TYPE
- Accediendo a objetos almacenados
- Creditos
Acerca de
You can share this PDF with anyone you feel could benefit from it, downloaded the latest version
from: plsql
It is an unofficial and free plsql 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 plsql.
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 info@zzzprojects.com
necesarias. A continuación se muestra un ejemplo de código anónimo simple, que no hace nada
pero funciona sin informe de errores.
BEGIN
NULL;
END;
La falta de una instrucción ejecutable genera un error, ya que PL / SQL no admite bloques vacíos.
Por ejemplo, la ejecución del código a continuación conduce a un error:
BEGIN
END;
La aplicación generará un error:
END;
ERROR at line 2: ORA-06550: line 2, column 1: PLS-00103: Encountered the symbol "END" when expecting one of the following: ( begin case declare exit for goto if loop mod null pragma raise return select update while with << continue close current delete fetch lock insert open rollback savepoint set sql execute commit forall merge pipe purge
Símbolo "*" en la línea debajo de la palabra clave "FIN"; significa, que el bloque que termina con
este bloque está vacío o mal construido. Cada bloque de ejecución necesita instrucciones para
hacerlo, incluso si no hace nada, como en nuestro ejemplo.
Hola Mundo set serveroutput on DECLARE message constant varchar2(32767):= 'Hello, World!'; BEGIN dbms_output.put_line(message); END; /
El set serveroutput on comandos set serveroutput on es necesario en los clientes SQL * Plus y
SQL Developer para habilitar la salida de dbms_output. Sin el comando no se muestra nada.
El end; La línea señala el final del bloque PL / SQL anónimo. Para ejecutar el código desde la
línea de comandos SQL, es posible que tenga que escribir / al principio de la primera línea en
blanco después de la última línea del código. Cuando el código anterior se ejecuta en el indicador
SQL, produce el siguiente resultado:
Hello, World! PL/SQL procedure successfully completed. Acerca de PLSQL
PL / SQL significa extensiones de lenguaje de procedimiento a SQL. PL / SQL está disponible
solo como una "tecnología habilitadora" dentro de otros productos de software; no existe como un
lenguaje independiente. Puede usar PL / SQL en la base de datos relacional de Oracle, en el
servidor de Oracle y en las herramientas de desarrollo de aplicaciones del lado del cliente, como
Oracle Forms. Estas son algunas de las formas en que podría usar PL / SQL:
1. Para construir procedimientos almacenados..
2. Para crear disparadores de base de datos.
3. Para implementar la lógica del lado del cliente en su aplicación de Oracle Forms.
4. Para vincular una página de inicio de World Wide Web a una base de datos de Oracle.
Diferencia entre% TYPE y% ROWTYPE.
%TYPE : se utiliza para declarar un campo con el mismo tipo que el de una columna de tabla
específica.
DECLARE
vEmployeeName Employee.Name%TYPE; BEGIN SELECT Name INTO vEmployeeName FROM Employee WHERE RowNum = 1; DBMS_OUTPUT.PUT_LINE(vEmployeeName); END; /
% ROWTYPE: se utiliza para declarar un registro con los mismos tipos que se encuentran en la
tabla, vista o cursor especificados (= columnas múltiples).
DECLARE
rEmployee Employee%ROWTYPE; BEGIN rEmployee.Name := 'Matt'; rEmployee.Age := 31; DBMS_OUTPUT.PUT_LINE(rEmployee.Name); DBMS_OUTPUT.PUT_LINE(rEmployee.Age); END; / Crear o reemplazar una vista
En este ejemplo vamos a crear una vista.
Capítulo 2: Asignaciones modelo y lenguaje.
Examples
Modelo de asignaciones en PL / SQL.
Todos los lenguajes de programación nos permiten asignar valores a las variables. Por lo general,
un valor se asigna a la variable, de pie en el lado izquierdo. El prototipo de las operaciones de
asignación generales en cualquier lenguaje de programación contemporáneo se ve así:
left_operand assignment_operand right_operand instructions_of_stop
Esto asignará el operando derecho al operando izquierdo. En PL / SQL esta operación se ve así:
left_operand := right_operand;
El operando izquierdo debe ser siempre una variable. El operando derecho puede ser valor,
variable o función:
set serveroutput on declare v_hello1 varchar2(32767); v_hello2 varchar2(32767); v_hello3 varchar2(32767); function hello return varchar2 is begin return 'Hello from a function!'; end; begin -- from a value (string literal) v_hello1 := 'Hello from a value!'; -- from variable v_hello2 := v_hello1; -- from function v_hello3 := hello; dbms_output.put_line(v_hello1); dbms_output.put_line(v_hello2); dbms_output.put_line(v_hello3); end; /
Cuando el bloque de código se ejecuta en SQL * Plus, se imprime la siguiente salida en la
consola:
Hello from a value! Hello from a value! Hello from a function!
Hay una característica en PL / SQL que nos permite asignar "de derecha a izquierda". Es posible
hacerlo en sentencia SELECT INTO. Prototipo de este instrumento que se encuentra a
continuación:
SELECT [ literal | column_value ] INTO local_variable FROM [ table_name | aliastable_name ] WHERE comparison_instructions;
Este código asignará el carácter literal a una variable local:
set serveroutput on declare v_hello varchar2(32767); begin select 'Hello world!' into v_hello from dual; dbms_output.put_line(v_hello); end; /
Cuando el bloque de código se ejecuta en SQL * Plus, se imprime la siguiente salida en la
consola:
Hello world!
La asignación "de derecha a izquierda" no es un estándar , pero es una característica valiosa
para los programadores y usuarios. Generalmente se usa cuando el programador está usando
cursores en PL / SQL: esta técnica se usa cuando queremos devolver un único valor escalar o un
conjunto de columnas en la línea de cursor del cursor SQL.
Otras lecturas:
- Asignación de valores a variables
Lea Asignaciones modelo y lenguaje. en línea:
https://riptutorial.com/es/plsql/topic/6959/asignaciones-modelo-y-lenguaje-
Capítulo 4: Cursores
Sintaxis
- Cursor cursor_name Is your_select_statement
- Cursor cursor_name (param TYPE) es your_select_statement_using_param
- FOR x in ( your_select_statement ) LOOP ... Observaciones
Los cursores declarados son difíciles de usar, y usted prefiere los bucles FOR en la mayoría de los
casos. Lo que es muy interesante en cursores en comparación con los bucles FOR simples, es que
puede parametrizarlos.
Es mejor evitar hacer bucles con PL / SQL y cursores en lugar de usar Oracle SQL de todos
modos. Sin embargo, para las personas acostumbradas al lenguaje de procedimientos, puede ser
mucho más fácil de entender.
Si desea verificar si existe un registro, y luego hacer cosas diferentes dependiendo de si el
registro existe o no, entonces tiene sentido usar las instrucciones MERGE en consultas SQL de
ORACLE puras en lugar de usar bucles de cursor. (Tenga en cuenta que MERGE solo está
disponible en las versiones de Oracle> = 9i).
Examples
Cursor parametrizado "FOR loop" DECLARE CURSOR c_emp_to_be_raised(p_sal emp.sal%TYPE) IS SELECT * FROM emp WHERE sal < p_sal; BEGIN FOR cRowEmp IN c_emp_to_be_raised(1000) LOOP dbms_Output.Put_Line(cRowEmp .eName ||' ' ||cRowEmp.sal||'... should be raised ;)'); END LOOP; END; / Cursor de bucle "FOR" implícito BEGIN FOR x IN (SELECT * FROM emp WHERE sal < 100) LOOP dbms_Output.Put_Line(x.eName ||' '||x.sal||'... should REALLY be raised :D'); END LOOP; END; /
- La primera ventaja es que no hay ninguna declaración tediosa que hacer (piense en esta
horrible cosa "CURSOR" que tenía en versiones anteriores)
La segunda ventaja es que primero construye su consulta de selección, luego, cuando tiene
lo que desea, puede acceder de inmediato a los campos de su consulta ( x. ) en su
bucle PL / SQL
El bucle abre el cursor y obtiene un registro a la vez para cada bucle. Al final del bucle se
cierra el cursor.
Los cursores implícitos son más rápidos porque el trabajo del intérprete crece a medida que
el código se alarga. Cuanto menos código menos trabajo tiene que hacer el intérprete.
Trabajando con SYS_REFCURSOR
SYS_REFCURSOR se puede usar como un tipo de retorno cuando necesita manejar fácilmente una
lista devuelta no desde una tabla, sino más específicamente desde una función:
función devolviendo un cursor
CREATE OR REPLACE FUNCTION list_of (required_type_in IN VARCHAR2) RETURN SYS_REFCURSOR IS v_ SYS_REFCURSOR; BEGIN CASE required_type_in WHEN 'CATS' THEN OPEN v_ FOR SELECT nickname FROM ( select 'minou' nickname from dual union all select 'minâ' from dual union all select 'minon' from dual ); WHEN 'DOGS' THEN OPEN v_ FOR SELECT dog_call FROM ( select 'bill' dog_call from dual union all select 'nestor' from dual union all select 'raoul' from dual ); END CASE; -- Whit this use, you must not close the cursor. RETURN v_; END list_of; /
Y cómo usarlo:
DECLARE
v_names SYS_REFCURSOR; v_ VARCHAR2 (32767); BEGIN v_names := list_of('CATS');
Capítulo 5: Declaración IF-THEN-ELSE
Sintaxis
- SI [condición 1] ENTONCES
- [instrucciones para ejecutar cuando la condición 1 es VERDADERA];
- ELSIF [condición 2] LUEGO
- [instrucciones para ejecutar cuando la condición 2 es VERDADERA];
- MÁS
- [declaraciones a ejecutar cuando tanto la condición 1 como la condición 2 son FALSAS];
- TERMINARA SI;
Examples
IF-THEN DECLARE v_num1 NUMBER(10); v_num2 NUMBER(10); BEGIN v_num1 := 2; v_num2 := 1; IF v_num1 > v_num2 THEN dbms_output.put_line('v_num1 is bigger than v_num2'); END IF; END; IF-THEN-ELSE DECLARE v_num1 NUMBER(10); v_num2 NUMBER(10); BEGIN v_num1 := 2; v_num2 := 10; IF v_num1 > v_num2 THEN dbms_output.put_line('v_num1 is bigger than v_num2'); ELSE dbms_output.put_line('v_num1 is NOT bigger than v_num2'); END IF; END;
IF-THEN-ELSIF-ELSE DECLARE v_num1 NUMBER(10); v_num2 NUMBER(10); BEGIN v_num1 := 2; v_num2 := 2; IF v_num1 > v_num2 THEN dbms_output.put_line('v_num1 is bigger than v_num2'); ELSIF v_num1 < v_num2 THEN dbms_output.put_line('v_num1 is NOT bigger than v_num2'); ELSE dbms_output.put_line('v_num1 is EQUAL to v_num2'); END IF; END;
Lea Declaración IF-THEN-ELSE en línea: https://riptutorial.com/es/plsql/topic/5871/declaracion-if-
then-else
IF functionName() = 100 THEN Null; END IF;
Llamando una función en una instrucción SELECT
SELECT functionName() FROM DUAL;
Lea Funciones en línea: https://riptutorial.com/es/plsql/topic/4005/funciones
Capítulo 7: Gatillos
Introducción
Introducción:
Los disparadores son un concepto útil en PL / SQL. Un disparador es un tipo especial de
procedimiento almacenado que no requiere ser llamado explícitamente por el usuario. Es un
grupo de instrucciones, que se activan automáticamente en respuesta a una acción de
modificación de datos específica en una tabla o relación específica, o cuando se cumplen ciertas
condiciones específicas. Los activadores ayudan a mantener la integridad y la seguridad de los
datos. Hacen el trabajo conveniente tomando la acción requerida automáticamente.
Sintaxis
- CREAR [O REEMPLAZAR] TRIGGER trigger_name
- ANTES DE ACTUALIZAR [o INSERTAR] [o BORRAR]
- ON table_name
- [ POR CADA FILA ]
- DECLARAR
- EMPEZAR
- EXCEPCIÓN
- CUANDO ...
- -- manejo de excepciones
- FIN;
Examples
Antes de activar INSERT o ACTUALIZAR CREATE OR REPLACE TRIGGER CORE_MANUAL_BIUR BEFORE INSERT OR UPDATE ON CORE_MANUAL FOR EACH ROW BEGIN if inserting then -- only set the current date if it is not specified if :new.created is null then :new.created := sysdate; end if; end if; -- always set the modified date to now if inserting or updating then :new.modified := sysdate; end if;