1 Pls QL Introduction
1 Pls QL Introduction
1 Pls QL Introduction
PL/SQL
PL/SQL is Oracle's procedural language extension to SQL, the non-procedural relational database language. With PL/SQL, you can use SQL statements to manipulate ORACLE data and the flow of control statements to process the data. Moreover, you can declare constants and variables, define subprograms (procedures and functions), and trap runtime errors. Thus, PL/SQL combines the data manipulating power of SQL with the data processing power of procedural languages.
Bordoloi and Bock
PL/SQL
Many Oracle applications are built using client-server architecture. The Oracle database resides on the server. The program that makes requests against this database resides on the client machine. This program can be written in C, Java, or PL/SQL. While PL/SQL is just like any other programming language, it has syntax and rules that determine how programming statements work together. It is important for you to realize that PL/SQL is not a stand-alone programming language. PL/SQL is a part of the Oracle RDBMS, and it can reside in two environments, the client and the server.
Bordoloi and Bock
PL/SQL
As a result, it is very easy to move PL/SQL modules between server-side and client-side applications. When the PL/SQL engine is located on the server, the whole PL/SQL block is passed to the PL/SQL engine on the Oracle server. The PL/SQL engine processes the block according to the Figure 2.1.
PL/SQL
When the PL/SQL engine is located on the client, as it is in the Oracle Developer Tools, the PL/SQL processing is done on the client side. All SQL statements that are embedded within the PL/SQL block are sent to the Oracle server for further processing. When PL/SQL block contains no SQL statement, the entire block is executed on the client side.
PL/SQL BLOCKS
PL/SQL blocks can be divided into two groups:
1. Named and 2. Anonymous.
Named blocks are used when creating subroutines. These subroutines are procedures, functions, and packages. The subroutines can be stored in the database and referenced by their names later on. In addition, subroutines can be defined within the anonymous PL/SQL block. Anonymous PL/SQL blocks do not have names. As a result,they cannot be stored in the database and referenced later.
The executable section is the only mandatory section of the block. Both the declaration and exception-handling sections are optional.
DECLARATION SECTION
The declaration section is the first section of the PL/SQL block. It contains definitions of PL/SQL identifiers such as variables, constants, cursors and so on. Example DECLARE v_first_name VARCHAR2(35) ; v_last_name VARCHAR2(35) ; v_counter NUMBER := 0 ;
EXECUTABLE SECTION
The executable section is the next section of the PL/SQL block. This section contains executable statements that allow you to manipulate the variables that have been declared in the declaration section.
BEGIN SELECT first_name, last_name INTO v_first_name, v_last_name FROM student WHERE student_id = 123 ; DBMS_OUTPUT.PUT_LINE (Student name : || v_first_name || || v_last_name); END;
Bordoloi and Bock
EXCEPTION-HANDLING SECTION
The exception-handling section is the last section of the PL/SQL block. This section contains statements that are executed when a runtime error occurs within a block. Runtime errors occur while the program is running and cannot be detected by the PL/SQL compiler.
EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE ( There is no student with student id 123 ); END;
PL/SQL IN SQL*PLUS
SQL*Plus is an interactive tool that allows you to type SQL or PL/SQL statements at the command prompt. These statements are then sent to the database. Once they are processed, the results are sent back from the database and displayed on the screen. There are some differences between entering SQL and PL/SQL statements.
Bordoloi and Bock
SQL EXAMPLE
SELECT first_name, last_name FROM student;
The semicolon terminates this SELECT statement. Therefore, as soon as you type semicolon and hit the ENTER key, the result set is displayed to you.
PL/SQL EXAMPLE
DECLARE v_first_name VARCHAR2(35); v_last_name VARCHAR2(35); BEGIN SELECT first_name, last_name INTO v_first_name, v_last_name FROM student WHERE student_id = 123; DBMS_OUTPUT.PUT_LINE ('Student name: '||v_first_name||' '||v_last_name); EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE ('There is no student with student id 123'); END; . Bordoloi and Bock /
PL/SQL EXAMPLE
There are two additional lines at the end of the block containing . and /. The . marks the end of the PL/SQL block and is optional. The / executes the PL/SQL block and is required. When SQL*Plus reads SQL statement, it knows that the semicolon marks the end of the statement. Therefore, the statement is complete and can be sent to the database. When SQL*Plus reads a PL/SQL block, a semicolon marks the end of the individual statement within the block. In other words, it is not a block terminator.
PL/SQL EXAMPLE
Therefore, SQL*Plus needs to know when the block has ended. As you have seen in the example, it can be done with period and forward slash.
EXECUTING PL/SQL
PL/SQL can be executed directly in SQL*Plus. A PL/SQL program is normally saved with an .sql extension. To execute an anonymous PL/SQL program, simply type the following command at the SQL prompt: SQL> @DisplayAge
GENERATING OUTPUT
Like other programming languages, PL/SQL provides a procedure (i.e. PUT_LINE) to allow the user to display the output on the screen. For a user to able to view a result on the screen, two steps are required.
SQL>
or put the command at the beginning of the program, right before the declaration section.
Bordoloi and Bock
GENERATING OUTPUT
Second, use DBMS_OUTPUT.PUT_LINE in your
executable section to display any message you want to the screen.
SUBSTITUTIONVARIABLES
SQL*Plus allows a PL/SQL block to receive input information with the help of substitution variables. Substitution variables cannot be used to output the values because no memory is allocated for them. SQL*Plus will substitute a variable before the PL/SQL block is sent to the database. Substitution variables are usually prefixed by the ampersand(&) character or double ampersand (&&) character.
EXAMPLE
DECLARE v_student_id NUMBER := &sv_student_id; v_first_name VARCHAR2(35); v_last_name VARCHAR2(35); BEGIN SELECT first_name, last_name INTO v_first_name, v_last_name FROM student WHERE student_id = v_student_id; DBMS_OUTPUT.PUT_LINE ('Student name: '||v_first_name||' '||v_last_name); EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('There is no such student'); END;
Bordoloi and Bock
EXAMPLE
When this example is executed, the user is asked to provide a value for the student ID. The example shown above uses a single ampersand for the substitution variable. When a single ampersand is used throughout the PL/SQL block, the user is asked to provide a value for each occurrence of the substitution variable.
EXAMPLE
BEGIN DBMS_OUTPUT.PUT_LINE('Today is ||&sv_day'); DBMS_OUTPUT.PUT_LINE('Tomorrow will be || &sv_day'); END; This example produces the following output: Enter value for sv_day: Monday old 2: DBMS_OUTPUT.PUT_LINE('Today is || &sv_day'); new 2: DBMS_OUTPUT.PUT_LINE('Today is || Monday'); Enter value for sv_day: Tuesday old 3: DBMS_OUTPUT.PUT_LINE('Tomorrow will be || &sv_day'); new 3: DBMS_OUTPUT.PUT_LINE('Tomorrow will be || Tuesday'); Today is Monday Tomorrow will be Tuesday PL/SQL procedure successfully completed.
Bordoloi and Bock
EXAMPLE
When a substitution variable is used in the script, the output produced by the program contains the statements that show how the substitution was done. If you do not want to see these lines displayed in the output produced by the script, use the SET command option before you run the script as shown below: SET VERIFY OFF;
EXAMPLE
Then, the output changes as shown below:
Enter value for sv_day: Monday Enter value for sv_day: Tuesday Today is Monday Tomorrow will be Tuesday PL/SQL procedure successfully completed.
The substitution variable sv_day appears twice in this PL/SQL block. As a result, when this example is run, the user is asked twice to provide the value for the same variable.
EXAMPLE
BEGIN DBMS_OUTPUT.PUT_LINE('Today is '||'&&sv_day'); DBMS_OUTPUT.PUT_LINE('Tomorrow will be || &sv_day'); END;
In this example, substitution variable sv_day is prefixed by double ampersand in the first DBMS_OUTPUT.PUT_LINE statement. As a result, this version of the example produces different output.
OUTPUT
Enter value for sv_day: Monday old 2: DBMS_OUTPUT.PUT_LINE('Today is || &&sv_day'); new 2: DBMS_OUTPUT.PUT_LINE('Today is || Monday'); old 3: DBMS_OUTPUT.PUT_LINE('Tomorrow will be || &sv_day'); new 3: DBMS_OUTPUT.PUT_LINE('Tomorrow will be || Monday');
It is clear that the user is asked only once to provide the value for the substitution variable sv_day. As a result, both DBMS_OUTPUT.PUT_LINE statements use the value of Monday entered previously by the user.
Bordoloi and Bock
Substitution Variables
Ampersand(&) character and double ampersand (&&) characters are the default characters that denote substitution variables. There is a special SET command option available in SQL*Plus that allows to change the default character (&) to any other character or disable the substitution variable feature. This SET command has the following syntax:
SET DEFINE character or SET DEFINE ON or SET DEFINE OFF
Bordoloi and Bock
Substitution Variables
The first set command option changes the prefix of the substitution variable from an ampersand to another character. This character cannot be alphanumeric or white space. The second (ON option) and third (OFF option) control whether SQL*Plus will look for substitution variables or not. In addition, ON option changes the value of the character back to the ampersand.