Download presentation
Presentation is loading. Please wait.
1
Matthew P. Johnson, OCL1, CISDD CUNY, F20041 OCL1 Oracle 10g: SQL & PL/SQL Session #7 Matthew P. Johnson CISDD, CUNY Fall, 2004
2
Matthew P. Johnson, OCL1, CISDD CUNY, F2004 2 Agenda Last time: Programming for SQL Pro*C, JDBC This time: SPs in PL/SQL Next time: More PL/SQL Triggers
3
Matthew P. Johnson, OCL1, CISDD CUNY, F2004 3 Step back Recall basic problem: need SQL plus stronger programming lang need to connect the two langs In all these cases (and in the web app case), idea is: put SQL in (traditional-lang) programs Another way: put programs in SQL i.e., store programs on the DBMS “stored procedures”
4
Matthew P. Johnson, OCL1, CISDD CUNY, F2004 4 Next topic: SPs “Persistent, Stored Modules” / “Stored Procedures / “PL/SQL programs” (in Oracle) Another way to connect application programming language and SQL Supports usual things: Declare, set vars to vals of expressions Print output Define (optional) procedures, functions Cursors PL/SQL can compute n!
5
Matthew P. Johnson, OCL1, CISDD CUNY, F2004 5 Integration with SQL DECLARE l_book_count INTEGER; BEGIN SELECT COUNT(*) INTO l_book_count FROM books WHERE author LIKE '%FEUERSTEIN, STEVEN%'; DBMS_OUTPUT.PUT_LINE ( 'Steven has written (or co-written) ' || l_book_count || ' books.'); -- Oh, and I changed my name, so... UPDATE books SET author = REPLACE (author, 'STEVEN', 'STEPHEN') WHERE author LIKE '%FEUERSTEIN, STEVEN%'; END; DECLARE l_book_count INTEGER; BEGIN SELECT COUNT(*) INTO l_book_count FROM books WHERE author LIKE '%FEUERSTEIN, STEVEN%'; DBMS_OUTPUT.PUT_LINE ( 'Steven has written (or co-written) ' || l_book_count || ' books.'); -- Oh, and I changed my name, so... UPDATE books SET author = REPLACE (author, 'STEVEN', 'STEPHEN') WHERE author LIKE '%FEUERSTEIN, STEVEN%'; END;
6
Matthew P. Johnson, OCL1, CISDD CUNY, F2004 6 PL/SQL “Procedural Language/SQL” Oracle’s language for stored procedures Simple, interpreted, procedural language But Pascal-like: BEGIN END, not { } AND OR, not && || vars defined at top of procedre how return works
7
Matthew P. Johnson, OCL1, CISDD CUNY, F2004 7 PL/SQL Generally speaking can be used wherever SQL can be sqlplus embeded SQL JDBC Can store programs in files (.sql), run later @myprog.sql runs code in myprog.sql
8
Matthew P. Johnson, OCL1, CISDD CUNY, F2004 8 Scripting languages Big problems v. small problems Big solutions v. small solutions Programming languages: C/C++, Java, etc. Scripting languages: PL/SQL, Perl, PHP, Unix shell, DOS batch files, Python, Excel macros, VBA, JavaScript Usual properties of scripting languages: Interpreted Though now compiled to bytecode or (optionally) to native Don’t require functions/procedures Though now supported Weakly typed Lots of auto-conversion
9
Matthew P. Johnson, OCL1, CISDD CUNY, F2004 9 PL/SQL: Hello, World http://pages.stern.nyu.edu/~mjohnson/dbms/eg/lec19/hello.sql BEGIN -- print out message DBMS_OUTPUT.PUT_LINE('Hello World, from PL/SQL'); END; / BEGIN -- print out message DBMS_OUTPUT.PUT_LINE('Hello World, from PL/SQL'); END; /
10
Matthew P. Johnson, OCL1, CISDD CUNY, F2004 10 Hello, World Try again… SET SERVEROUTPUT ON BEGIN -- print out message DBMS_OUTPUT.PUT_LINE('Hello World, from PL/SQL'); END; / SET SERVEROUTPUT ON BEGIN -- print out message DBMS_OUTPUT.PUT_LINE('Hello World, from PL/SQL'); END; /
11
Matthew P. Johnson, OCL1, CISDD CUNY, F2004 11 Use start-up script Go to \sqlplus\admin\glogin.sql Start-up script run upon login to SQL*Plus Add “SET SERVEROUTPUT ON” to it If running non-i version of SQL*Plus, also looks in current dir for login.sql script
12
Matthew P. Johnson, OCL1, CISDD CUNY, F2004 12 How to run code The code before ended with a forward slash Not SQL and not PL/SQL – just for SQL*Plus to tell it to run the code entered Must go on its own line O.w., will be ignored and then interpreted as part of code, causing an error To call a procedure in SQL*Plus, can also use execute/exec: exec DBMS_OUTPUT.PUT_LINE('Hello World, from PL/SQL')
13
Matthew P. Johnson, OCL1, CISDD CUNY, F2004 13 How to run code EXEC is just short-hand: SQL> exec dbms_output.put_line('hi '); dbms_output.put_line('there'
14
Matthew P. Johnson, OCL1, CISDD CUNY, F2004 14 PL/SQL operators/symbols ;end statement %attribute indicator (cursor attributes like %ISOPEN and indirect declaration attributes like %ROWTYPE :host variable indicator <> and !=not-equal-to =equal-to :=assignment op ** exponentiation operator --, /* and */, rem comments
15
Matthew P. Johnson, OCL1, CISDD CUNY, F2004 15 Var names identifiers limited to 30 alpha-num chars Must start with letter, $, _, or # E.g.: abc, $a$, $$$ PL/SQL is case Insensitive abc, ABC, AbC all the same Unless you use double-quotes…
16
Matthew P. Johnson, OCL1, CISDD CUNY, F2004 16 Literals Numbers: 123, 12.3, 3.05E19, 12e-5, null String: ‘abc’, ‘AbC’, null String comparison is case-SENSitive Boolean: true, false, null true != ‘true’ No date literals, as in regular SQL To_date('31-JAN-94') Escape single-quotes in strings with two single- quotes ‘it’’s’ it’s '''''' ''
17
Matthew P. Johnson, OCL1, CISDD CUNY, F2004 17 Blocks PL/SQL is a block-structured language Block = seq. of instructions, with scope Can have anonymous blocks And named blocks Procedures Functions
18
Matthew P. Johnson, OCL1, CISDD CUNY, F2004 18 Structure of a block As in Pascal, var declars precede body header--if named DECLARE--optional --var declarations BEGIN --executable statements --queries/updates, etc. EXCEPTION--optional --catch exceptions END; /--to execute header--if named DECLARE--optional --var declarations BEGIN --executable statements --queries/updates, etc. EXCEPTION--optional --catch exceptions END; /--to execute
19
Matthew P. Johnson, OCL1, CISDD CUNY, F2004 19 PL/SQL code examples One example: Likes(drinker, beverage) Another example: http://pages.stern.nyu.edu/~mjohnson/dbms/eg/lec19/age.sql http://pages.stern.nyu.edu/~mjohnson/dbms/eg/lec19/age.sql BEGIN INSERT INTO Likes VALUES(‘Izzy', ‘milk'); DELETE FROM Likes WHERE drinker = ‘Izzy' AND beverage = ‘Beaujolais Nouveau '; COMMIT; END; / BEGIN INSERT INTO Likes VALUES(‘Izzy', ‘milk'); DELETE FROM Likes WHERE drinker = ‘Izzy' AND beverage = ‘Beaujolais Nouveau '; COMMIT; END; /
20
Matthew P. Johnson, OCL1, CISDD CUNY, F2004 20 Procedures Stored database objects that use a PL/SQL statement(s) in their body Create/drop similar to other SQL objects: ALTER PROCEDURE… in MySQL CREATE PROCEDURE ( ) ; CREATE PROCEDURE ( ) ; DROP PROCEDURE ; CREATE OR REPLACE PROCEDURE ( ) ; CREATE OR REPLACE PROCEDURE ( ) ;
21
Matthew P. Johnson, OCL1, CISDD CUNY, F2004 21 Example procedure Define the procedure: Now we can call it: CREATE PROCEDURE testProcedure BEGIN INSERT INTO Student VALUES (5, ‘Joe’); COMMIT; END; CREATE PROCEDURE testProcedure BEGIN INSERT INTO Student VALUES (5, ‘Joe’); COMMIT; END; EXEC testProcedure
22
Matthew P. Johnson, OCL1, CISDD CUNY, F2004 22 More details on procedures Parameter list has name-mode-type triples: Modes: IN, OUT, or IN OUT Fulfills role similar to pass-by-value v. pass-by- reference Default is IN Types must match, so can get exact field type: relation.attribute%TYPE
23
Matthew P. Johnson, OCL1, CISDD CUNY, F2004 23 Procedure example A procedure to take a beer and price and add it to Joe's menu: Sells(bar, beer, price) CREATE PROCEDURE izzyMenu( b IN Sells.beer%TYPE, p IN Sells.price%TYPE) AS BEGIN INSERT INTO Sells VALUES(‘Izzy’’s', b, p); END; / CREATE PROCEDURE izzyMenu( b IN Sells.beer%TYPE, p IN Sells.price%TYPE) AS BEGIN INSERT INTO Sells VALUES(‘Izzy’’s', b, p); END; /
24
Matthew P. Johnson, OCL1, CISDD CUNY, F2004 24 Functions Like procedures but with return values Big strength: can be called from SQL CREATE FUNCTION ( ) RETURNS type AS BEGIN END; CREATE FUNCTION ( ) RETURNS type AS BEGIN END; DROP FUNCTION ;
25
Matthew P. Johnson, OCL1, CISDD CUNY, F2004 25 Function example Like procedures but with return values drop in same way Big strength: can be called from SQL http://pages.stern.nyu.edu/~mjohnson/dbms/eg/lec19/maxval.sql CREATE OR REPLACE FUNCTION maxval(a IN int, b IN int) RETURN int AS BEGIN IF a > b THEN RETURN a; ELSE RETURN b; END IF; END maxval; CREATE OR REPLACE FUNCTION maxval(a IN int, b IN int) RETURN int AS BEGIN IF a > b THEN RETURN a; ELSE RETURN b; END IF; END maxval; INSERT INTO R VALUES(“abc”, maxval(5,10));
26
Matthew P. Johnson, OCL1, CISDD CUNY, F2004 26 How to run scripts Don’t want to type ftns into sqlplus by hand Define them in a.sql file In sqlplus, execute.sql file Runs commands in file Here, defines function Now, we can call functions See http://pages.stern.nyu.edu/~mjohnson/dbms/eg/lec19/plsql.txt SQL> @maxval.sql SQL> exec DBMS_OUTPUT.PUT_LINE (maxval(5,10))
27
Matthew P. Johnson, OCL1, CISDD CUNY, F2004 27 How to run scripts Can also use the start command: If no file extension is given,.sql is assumed Can use full paths: Scripts can call other scripts Use @ for current dir, @@ for dir of current script Scripts are not (by default) echoed. Can use: SQL> START maxval.sql SQL> @c:\somewhere\maxval.sql SQL> SET ECHO ON
28
Matthew P. Johnson, OCL1, CISDD CUNY, F2004 28 Word count program CREATE OR REPLACE FUNCTION wordcount (str IN VARCHAR2) RETURN PLS_INTEGER AS /* words PLS_INTEGER := 0; ***Commented out for intentional error*** */ len PLS_INTEGER := NVL(LENGTH(str),0); inside_a_word BOOLEAN; BEGIN FOR i IN 1..len + 1 LOOP IF ASCII(SUBSTR(str, i, 1)) len THEN IF inside_a_word THEN words := words + 1; inside_a_word := FALSE; END IF; ELSE inside_a_word := TRUE; END IF; END LOOP; RETURN words; END; CREATE OR REPLACE FUNCTION wordcount (str IN VARCHAR2) RETURN PLS_INTEGER AS /* words PLS_INTEGER := 0; ***Commented out for intentional error*** */ len PLS_INTEGER := NVL(LENGTH(str),0); inside_a_word BOOLEAN; BEGIN FOR i IN 1..len + 1 LOOP IF ASCII(SUBSTR(str, i, 1)) len THEN IF inside_a_word THEN words := words + 1; inside_a_word := FALSE; END IF; ELSE inside_a_word := TRUE; END IF; END LOOP; RETURN words; END;
29
Matthew P. Johnson, OCL1, CISDD CUNY, F2004 29 Intermission Fill out evals Scottish Parliament/Outer join exercises Work on exercises 1-3 of lab 7
30
Matthew P. Johnson, OCL1, CISDD CUNY, F2004 30 Getting errors Simple says: To get actual errors, say SHOW ERR(ORS) Can also get errors per object: Warning: must get object type right! Can also look at user_errors tbl directly Warning: Function created with compilation errors. SQL> show errors function wordcount
31
Matthew P. Johnson, OCL1, CISDD CUNY, F2004 31 Calling functions and procedures Procedures can simple executed, ftns can’t How to just call a ftn? Can use dbms_output, as seen Can also select the ftn value from dual Also, can describe ftns and procs: SQL> select(wordcount(‘hi there’) from dual; SQL> describe wordcount
32
Matthew P. Johnson, OCL1, CISDD CUNY, F2004 32 Look up procedures, functions In Oracle, functions & procedures in user_procedures: SELECT object_name from user_procedures;
33
Matthew P. Johnson, OCL1, CISDD CUNY, F2004 33 Subblocks Blocks may contain blocks, for narrower scope: PROCEDURE calc_totals IS year_total NUMBER; BEGIN year_total := 0; /* Nested anonymous block */ DECLARE month_total NUMBER; BEGIN month_total := year_total / 12; END; PROCEDURE calc_totals IS year_total NUMBER; BEGIN year_total := 0; /* Nested anonymous block */ DECLARE month_total NUMBER; BEGIN month_total := year_total / 12; END;
34
Matthew P. Johnson, OCL1, CISDD CUNY, F2004 34 Branching IF–THEN statements use THEN Must end with END IF Use ELSIF in place of ELSE IF Example: http://pages.stern.nyu.edu/~mjohnson/dbms/eg/lec19/maxval.sql http://pages.stern.nyu.edu/~mjohnson/dbms/eg/lec19/maxval.sql IF THEN ELSIF END IF; IF THEN ELSIF END IF;
35
Matthew P. Johnson, OCL1, CISDD CUNY, F2004 35 More ifs IF ELSE END IF; IF ELSE END IF; IF ELSEIF ELSE END IF; IF ELSEIF ELSE END IF;
36
Matthew P. Johnson, OCL1, CISDD CUNY, F2004 36 Multiple elsifs An if statement can have multiple elseifs: The elseif clauses are not mutually exclusive IF salary >= 10000 AND salary <= 20000 THEN give_bonus(employee_id, 1500); ELSIF salary > 20000 AND salary <= 40000 THEN give_bonus(employee_id, 1000); ELSIF salary > 40000 THEN give_bonus(employee_id, 400); END IF; IF salary >= 10000 AND salary <= 20000 THEN give_bonus(employee_id, 1500); ELSIF salary > 20000 AND salary <= 40000 THEN give_bonus(employee_id, 1000); ELSIF salary > 40000 THEN give_bonus(employee_id, 400); END IF;
37
Matthew P. Johnson, OCL1, CISDD CUNY, F2004 37 Nested ifs As usual, if statements can be nested: Can often be replaced with an ANDed condition IF condition1 THEN IF condition2 THEN statements2 ELSE IF condition3 THEN statements3 ELSIF condition4 THEN statements4 END IF; IF condition1 THEN IF condition2 THEN statements2 ELSE IF condition3 THEN statements3 ELSIF condition4 THEN statements4 END IF;
38
Matthew P. Johnson, OCL1, CISDD CUNY, F2004 38 Loop example DECLARE i NUMBER := 1; BEGIN LOOP INSERT INTO T1 VALUES(i,i); i := i+1; EXIT WHEN i>100; END LOOP; END; / DECLARE i NUMBER := 1; BEGIN LOOP INSERT INTO T1 VALUES(i,i); i := i+1; EXIT WHEN i>100; END LOOP; END; /
39
Matthew P. Johnson, OCL1, CISDD CUNY, F2004 39 More loops Infinite loop: while loop: LOOP executable_statements; END LOOP; LOOP executable_statements; END LOOP; WHILE condition LOOP executable_statements; END LOOP; WHILE condition LOOP executable_statements; END LOOP;
40
Matthew P. Johnson, OCL1, CISDD CUNY, F2004 40 More loops Numerical for loop: Cursor for loop: FOR for_index IN low_value.. high_value LOOP executable_statements; END LOOP; FOR for_index IN low_value.. high_value LOOP executable_statements; END LOOP; FOR record_index IN my_cursor LOOP executable_statements; END LOOP; FOR record_index IN my_cursor LOOP executable_statements; END LOOP;
Similar presentations
© 2025 SlidePlayer.com Inc.
All rights reserved.