Presentation is loading. Please wait.

Presentation is loading. Please wait.

Matthew P. Johnson, OCL1, CISDD CUNY, F20041 OCL1 Oracle 10g: SQL & PL/SQL Session #7 Matthew P. Johnson CISDD, CUNY Fall, 2004.

Similar presentations


Presentation on theme: "Matthew P. Johnson, OCL1, CISDD CUNY, F20041 OCL1 Oracle 10g: SQL & PL/SQL Session #7 Matthew P. Johnson CISDD, CUNY Fall, 2004."— Presentation transcript:

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;


Download ppt "Matthew P. Johnson, OCL1, CISDD CUNY, F20041 OCL1 Oracle 10g: SQL & PL/SQL Session #7 Matthew P. Johnson CISDD, CUNY Fall, 2004."

Similar presentations


Ads by Google