0% encontró este documento útil (0 votos)
138 vistas12 páginas

Oracle Native Dynamic SQL (PL/SQL)

Ejercicios en Oracle PL/SQL, empleando ONDS. Jesús José Navarrete Baca, Diseño de base de datos II, Ingeniería en Sistemas Computacionales en Hardware FING UACH.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
138 vistas12 páginas

Oracle Native Dynamic SQL (PL/SQL)

Ejercicios en Oracle PL/SQL, empleando ONDS. Jesús José Navarrete Baca, Diseño de base de datos II, Ingeniería en Sistemas Computacionales en Hardware FING UACH.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 12

PhD. José Saúl de Lira Miramontes.

Universidad Autónoma de Chihuahua

Facultad de Ingeniería

Alumno: PTBI Jesús José Navarrete Baca (301429)

Grupo: 7HW1

Actividad: Tarea 9 (Oracle Dynamic Sql)

Fecha: 26/09/2018
~EJERCICIO #1

1. Crear una función almacenada que verifique la existencia de un registro. Se le pasa como
parámetro el nombre de la tabla y el atributo por el cual se hace la verificación. Regresa un
valor true si existe el registro .

CREATE OR REPLACE FUNCTION EXISTREG(TN VARCHAR2, AN VARCHAR2) RETURN


BOOLEAN AS
TYPE CCURC IS REF CURSOR;
MYCUR CCURC;
SQLQ VARCHAR2(200) := 'SELECT '||AN||' FROM '||TN;
FLAG BOOLEAN:=FALSE;
BEGIN
BEGIN
OPEN MYCUR FOR SQLQ;
LOOP
FLAG := NOT FLAG;
EXIT;
END LOOP;
CLOSE MYCUR;

EXCEPTION WHEN OTHERS THEN NULL;


END;
RETURN FLAG;
END;
CREATE OR REPLACE FUNCTION EXISTREGVAL(TN VARCHAR2, AN VARCHAR2, INS
VARCHAR2) RETURN BOOLEAN AS
FLAG BOOLEAN := FALSE;
SQLQ VARCHAR2(200):='SELECT COUNT(*) FROM(SELECT '||AN||' FROM
'||TN||' WHERE '||AN||' = '''||INS||''')';
PIVO INTEGER := 0;
BEGIN
BEGIN
EXECUTE IMMEDIATE SQLQ INTO PIVO;
EXCEPTION WHEN OTHERS THEN NULL;
END;
IF PIVO <> 0 THEN
FLAG := NOT FLAG;
END IF;
RETURN FLAG;
END;
CREATE OR REPLACE PROCEDURE ECH(TXT VARCHAR2) AS BEGIN
DBMS_OUTPUT.PUT_LINE(TXT); END;

DECLARE
BEGIN
IF EXISTREGVAL('REGIONS','REGION_NAME','Americas') THEN
ECH('Existe');

0
ELSE
ECH('No Existe');
END IF;

IF EXISTREG('REGIONS','LATITUDE') THEN
ECH('Existe');
ELSE
ECH('No Existe');
END IF;
END;

1
~EJERCICIO #2

2. Crear un procedimiento almacenado que despliegue los datos de los empleados de un


departamento (employee_id, first_name, manager_id), pasar como parámetro el atributo por
el cual se ordenan los registros y el tipo de ordenamiento (1 = Asc 2= Desc). Tabla: Employees.

CREATE OR REPLACE PROCEDURE SHOWEMPS_DPTO(ATTB VARCHAR2, ORDERTYPE


INTEGER) AS
TYPE XCUR IS REF CURSOR;
WRAPPERTYPE VARCHAR2(10):= 'ASC';
CUR XCUR;

SQLQ VARCHAR2(200):= 'SELECT * FROM EMPLOYEES ORDER BY '||ATTB||' ';

TMP EMPLOYEES%ROWTYPE;
BEGIN

IF ORDERTYPE = 1 THEN
WRAPPERTYPE := 'ASC';
ELSIF ORDERTYPE = 2 THEN
WRAPPERTYPE := 'DESC';
END IF;

SQLQ := SQLQ || WRAPPERTYPE;

ECH('EID FIRST NAME MANAGER ID');


OPEN CUR FOR SQLQ;
LOOP
FETCH CUR INTO TMP;
EXIT WHEN CUR%NOTFOUND;
TMP.FIRST_NAME := RPAD(TMP.FIRST_NAME,12);

ECH(TMP.EMPLOYEE_ID||' '||TMP.FIRST_NAME||' '||TMP.MANAGER_ID);

2
END LOOP;
EXCEPTION WHEN OTHERS THEN ECH(SQLERRM);
END;

BEGIN
SHOWEMPS_DPTO('SALARY', 1);
SHOWEMPS_DPTO('EMPLOYEE_ID', 2);
END;

3
~EJERCICIO #3
Crear un procedimiento almacenado que reciba como parámetro el nombre de una
tabla, y muestre la estructura de dicha tabla (atributos y tipos).

*FORM 1
CREATE OR REPLACE PROCEDURE SHOWSTRUCT(TN VARCHAR2) AS

TYPE CUSTOM_RECORD IS RECORD(


CNAME ALL_TAB_COLUMNS.COLUMN_NAME%TYPE,
CTYPE ALL_TAB_COLUMNS.DATA_TYPE%TYPE
);

TYPE CVARRAY IS TABLE OF CUSTOM_RECORD;

ARR CVARRAY;
WIDTH INTEGER := 25;
BEGIN
BEGIN
SELECT COLUMN_NAME, DATA_TYPE BULK COLLECT INTO ARR FROM
ALL_TAB_COLUMNS WHERE TABLE_NAME = TN;

FOR I IN ARR.FIRST .. ARR.LAST LOOP

ARR(I).CNAME := RPAD(ARR(I).CNAME,WIDTH);
ARR(I).CTYPE := RPAD(ARR(I).CTYPE,WIDTH);
ECH('-> '||ARR(I).CNAME||' | -> '||ARR(I).CTYPE||'|');
END LOOP;
EXCEPTION WHEN OTHERS THEN NULL;
END;
END;
BEGIN
FOR X IN (SELECT TABLE_NAME A FROM USER_TABLES) LOOP
ECH('***** >>Tabla: '||X.A||'*****');

4
SHOWSTRUCT(X.A);
ECH(' ');
END LOOP;
END;

*FORM 2
CREATE OR REPLACE PROCEDURE SHOWSTRUCT2(TNAME VARCHAR2) AS

TYPE XCUR IS REF CURSOR;


CUR XCUR;
SQLQ VARCHAR2(100):= 'SELECT * FROM ALL_TAB_COLUMNS WHERE TABLE_NAME =
:K';

TMP ALL_TAB_COLUMNS%ROWTYPE;
BEGIN

OPEN CUR FOR SQLQ USING TNAME;


LOOP
FETCH CUR INTO TMP;
EXIT WHEN CUR%NOTFOUND;

ECH(TMP.COLUMN_NAME||' '||TMP.DATA_TYPE);

END LOOP;
EXCEPTION WHEN OTHERS THEN ECH(SQLERRM);
END;

BEGIN
SHOWSTRUCT2('EMPLOYEES');
END;

5
6
~EJERCICIO #4
Crear un procedimiento almacenado que permita agregar una columna a una
tabla, se pasa como parámetro el nombre de la tabla, nombre de la columna
nueva y el tipo de dato de dicha columna.

CREATE OR REPLACE PROCEDURE ADDCOLUMN(TN VARCHAR2, CN VARCHAR2, TYPENAME


VARCHAR2) AS
SQLQ VARCHAR2(200) := 'ALTER TABLE '||TN||' ADD '||CN||' '||TYPENAME;
BEGIN
EXECUTE IMMEDIATE SQLQ;
ECH('*Columna '||TN||' Agregada satisfactoriamente...');
EXCEPTION WHEN OTHERS THEN ECH(SQLERRM);
END;

CREATE OR REPLACE PROCEDURE DELCOLUMN(TN VARCHAR2, CN VARCHAR2) AS


SQLQ VARCHAR(200) := 'ALTER TABLE '||TN||' DROP COLUMN '||CN;
BEGIN
EXECUTE IMMEDIATE SQLQ;
ECH('*Columna '||TN||' Eliminada satisfactoriamente...');
EXCEPTION WHEN OTHERS THEN ECH(SQLERRM);
END;

BEGIN
ADDCOLUMN('XTEST','APELLIDO','VARCHAR2(30)');
ADDCOLUMN('XTEST','ALIAS','VARCHAR2(30)');
ADDCOLUMN('XTEST','SALARIO','NUMBER(9,2)');
SHOWSTRUCT('XTEST');
DELCOLUMN('XTEST','APELLIDO');
DELCOLUMN('XTEST','ALIAS');
DELCOLUMN('XTEST','SALARIO');
SHOWSTRUCT('XTEST');
END;

7
8
~EJERCICIO #5
Crear un procedimiento almacenado que permita crear una copia de una tabla,
el procedimiento recibe como parámetro el nombre de la tabla a copiar y el
nombre de la nueva tabla.

CREATE OR REPLACE PROCEDURE DUPLICATE_TABLE(TN VARCHAR2, TNNEW VARCHAR2)


AUTHID CURRENT_USER AS
SQLQ VARCHAR2(200) := 'CREATE TABLE '||TNNEW||' AS SELECT * FROM '||TN;
BEGIN
EXECUTE IMMEDIATE SQLQ;
ECH('Se ha creado una copia de la tabla '||TN||' -> '||TNNEW);
EXCEPTION WHEN OTHERS THEN ECH(SQLERRM);
END;
CREATE OR REPLACE PROCEDURE DUPLICATE_SCHEMA_TABLE(TN VARCHAR2, TNNEW
VARCHAR2) AUTHID CURRENT_USER AS
SQLQ VARCHAR2(200) := 'CREATE TABLE '||TNNEW||' AS SELECT * FROM '||TN
||' WHERE 1 <> 1';
BEGIN
EXECUTE IMMEDIATE SQLQ;
ECH('Se ha creado una copia de la tabla '||TN||' -> '||TNNEW);
EXCEPTION WHEN OTHERS THEN ECH(SQLERRM);
END;

BEGIN
DUPLICATE_TABLE('XTEST','XTEST2');
DUPLICATE_SCHEMA_TABLE('EMPLOYEES','NEWEMPS');
END;

9
10

También podría gustarte