IntotoPLSQL Newclass
IntotoPLSQL Newclass
IntotoPLSQL Newclass
What is PL/SQL
Procedural Language SQL An extension to SQL with design features of programming languages (procedural and object oriented) PL/SQL and Java are both supported as internal host languages within Oracle products.
Why PL/SQL
Acts as host language for stored procedures and triggers. Provides the ability to add middle tier business logic to client/server applications. Provides Portability of code from one environment to another Improves performance of multi-query transactions. Provides error handling
Procedure
PROCEDURE <name> IS BEGIN -statements EXCEPTION END;
Function
FUNCTION <name> RETURN <datatype> IS BEGIN -statements EXCEPTION END;
Note: Non PL/SQL variables include bind variables, host (global) variables, and parameters.
PL/SQL Comments
DECLARE v_salary number(9,2) := 40000; BEGIN /* this is a multi-line comment that will be ignored by the pl/sql interpreter */ v_salary := v_salary * 2; -- nice raise END; -- end of program
SELECT INTO
SET SERVEROUTPUT ON DECLARE v_max_gpa number(3,2); v_numstudents number(4); v_lname students.lname%type; v_major students.major%type; BEGIN select max(gpa) into v_max_gpa from students; DBMS_OUTPUT.PUT_LINE ('The highest GPA is '||v_max_gpa); select count(sid) into v_numstudents from students where gpa = v_max_gpa; IF v_numstudents > 1 then DBMS_OUTPUT.PUT_LINE ('There are '||v_numstudents||' with that GPA'); ELSE select lname, major into v_lname, v_major from students where gpa=v_max_gpa; DBMS_OUTPUT.PUT_LINE ('The student name is '||v_lname); DBMS_OUTPUT.PUT_LINE ('The student major is '||v_major); END IF; END;
%ROWTYPE
Set serveroutput on DECLARE v_student students%rowtype; BEGIN select * into v_student from students where sid='123456'; DBMS_OUTPUT.PUT_LINE (v_student.lname); DBMS_OUTPUT.PUT_LINE (v_student.major); DBMS_OUTPUT.PUT_LINE (v_student.gpa); END; /
CURSORS
A cursor is a private set of records An Oracle Cursor = VB recordset = JDBC ResultSet Implicit cursors are created for every query made in Oracle Explicit cursors can be declared by a programmer within PL/SQL.
Cursor Attributes
cursorname%ROWCOUNT cursorname%FOUND cursorname%NOTFOUND Cursorname%ISOPEN Rows returned so far One or more rows retrieved No rows found Is the cursor open
DECLARE CURSOR students_cursor IS SELECT last, major from students; v_Last students.last%type; v_major students.major%type; BEGIN DBMS_OUTPUT.PUT_LINE ('******************'); OPEN students_cursor; FETCH students_cursor into v_last, v_major; WHILE students_cursor%found LOOP DBMS_OUTPUT.PUT_LINE (v_last); DBMS_OUTPUT.PUT_LINE (v_major); DBMS_OUTPUT.PUT_LINE ('******************'); FETCH students_cursor into v_last, v_major; END LOOP; CLOSE students_cursor; END; /
Stored Procedures
PL/SQL code stored in the database and executed when called by the user. Called by procedure name from another PL/SQL block or using EXECUTE from SQL+. For example EXEC SQR(50) Example: Create procedure SQR (v_num_to_square IN number) AS v_answer number(10); BEGIN v_answer := v_num_to_square * v_num_to_square; dbms_output.put_line(v_answer); END; /
Function
PL/SQL user defined function stored in the database and executed when a function call is made in code: example x := SQUARED(50) Example: Create or Replace Function SQUARED (p_number_to_square IN number) RETURN number IS v_answer number(10); BEGIN v_answer := p_number_to_square * p_number_to_square; RETURN(v_answer); END; /
Triggers
PL/SQL code executed automatically in response to a database event, typically DML. Like other stored procedures, triggers are stored in the database. Often used to:
enforce complex constraints, especially multi-table constraints. Financial posting is an example of this. Trigger related actions implement auditing logs pop a sequence when creating token keys
Triggers do not issue transaction control statements (such as commit). Triggers are part of the SQL transaction that invoked them. USER_TRIGGERS provides a data dictionary view of triggers.
Triggers
CREATE OR REPLACE TRIGGER <trigger_name> [BEFORE/AFTER][DELETE/INSERT/UPDATE of <column_name |, column_name |> ON <table_name> |FOR EACH ROW| |WHEN <triggering condition>| |DECLARE| BEGIN trigger statements END; To delete a trigger use: DROP TRIGGER <trigger_name>;
SEQUENCE
CREATE SEQUENCE <sequence_name> |INCREMENT BY <number>| |START WITH <start_value>| |MAXVALUE <maximum_value>|NOMAXVALUE| |MINVALUE <minimum_value>| |CYCLE|NOCYLE| |CACHE <number of values>|NOCACHE| |ORDER|NOORDER|
To pop the next sequence use: SEQUENCENAME.NEXTVAL (CURRVAL shows last pop)