Voy a usar el blog con mi estudiantes de Oracle para hacer pruebas, errores y aprendizajes en lugar de usar un campus virtual basado en Moodle.
A continuación un ejemplo simple de bloque anónimo escrito en PL/SQL que obtiene el 10% del sueldo de un empleado usando el esquema HR.
DECLARE
v_bonus NUMBER (8,2);
BEGIN
SELECT salary * 0.10
INTO v_bonus
FROM employees
WHERE employee_id = 176;
END;
¿Qué variantes puedo hacer al bloque?











abril 29, 2008 en 8:42 pm
si se elimina el WHRE se produce el siguiente error
ORA-01422: exact fetch returns more than requested number of rows
Esto por que se retorna mas de un valor a v_bonus
abril 29, 2008 en 8:47 pm
Se debe tener presente tambien la presición de la variable en que se va a cargar lo que se recupera.
Yo declare lo siguiente:
v_bonus NUMBER (2,2);
me arrojo este error:
ORA-06502: PL/SQL: numeric or value error: number precision too large
abril 29, 2008 en 8:50 pm
ORA-01422: retorna mas numeros de filas, y no puede almacenar en una solo variable como v_bonues
abril 29, 2008 en 8:51 pm
Nos damos cuenta que con la clapsula where restringe para que envie un solo valor.
Tener cuidado con puntos y comas cuando escribimos y mirar la configuración regional
Al quitar la clapsula where se envian más datos de los soportados por la variable number y nos produce el error ora ORA-01422: exact fetch returns more than requested number of rows
Y tener cuidado recordar que despues de sentencias sql van con punto y coma al final sino nos produce otro error distinto al anterior ORA-06550: line 6, column 2:
abril 29, 2008 en 8:53 pm
No hay que olvidar colocar INTO v_bonus ya que esto nos permite almacenar el resultado de la consulta SQL en la variable declarada en DECLARE
abril 29, 2008 en 8:54 pm
Si se cambia el tipo de datos de la variable a varchar2, recordar que se hace una conversión automática y no hay error.
De acuerdo a la configuración regional tener cuidado con los puntos o las comas, si se pone una coma interpreta como un campo más y se lanza ORA-00947: not enough values.
Si se recupera los datos con una condición con la que no se recuperan datos, por ejemplo, WHERE employee_id = 3456789;, se lanza el error ORA-01403: no data found, debería capturarse.
abril 29, 2008 en 8:57 pm
Si no conocemos con exactitud que tipo de dato nos va a devolver la consulta SQL, debemos declarar la variable v_bonus como %TYPE
mayo 21, 2008 en 2:56 am
Una pregunta:
En un mismo fichero sql, se pueden teenr varios bloques de la manera:
DECLARE
variable NUMBER(10);
BEGIN
SELECT … FROM …;
INSERT INTO … VALUES (variable);
INSERT INTO … VALUES (variable);
END;
DECLARE
variable NUMBER(10);
BEGIN
SELECT … FROM …;
INSERT INTO … VALUES (variable);
INSERT INTO … VALUES (variable);
END;
DECLARE
variable NUMBER(10);
BEGIN
SELECT … FROM …;
INSERT INTO … VALUES (variable);
INSERT INTO … VALUES (variable);
END;
Gracias