-- null-into-clarif.sql
-- last modified: 1-30-13
--
-- uses a table from set-up-ex-tbls.sql
--------
-- purpose: seeking to clarify when select-into inserts a NULL value,
--    and when it throws a NO_DATA_FOUND exception
--------
-- the key: what is select projecting?
-- LOOKS LIKE: if you project a COMPUTATION, and either all columns
--    involved in the computation are null OR are no rows,
--    then NULL is assigned;
--
-- BUT if you project a COLUMN, and no rows are selected,
--    then you get a NO_DATA_FOUND exception
-- example: first run set-up-ex-tbls.sql (provided with this example)
--    if you do not have empl table currently
set serveroutput on
create or replace procedure null_clarif(p_job_type varchar2) as
    commission_sum number;
    name_found     varchar2(30);
begin
    select sum(commission)
    into commission_sum
    from empl
    where job_title = p_job_type;
    if (commission_sum is null) then
        dbms_output.put_line('NULL assigned - no commissions for ' 
                             || p_job_type);
    else
        dbms_output.put_line('Commission sum for ' || p_job_type || ' is $' 
                             || commission_sum);
    end if;
    select empl_last_name
    into name_found
    from empl
    where job_title = p_job_type;
    if (name_found is null) then
        dbms_output.put_line('NULL assigned - no name found  for ' 
                             || p_job_type);
    else
        dbms_output.put_line('Name found for ' || p_job_type || ' is ' 
                             || name_found);
    end if;
EXCEPTION
    when NO_DATA_FOUND then
        dbms_output.put_line('NO_DATA_FOUND exception thrown!');
    when TOO_MANY_ROWS then
        dbms_output.put_line('TOO_MANY_ROWS exc - found TOO MANY names ' 
                             || 'for ' || p_job_type);
end;
/
show errors
-- salesmen have commissions, but are more than one ---
--     should see a commissions sum, but TOO_MANY_ROWS message
prompt
prompt running exec null_clarif('Salesman'):
prompt (   should see TOO_MANY_ROWS message)
prompt ==================================
exec null_clarif('Salesman')
-- more than one clerk exists, but have null commission;
--     should see NULL-assigned message for commissions,
--     TOO_MANY_ROWS message for names found
prompt
prompt running exec null_clarif('Clerk'):
prompt (   should see TOO_MANY_ROWS message)
prompt ==================================
exec null_clarif('Clerk')
-- no rows have job_title of Juiceman;
--     should see NULL-assigned message for commission 
--         (projecting computation),
--     NO_DATA_FOUND message when tried to assign into name_found:
prompt
prompt running exec null_clarif('Juiceman'):
prompt (   should see NO_DATA_FOUND message)
prompt ==================================
exec null_clarif('Juiceman')
-- exactly one president, with NO commission;
--    should see NULL-assigned message for commission,
--    name_found of King
prompt
prompt running exec null_clarif('President'):
prompt (   should see NULL-assigned message for commission)
prompt ==================================
exec null_clarif('President')