Académique Documents
Professionnel Documents
Culture Documents
1.
VARIABLE g_char VARCHAR2(30)
VARIABLE g_num NUMBER
DECLARE
v_char VARCHAR2(30);
v_num NUMBER(11,2);
BEGIN
v_char := '42 is the answer';
v_num := TO_NUMBER(SUBSTR(v_char,1,2));
:g_char := v_char;
:g_num := v_num;
END;
/
PRINT g_char
PRINT g_num
2.
3.
a.
VARIABLE g_max_deptno NUMBER
DECLARE
v_max_deptno NUMBER;
BEGIN
SELECT max(department_id)
INTO v_max_deptno
FROM departments;
:g_max_deptno := v_max_deptno;
END;
/
PRINT g_max_deptno
Alternate Solution:
SET SERVEROUTPUT ON
DECLARE
v_max_deptno NUMBER;
BEGIN
SELECT MAX(department_id) INTO v_max_deptno FROM departments;
dbms_output.put_line(v_max_deptno);
END;
/
b.
DECLARE
v_max_deptno departments.department_id%TYPE;
BEGIN
SELECT MAX(department_id) + 10
INTO v_max_deptno
FROM departments;
INSERT INTO departments (department_id, department_name,
location_id)
VALUES (v_max_deptno, '&p_dname', NULL);
COMMIT;
END;
/
SET VERIFY ON
SET ECHO ON
Check if the new department has been inserted
SELECT *
FROM departments
WHERE department_name = 'Education';
c.
SET VERIFY OFF
DEFINE p_deptno = 70
DEFINE p_loc = 1700
BEGIN
UPDATE departments
SET location_id = &p_loc
WHERE department_id = &p_deptno;
COMMIT;
END;
/
SET VERIFY ON
d.
SET VERIFY OFF
VARIABLE g_result VARCHAR2(40)
DEFINE p_deptno = 70
DECLARE
v_result NUMBER(2);
BEGIN
DELETE
FROM departments
WHERE department_id = &p_deptno;
v_result := SQL%ROWCOUNT;
:g_result := (TO_CHAR(v_result) || ' row(s) deleted.');
COMMIT;
END;
/
PRINT g_result
SET VERIFY ON
4.
SET SERVEROUTPUT ON
SET VERIFY OFF
DEFINE p_empno = 100
DECLARE
v_empno employees.employee_id%TYPE := &p_empno;
v_sal employees.salary%TYPE;
v_bonus_per NUMBER(7,2);
v_bonus NUMBER(7,2);
BEGIN
SELECT salary
INTO v_sal
5. CREATE TABLE top_dogs
(salary NUMBER(8,2));
DELETE FROM top_dogs;
DEFINE p_num = 2
DECLARE
v_num NUMBER(3) := &p_num;
v_sal employees.salary%TYPE;
CURSOR emp_cursor IS
SELECT distinct salary
FROM employees
ORDER BY salary DESC;
BEGIN
OPEN emp_cursor;
FETCH emp_cursor INTO v_sal;
WHILE emp_cursor%ROWCOUNT <= v_num AND emp_cursor%FOUND
LOOP
INSERT INTO top_dogs (salary)
VALUES (v_sal);
FETCH emp_cursor INTO v_sal;
END LOOP;
CLOSE emp_cursor;
COMMIT;
END;
/
SELECT * FROM top_dogs:
6.
SET VERIFY OFF
DEFINE p_sal = 6000
DECLARE
v_ename employees.last_name%TYPE;
v_sal employees.salary%TYPE := &p_sal;
BEGIN
SELECT last_name
INTO v_ename
FROM employees
WHERE salary = v_sal;
INSERT INTO messages (results)
VALUES (v_ename || ' ' || v_sal);
EXCEPTION
WHEN no_data_found THEN
INSERT INTO messages (results)
VALUES ('No employee with a salary of '||
TO_CHAR(v_sal));
WHEN too_many_rows THEN
INSERT INTO messages (results)
VALUES ('More than one employee with a salary of
'|| TO_CHAR(v_sal));
WHEN others THEN
INSERT INTO messages (results)
VALUES ('Some other error occurred.');
END;
/
SET VERIFY ON
7.
SET VERIFY OFF
VARIABLE g_message VARCHAR2(100)
DEFINE p_deptno = 200
DEFINE p_loc = 1400
DECLARE
e_invalid_dept EXCEPTION;
v_deptno departments.department_id%TYPE := &p_deptno;
BEGIN
UPDATE departments
SET location_id = &p_loc
WHERE department_id = &p_deptno;
COMMIT;
IF SQL%NOTFOUND THEN
raise e_invalid_dept;
END IF;
EXCEPTION
WHEN e_invalid_dept THEN
:g_message := 'Department '|| TO_CHAR(v_deptno) ||' is an
invalid department';
END;
/
SET VERIFY ON
PRINT g_message
8.
In iSQL*Plus, load and run the script file created in the above question.
VARIABLE g_sal NUMBER
VARIABLE g_job VARCHAR2(15)
EXECUTE query_emp (120, :g_sal, :g_job)
PRINT g_sal
PRINT g_job
Invoke the procedure again, passing an EMPLOYEE_ID of 300. What happens and why?
EXECUTE query_emp (300, :g_sal, :g_job)
There is no employee in the EMPLOYEES table with an EMPLOYEE_ID of 300. The
SELECT
statement retrieved no data from the database, resulting in a fatal PL/SQL error,
NO_DATA_FOUND.