Bloque PL/SQL demostrando uso de CASE. Se usa una variable de sustitución para ingresar una calificación, se muestra la nota y la valoración.
SET SERVEROUTPUT ON
DECLARE
v_grade char(1) := upper(’&p_grade’);
v_appraisal VARCHAR2(20);
BEGIN
v_appraisal :=
CASE v_grade
WHEN ‘A’ THEN ‘Excellent’
WHEN ‘B’ THEN ‘Very Good’
WHEN ‘C’ THEN ‘Good’
ELSE ‘No such grade’
END;
DBMS_OUTPUT.PUT_LINE(’Grade: ‘ || v_grade || ‘, Appraisal: ‘ || v_appraisal);
END;
/
Salida del programa:
Grade: A, Appraisal: Excellent
PL/SQL procedure successfully completed.
A continuación un ejemplo del uso de la estructura IF-THEN_ELSIF en donde se determinar el bono de un empleado basado en el departamento del mismo.
SET SERVEROUTPUT ON
DECLARE
v_deptno NUMBER(10):=10;
v_bonus NUMBER(10);
BEGIN
IF v_deptno = 10 THEN
v_bonus := 5000;
ELSIF v_deptno = 80 THEN
v_bonus := 7500;
else
v_bonus := 2000;
END IF;
DBMS_OUTPUT.PUT_LINE(’Departamento: ‘||v_deptno||’ Bonus: ‘||v_bonus);
END;
/
Bloque PL/SQL que hace uso de un bucle (loop). Calculamos el máximo country ID para Canadá, y con un bucle insertamos tres filas en orden consecutivo al máximo ID.
DECLARE
v_country_id locations.country_id%TYPE := ‘CA’;
v_location_id locations.location_id%TYPE;
v_counter NUMBER(2) := 1;
v_city locations.city%TYPE := ‘Montreal’;
BEGIN
SELECT MAX(location_id) INTO v_location_id FROM locations
WHERE country_id = v_country_id;
LOOP
INSERT INTO locations(location_id, city, country_id)
VALUES ((v_location_id + v_counter), v_city, v_country_id);
v_counter := v_counter + 1;
EXIT WHEN v_counter > 3;
END LOOP;
END;
/
Confirmamos las operaciones para ver los resultados.
COMMIT;
La salida es:
LOCATION_ID STREET_ADDRESS POSTAL_CODE CITY STATE_PROVINCE CO
1400 2014 Jabberwocky Rd 26192 Southlake Texas US
1500 2011 Interiors Blvd 99236 South San Francisco California US
1700 2004 Charade Rd 98199 Seattle Washington US
1800 460 Bloor St. W. ON M5S 1X8 Toronto Ontario CA
2500 Magdalen Centre, The Oxford Science Park OX9 9ZB Oxford Oxford UK
1801 Montreal CA
1802 Montreal CA
1803 Montreal CA
BEGIN
IF v_expresion1 = ‘TRUE’THEN
v_expresion2 := CASE v_expresion2
WHEN ‘TRUE’ THEN ‘TRUE’
WHEN ‘FALSE’THEN ‘FALSE’
WHEN ‘NULL’ THEN ‘NULL’
END;
END IF;
IF v_expresion1 = ‘FALSE’ THEN
v_expresion2 := CASE v_expresion2
WHEN ‘TRUE’ THEN ‘FALSE’
WHEN ‘FALSE’ THEN ‘FALSE’
WHEN ‘NULL’ THEN ‘FALSE’
END;
END IF;
IF v_expresion1 = ‘NULL’ THEN
v_expresion2 := CASE v_expresion2
WHEN ‘TRUE’ THEN ‘NULL’
WHEN ‘FALSE’ THEN ‘FALSE’
WHEN ‘NULL’ THEN ‘NULL’
END;
END IF;
Uso de bucles WHILE: hace los mismo que en mi comentario anterior, sólo que usando un bucle WHILE. La condición se conoce de antemano, y se realiza las operaciones mientras esa condición sea verdadera.
DECLARE
v_country_id locations.country_id%TYPE := ‘CA’;
v_location_id locations.location_id%TYPE;
v_counter NUMBER(2) := 1;
v_city locations.city%TYPE := ‘Montreal’;
BEGIN
SELECT MAX(location_id) INTO v_location_id FROM locations
WHERE country_id = v_country_id;
WHILE v_counter <= 3 LOOP
INSERT INTO locations(location_id, city, country_id)
VALUES ((v_location_id + v_counter), v_city, v_country_id);
v_counter := v_counter + 1;
END LOOP;
END;
/
COMMIT;
SELECT * FROM LOCATIONS;
Resultado:
PL/SQL procedure successfully completed.
Commit complete.
LOCATION_ID STREET_ADDRESS POSTAL_CODE CITY STATE_PROVINCE CO
1801 Montreal CA
1802 Montreal CA
1803 Montreal CA
1400 2014 Jabberwocky Rd 26192 Southlake Texas US
1500 2011 Interiors Blvd 99236 South San Francisco California US
1700 2004 Charade Rd 98199 Seattle Washington US
1800 460 Bloor St. W. ON M5S 1X8 Toronto Ontario CA
2500 Magdalen Centre, The Oxford Science Park OX9 9ZB Oxford Oxford UK
El siguiente código utiliza el bucle FOR para insertar tres nuevas localizaciones a partir del máximo ID para el pais de codigo CA y la ciudad sea MONTREAL
DECLARE
v_country_id locations.country_id%TYPE:=’CA’;
v_location_id locations.location_id%TYPE;
v_city locations.city%TYPE:=’Montereal’;
BEGIN
SELECT MAX(location_id) INTO v_location_id
FROM locations
WHERE country_id = v_country_id;
FOR I in 1..3 loop
INSERT INTO locations(location_id, city, country_id)
VALUES ((v_location_id + i), v_city, v_country_id);
END LOOP;
END;
/
Mayo 6, 2008 at 7:59 pm
Bloque PL/SQL demostrando uso de CASE. Se usa una variable de sustitución para ingresar una calificación, se muestra la nota y la valoración.
SET SERVEROUTPUT ON
DECLARE
v_grade char(1) := upper(’&p_grade’);
v_appraisal VARCHAR2(20);
BEGIN
v_appraisal :=
CASE v_grade
WHEN ‘A’ THEN ‘Excellent’
WHEN ‘B’ THEN ‘Very Good’
WHEN ‘C’ THEN ‘Good’
ELSE ‘No such grade’
END;
DBMS_OUTPUT.PUT_LINE(’Grade: ‘ || v_grade || ‘, Appraisal: ‘ || v_appraisal);
END;
/
Salida del programa:
Grade: A, Appraisal: Excellent
PL/SQL procedure successfully completed.
Mayo 6, 2008 at 8:16 pm
A continuación un ejemplo del uso de la estructura IF-THEN_ELSIF en donde se determinar el bono de un empleado basado en el departamento del mismo.
SET SERVEROUTPUT ON
DECLARE
v_deptno NUMBER(10):=10;
v_bonus NUMBER(10);
BEGIN
IF v_deptno = 10 THEN
v_bonus := 5000;
ELSIF v_deptno = 80 THEN
v_bonus := 7500;
else
v_bonus := 2000;
END IF;
DBMS_OUTPUT.PUT_LINE(’Departamento: ‘||v_deptno||’ Bonus: ‘||v_bonus);
END;
/
Departamento: 10 Bonus: 5000
PL/SQL procedure successfully completed.
Mayo 6, 2008 at 8:45 pm
Bloque PL/SQL que hace uso de un bucle (loop). Calculamos el máximo country ID para Canadá, y con un bucle insertamos tres filas en orden consecutivo al máximo ID.
DECLARE
v_country_id locations.country_id%TYPE := ‘CA’;
v_location_id locations.location_id%TYPE;
v_counter NUMBER(2) := 1;
v_city locations.city%TYPE := ‘Montreal’;
BEGIN
SELECT MAX(location_id) INTO v_location_id FROM locations
WHERE country_id = v_country_id;
LOOP
INSERT INTO locations(location_id, city, country_id)
VALUES ((v_location_id + v_counter), v_city, v_country_id);
v_counter := v_counter + 1;
EXIT WHEN v_counter > 3;
END LOOP;
END;
/
Confirmamos las operaciones para ver los resultados.
COMMIT;
La salida es:
LOCATION_ID STREET_ADDRESS POSTAL_CODE CITY STATE_PROVINCE CO
1400 2014 Jabberwocky Rd 26192 Southlake Texas US
1500 2011 Interiors Blvd 99236 South San Francisco California US
1700 2004 Charade Rd 98199 Seattle Washington US
1800 460 Bloor St. W. ON M5S 1X8 Toronto Ontario CA
2500 Magdalen Centre, The Oxford Science Park OX9 9ZB Oxford Oxford UK
1801 Montreal CA
1802 Montreal CA
1803 Montreal CA
8 rows selected.
Se insertaron las tres filas al final.
Mayo 6, 2008 at 8:57 pm
Pongo a disposicion de ustedes un bloque PL/SQL que nos permite hacer las comparaciones con el operador AND con FALSE, TRUE y NULL.
SET SERVEROUTPUT ON
DECLARE
v_expresion1 CHAR(5) := UPPER(’&p_expresion1′);
v_expresion2 CHAR(5) := UPPER(’&P_expresion2′);
BEGIN
IF v_expresion1 = ‘TRUE’THEN
v_expresion2 := CASE v_expresion2
WHEN ‘TRUE’ THEN ‘TRUE’
WHEN ‘FALSE’THEN ‘FALSE’
WHEN ‘NULL’ THEN ‘NULL’
END;
END IF;
IF v_expresion1 = ‘FALSE’ THEN
v_expresion2 := CASE v_expresion2
WHEN ‘TRUE’ THEN ‘FALSE’
WHEN ‘FALSE’ THEN ‘FALSE’
WHEN ‘NULL’ THEN ‘FALSE’
END;
END IF;
IF v_expresion1 = ‘NULL’ THEN
v_expresion2 := CASE v_expresion2
WHEN ‘TRUE’ THEN ‘NULL’
WHEN ‘FALSE’ THEN ‘FALSE’
WHEN ‘NULL’ THEN ‘NULL’
END;
END IF;
DBMS_OUTPUT.PUT_LINE(v_expresion2);
END;
Mayo 7, 2008 at 7:46 pm
Uso de bucles WHILE: hace los mismo que en mi comentario anterior, sólo que usando un bucle WHILE. La condición se conoce de antemano, y se realiza las operaciones mientras esa condición sea verdadera.
DECLARE
v_country_id locations.country_id%TYPE := ‘CA’;
v_location_id locations.location_id%TYPE;
v_counter NUMBER(2) := 1;
v_city locations.city%TYPE := ‘Montreal’;
BEGIN
SELECT MAX(location_id) INTO v_location_id FROM locations
WHERE country_id = v_country_id;
WHILE v_counter <= 3 LOOP
INSERT INTO locations(location_id, city, country_id)
VALUES ((v_location_id + v_counter), v_city, v_country_id);
v_counter := v_counter + 1;
END LOOP;
END;
/
COMMIT;
SELECT * FROM LOCATIONS;
Resultado:
PL/SQL procedure successfully completed.
Commit complete.
LOCATION_ID STREET_ADDRESS POSTAL_CODE CITY STATE_PROVINCE CO
1801 Montreal CA
1802 Montreal CA
1803 Montreal CA
1400 2014 Jabberwocky Rd 26192 Southlake Texas US
1500 2011 Interiors Blvd 99236 South San Francisco California US
1700 2004 Charade Rd 98199 Seattle Washington US
1800 460 Bloor St. W. ON M5S 1X8 Toronto Ontario CA
2500 Magdalen Centre, The Oxford Science Park OX9 9ZB Oxford Oxford UK
Mayo 8, 2008 at 7:01 pm
Uso de Bucles con FOR
El siguiente código utiliza el bucle FOR para insertar tres nuevas localizaciones a partir del máximo ID para el pais de codigo CA y la ciudad sea MONTREAL
DECLARE
v_country_id locations.country_id%TYPE:=’CA’;
v_location_id locations.location_id%TYPE;
v_city locations.city%TYPE:=’Montereal’;
BEGIN
SELECT MAX(location_id) INTO v_location_id
FROM locations
WHERE country_id = v_country_id;
FOR I in 1..3 loop
INSERT INTO locations(location_id, city, country_id)
VALUES ((v_location_id + i), v_city, v_country_id);
END LOOP;
END;
/