=====
CS 328 - Week 4 Lecture 2 - 2025-02-12
=====

=====
TODAY WE WILL:
=====
*   announcements
*   over to the DATA TIER: intro to PL/SQL
*   prep for next class

=====
*   should be working on Homework 3!
    *   at-least-1st-attempts need to be submitted by 11:59
        on Friday, February 14

*   continue completing zyBooks Chapters 1 & 2
    *   deadline for completing those for credit
        is 11:59 pm February 28 (Friday before Exam 1)

*   see the now-posted course PL/SQL style standards
    and some PL/SQL resources/references

=====
PL/SQL - "Procedural Language" SQL
=====
*   Oracle's implementation for extending SQL to include
    procedural structures (if statements, looping statements)
    and other related features (local variables, assignment,
    procedures, functions) that are common to procedural
    programming languages

    *   looks very much to me like it was influenced
        by the family of programming languages that includes
	Ada (ALGOL family)

    *   interesting aspects:
        *   these "live" on the data tier,
	    amongst the objects that make up your data,
	    
	    managed by the DBMS,
	    
	    EXECUTED on the data tier under the auspices
	    of the DBMS;

        *   these have useful access to the database relations,
	    and may be particularly useful for enhancing
	    DATA INTEGRITY,
	    and sometimes are a good choice for certain implementing
	    certain BUSINESS RULES

*   program "chunks"?
    *   stored procedure - a procedure stored as part of a database
    *   stored function - a function stored as part of a database
    *   trigger - also stored as part of a database

        ^ better "collective" name for these is SUBROUTINES

    *   function - expects 0 or more arguments, and returns something
        *   they certainly might have side-effects
    *   procedure - expects 0 or more arguments, but does NOT
        RETURN anything <-- better have side-effects!
	*   C++ void functions are kluging procedures...

    *   trigger - as discussed in CS 325 - it is not called directly,
        but is executed -- triggered -- when a specified action is
	done to the database

=====
more details!
=====
*   like SQL, PL/SQL is mostly NOT case-sensitive
    *   (except within string and character literals)

*   char and varchar2 literals are written in single quotes
    'moo'

=====
PL/SQL local variables and data types
=====
*   need these to control loops, hold computations in progress,
    etc.

*   Ada-like bit:
    local variables are declared giving the name THEN the data type!!!!!!!!!

    var_name var_type;

    quantity number;

*   Ada-like bit:
    where can you declare these?

    *   ONLY in the declare part of a block

        ...typically at the beginning of a block,
	and we'll discuss this more in a moment

    *   sometimes the declare part starts with the word
        DECLARE
	...except not always... more on that in a moment;

*   what types are available?
    *   if you can use a type for a SQL relation column,
        you can use it for a local variable type in PL/SQL

    *   PL/SQL also adds several additional types --
        LIKE boolean!!!!!!!!!!

    *   see the posted link for more PL/SQL data types

declare
    latest_hiredate date;
    num_invoices    integer;

*   there's even syntax for basing the type of a
    local variable on the type of a relation's attribute:

    tablename.columnname%TYPE

    rep_job_title empl.job_title%type;
    next_name     empl.empl_last_name%type;

=====
PL/SQL assignment operator
=====
*   this is       :=     here, NOT = !!!!!!!!!!!!!!!!!!!

*   = is used for equality comparison

*   it can be used in an assignment statement
    as well as to initialize a local variable

    declare
        count integer := 0;

    ...
        count := count + 1;

=====
can you print to the screen?
=====
*   this is executing on the data tier,
    anything a PL/SQL subroutine prints to the screen
    cannot make it to the application tier...

*   but...
    IF you run the following SQL*Plus command
    set serveroutput on

    ...THEN the following PL/SQL statement WILL print to
    the screen (to your sqlplus session):

    dbms_output.put_line('desired_string');

    *   hooray, concatenation works here! But it is SQL concatenation,
        so: ||

        (and you can concatenate non-string data to a string)

=====
comments
=====
-- single line comment

/* multi-
   line
   comment */

=====
you can select INTO a local variable using the INTO clause
=====

select expr1, expr2, ..
INTO   appropriate_local_variable, appr_2, ...
from   blah,...
where  blah...

*   you can't put a select at the top level of a PL/SQL block
    without an INTO clause

*   be careful to make sure the local variable's
    types are compatible with what the select is
    projecting --
    so-called scalar variables (single-valued) can only
    accept a single projected value;

=====
what can go in a PL/SQL block?
=====
*   PL/SQL statements
*   many SQL statements (with some restrictions)

*   NO SQL*Plus commands!!!

=====
where do you declare a PL/SQL subroutine?
=====
*   in a SQL script, in a file with suffix .sql
*   (and that script can contain PL/SQL, SQL, and SQL*Plus
    statement

=====
how do you compile a PL/SQL subroutine?
=====
*   in your .sql script,
    you create your subroutine, to create it,
    then you follow it -- on the line after the END; --
    with a / to compile it (!!!!!)

*   if there are errors, you can see the errors from
    the latest thing compiled with the SQL*Plus command
    show errors

   ...
END;
/
show errors

=====
SO!!!! basic procedure syntax:
=====

CREATE or replace PROCEDURE desired_proc_name(param_list) IS/AS
    local declarations
BEGIN
    body of procedure
END;
/
show errors 

*   FUN FACT that came up in WEEK 4 LAB EXERCISE:
    UNLIKE C++, if a procedure has NO parameters, you OMIT the () after
    the procedure name (empty () cause a compile-time error!!):

    CREATE or replace PROCEDURE no_arg_proc_name IS/AS
        ...

*   and see example stored procedure hello_world in posted
    SQL script hello.sql