Oracle 10g Made Easy

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 86

Oracle 10g Made Easy

Training Name:

Overview of this Training

Oracle is the world’s largest business software company which provide simple to deploy,
packaged, enterprise-class software solutions to organizations. This Training curriculum
is developed to teach you skills that directly align with real-life IT jobs. The course offers
a hands-on approach to the Oracle11g database and Developer Suite Fusion Middleware.
You will learn SQL, PLSQL, FORMS, REPORTS and DBA Fundamentals of Oracle 11g
in a single package.

This Oracle training gives you strong fundamentals to cope with todays business needs.
You'll discover professional tips and techniques for brilliant and distinctive output as an
Oracle Programmer and/or DBA.

Objective of this Training

This course will make you skilled IT professional that will lead you towards excellence.
Each student will be able to get Oracle database and programming knowledge acquired in
class and use it immediately with success in the corporate world. The rigorous pace of the
course will benefit the student immensely. The student will be able to work as a Data
Architect, Data Analyst, Business Systems Analyst or Oracle Programmer in any
organization. The course will prepare the student for the challenges of these demanding
positions with specialized emphasis on Oracle technology.

Professional technique of Programming and DBA can build a robust ERP within a very
short period of time with less number of Programmers. In addition, your superior will
notice that you are skilled with Programming, DBA and Analysys activities. This of
course leads to promotion more quickly. Certification magazine found that Oracle
Professionals earn higher salaries when compared to other DBA or Developer
professionals.

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 1 of 86


Oracle 10g Made Easy

About the Author

Muhammad Abdullah Al Noor

Muhammad Abdullah Al Noor is an IT professional having 10+ years hands-on


experience in creating large ERPs with oracle. His areas of expertise are Project
Management, Software Development, Database Management, Performance tuning and
lead team of developers and DBAs.

He has experience from different financial institutes which includes Life Insurance ERPs,
Human Resource Management, Inventory Management etc. Currently, he is working in a
Life Insurance company as an IT Incharge.

Apart from his technical and creative contributions to the company, Mr. Muhammad
Abdullah Al Noor is an Oracle Trainer at various IT Training Institutes. He has
successfully conducted a good number of sessions on Oracle Database and Programming
up to advance level.

Mr. Muhammad Abdullah Al Noor is an MBA (MIS) and OCP (Oracle Certified
Professional).

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 2 of 86


Oracle 10g Made Easy

Table of Contents

Session -1: (Overview and Database Administration) :


1. Overview and Orientation of Course.
2. Configuring the oracle environment, e.g. tnsnames.ora, Net Manager, Net Configuration
Assistant, DBCA, DBCONSOLE, EM. And Services.
3. Oracle instance and database overview.
4. Exploring the storage structure of the oracle database. e.g. table space, data files, Control
files, redo logs, undo table spaces and SPFiles.
5. Data and Index Tables pace Creation.
6. Database Recovery – A Basic method.
Session -2: (SQL- DML):
1. Retrieving Data Using the SQL SELECT Statement.
2. Restricting and Sorting Data.
3. Using Single Row Functions and its mostly used functions.
4. Reporting Aggregated Data Using the Group Functions.
5. Displaying Data From Multiple Tables.
6. Using Sub queries to Solve Queries.
Session -3: (SQL- DCL & DDL):
1. Manipulating Data.
2. Using DDL Statements to Create and Manage Tables Including Constraints.
3. Creating Other Schema Objects.
4. Controlling User Access.
Session -4: (PL/SQL-Variables, IF-Then-Else and Cursors):
1. Declaring Variables.
2. Writing Executable Statements.
3. Interacting with the Oracle Server.
4. Writing Control Structures.
5. Working with Composite Data Types.
6. Writing Implicit and Explicit Cursors.
7. Handling Exceptions.
Session -5: (PL/SQL-Procedures & Functions):
1. Creating Anonymous PL/SQl Block.
2. Creating Procedures.
3. Creating Functions.
4. Creating Packages.
5. Creating Database Triggers.
Session-6: (Forms Developer Suite- Forms and MVC):
1. Wizard Based Forms with Enter, Execute and Cancel Query.
2. Forms Properties.
3. Understanding forms triggers.
4. Create forms with Model.
5. Validate the Model Form e.g. Messages and Alerts.
6. Creating Menus.
7. Creating different kinds of Oracle Reports.
8. Developer/Reports Installation and Configurations

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 3 of 86


Oracle 10g Made Easy

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 4 of 86


Oracle 10g Made Easy

1. Overview and Orientation of Course:

What is Oracle?

The Oracle Database (commonly referred to as Oracle RDBMS or simply as Oracle) is an


object-relational database management system produced and marketed by Oracle
Corporation.

Larry Ellison and his friends, former co-workers Bob Miner and Ed Oates, started the
consultancy Software Development Laboratories (SDL) in 1977. SDL developed the
original version of the Oracle software. The name Oracle comes from the code-name of a
CIA-funded project Ellison had worked on while previously employed by Ampex.

Oracle Certification Program:

The Oracle Certification Program, a professional certification program, includes the


administration of Oracle Databases as one of its main certification paths. It contains three
levels:

 Oracle Certified Associate (OCA)


 Oracle Certified Professional (OCP)
 Oracle Certified Master (OCM)

Web Links :

http://education.oracle.com/pls/web_prod-plq-
dad/db_pages.getpage?page_id=458&get_params=p_track_id:PLSQL

http://education.oracle.com/pls/web_prod-plq-
dad/db_pages.getpage?page_id=458&get_params=p_track_id:Datab10g

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 5 of 86


Oracle 10g Made Easy

Oracle PL/SQL and Oracle Forms Developer:

Oracle offers a complete, integrated set of application development tools that support any
development approach, technology platform, or operating system.

Oracle PL/SQL Developer Certified Associates demonstrate expertise in building


database-centric Internet applications for both Oracle9i and Oracle Database 10g. Oracle
Forms Developer Certified Professionals gain greater credibility, a higher level of
efficiency, and improved job performance as application developers.

STEP 1 – PASS THIS EXAM


Choose one of these exams:
1Z0-007 Introduction to Oracle9i SQL®
or
1Z0-047 Oracle Database SQL Expert

STEP 2 – PASS THIS EXAM


1Z0-147 Program with PL/SQL

Certification:
Oracle PL/SQL Developer Certified Associate.

STEP 3 – PASS THIS EXAM


1Z0-141 Oracle Forms: Build Internet Applications

Certification:
Oracle Forms Developer Certified Professional (OCP)

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 6 of 86


Oracle 10g Made Easy

Oracle Database 10g Administrator:


Oracle Database 10g is Oracle’s largest introduction of new functionality and is Oracle’s
most innovative release, leading the database industry into new ground in clustering,
automation, high availability and more.

Oracle Database 10g Administrator Certification combines training, experience, and


testing to ensure that you have a strong foundation and expertise in the industry’s most
advanced database management system.

STEP 1 - PASS THIS EXAM

Choose one of these exams:

1Z0-007 Introduction to Oracle9i SQL


or
1Z0-047 Oracle Database SQL Expert

STEP 2 - PASS THIS EXAM

1Z0-042 Oracle Database 10g: Administration I

Certification:
Oracle Database 10g Administrator Certified Associate.(OCP)

STEP 3 - PASS THIS EXAM

1Z0-043 Oracle Database 10g: Administration II

Certification: (You must complete one of the course (1Z0-042 or 1Z0-043) from an oracle
authorized institution):
Certification:

Oracle Database 10g Administrator Certified Professional.

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 7 of 86


Oracle 10g Made Easy

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 8 of 86


Oracle 10g Made Easy

Oracle instance and database overview.

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 9 of 86


Oracle 10g Made Easy

Some basic Networking concepts.

1. tnsnames.ora :
TNSNAMES.ORA is a SQL*Net configuration file that defines databases addresses for
establishing connections to them. This file normally resides in the ORACLE
HOME\NETWORK\ADMIN directory.

E.g. E:\oracle\product\10.2.0\db_1\network\ADMIN\tnsnames.ora

The TNSNAMES.ORA files are located on both client and server systems. If you make
configuration changes on the server ($ORACLE_HOME/network/admin/tnsnames.ora)
ensure you can connect to the database through the listener if you are logged on to the
server. If you make configuration changes on the client
(g:\oracle\product\10.2.0\db_1\network\admin\tnsnames.ora) ensure you can connect
from your client workstation to the database through the listener running on the server.

Sample :

ORA11 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = ORA11)
)
)

Configuration Here:
ORA11 = Database Name.
HOST = 127.0.0.1 or Computer Name/Hostname
SERVICE_NAME = Service Name.

2. Net Manager :

Oracle Net Manager is a graphical user interface tool that combines configuration
abilities with Oracle Names component control to provide an integrated environment for
configuring and managing Oracle Net. It can be used on either the client or server. Oracle
Net Manager is also integrated with Oracle Enterprise Manager.

You can use Oracle Net Manager to configure the following network components:

 Naming--Define simple names, connect identifiers, and map them to connect


descriptors to identify the network location and identification of a service. Oracle
Net Manager supports configuration of connect descriptors in local

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 10 of 86


Oracle 10g Made Easy

tnsnames.ora files, a centralized LDAP-compliant directory service, or an


Oracle Names server.
 Naming Methods--Configure the different ways in which connect identifiers are
resolved into connect descriptors.
 Profiles--Configure preferences for enabling and configuring Oracle Net features
on the client or server.
 Listeners--Create and configure listeners to receive client connections.

If an Oracle Names server is configured, you can start, stop, tune, or gather statistics for it
with Oracle Net Manager.

Start > Programs > Oracle - HOME_NAME > Configuration and Migration Tools > Net Manager.

Configure as above and save. Now restart listener at service.

3. Net Configuration Assistant:

Oracle Net Configuration Assistant is provided primarily to configure basic network


components during installation, including:

 Listener names and protocol addresses


 Naming methods the client will use to resolve connect identifiers to connect
descriptors
 Net service names in a tnsnames.ora file
 Directory server usage

Oracle Net Configuration Assistant runs automatically during software installation, as


described in your Oracle installation guide.

It can also be run after installation in standalone mode to configure naming method
usage, the listener, net service names in the tnsnames.ora file, and directory server
usage in a similar way that is provided during installation.

To start Oracle Net Configuration Assistant:

Start > Programs > Oracle - HOME_NAME > Configuration and Migration Tools > Net Configuration Assistant.

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 11 of 86


Oracle 10g Made Easy

Tablespace :

CREATE tablespace EDATA datafile 'G:\oracle\product\10.2.0\oradata\ctrl\EDATA.dbf' SIZE 2000M


AUTOEXTEND ON ONLINE EXTENT MANAGEMENT LOCAL UNIFORM SIZE 2M;

CREATE tablespace EIDX datafile 'G:\oracle\product\10.2.0\oradata\ctrl\EIDX.dbf' SIZE 2000M


AUTOEXTEND ON ONLINE EXTENT MANAGEMENT LOCAL UNIFORM SIZE 2M;

SELECT 'ALTER TABLE '||TABLE_NAME||' MOVE TABLESPACE EDATA;' FROM TABS;

SELECT 'ALTER INDEX '||INDEX_NAME||' REBUILD NOLOGGING ONLINE TABLESPACE EIDX;'


FROM USER_INDEXES;

Database Recovery method :


Shutdown immediate;
Startup nomount;
Startup mount;
Restore database;
Recover database;
Alter database open;

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 12 of 86


Oracle 10g Made Easy

Starting the Enterprise Manager dbconsole Process

Accessing Enterprise Manager Database Control (E.M.):

http://hostname:5500/em

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 13 of 86


Oracle 10g Made Easy

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 14 of 86


Oracle 10g Made Easy

Common SQL*PLUS commands

To describe a table

 SQL> desc emp;

To re-execute a command

 SQL> /

Note: the buffer can only hold one previous statement.

To find out what is in that buffer

 SQL> l

or

 SQL> list

To change part of your previous query in the buffer before running it

 SQL> c/<column-name>/<new-column-name>

To save the query u have in the buffer to a file

 SQL> save <filename>.sql

To execute what is in this query file

 SQL> @all_emp

Assuming you have made a lot of queries during a session and you want to save
everthing at once

 SQL> spool <filename>.txt

Any other command you type will be stored inside the <filename>.txt. But before
this can happen, you need to do this:

 SQL> spool off

So when you do the above, you can then exit sqlplus, and cat output.txt. The result will
show you all the commands or work you have done while in sqlplus.

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 15 of 86


Oracle 10g Made Easy

If you make new changes and you want to append it to <filename>.txt

 SQL> spool <filename>.txt append

To make changes to sql statement in an editor

 SQL> ed

To switch between sqlplus and your host prompt

 SQL> host

To echo something

 SQL> prompt "Your text here"

To insert a variable during your sql queries in sqlplus

 SQL> select empno,ename,job,sal,comm,from emp where sal > &&x and comm
> &&x

To change your password

 SQL> passw

To change the password of another user

 SQL> passw [username]

To find out more sqlplus commands

 SQL> help index

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 16 of 86


Oracle 10g Made Easy

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 17 of 86


Oracle 10g Made Easy

SQL Statements

SELECT Query
INSERT
UPDATE
Data Manipulation Language (DML)
DELETE
MERGE
CREATE
ALTER
DROP Data Definition Language (DDL)
RENAME
TRUNCATE
GRANT
Data Control Language (DCL)
REVOKE
COMMIT
ROLLBACK Transaction Control
SAVEPOINT

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 18 of 86


Oracle 10g Made Easy

1. Writing Basic SQL Statements:

SL Use Statements
1 SELECT *
Selecting All Columns
FROM departments;

2 SELECT department_id, location_id


Selecting Specific Columns
FROM departments;
3 SELECT last_name, salary, salary + 300
Using Arithmetic Operators
FROM employees;
4 Operator Precedence * / + -
5 SELECT last_name, salary, 12*salary+100
Operator Precedence
FROM employees;
6 SELECT last_name, salary, 12*(salary+100)
Using Parentheses
FROM employees;
7 SELECT last_name, job_id, salary, commission_pct
Defining a Null Value
FROM employees;
8 SELECT last_name, 12*salary*commission_pct
FROM employees;
Null Values
(Arithmetic expressions containing a null value
in Arithmetic Expressions
evaluate to null.)

9 SELECT last_name AS name, commission_pct comm


Using Column Aliases FROM employees;
10 SELECT last_name "Name", salary*12 "Annual Salary"
FROM employees;
11 Using the Concatenation SELECT last_name||job_id AS "Employees"
Operator FROM employees;
12 SELECT last_name ||' is a '||job_id
Using Literal Character
AS "Employee Details"
Strings
FROM employees;
13 SELECT department_id
Duplicate Rows
FROM employees;
14 SELECT DISTINCT department_id
Eliminating Duplicate Rows
FROM employees;
15 Displaying Table Structure DESCRIBE employees

2. Restricting and Sorting Data


SL Use Statements
SELECT employee_id, last_name, job_id, department_id
1 Using the WHERE Clause FROM employees
WHERE department_id = 90 ;
Character strings and date values are enclosed in single quotation
marks. Character values are case sensitive, and date values are format
sensitive.
2 Character Strings and Dates Example :
SELECT last_name, job_id, department_id
FROM employees
WHERE last_name = 'Whalen';
= Equal To
> Greater than
3 Comparison Conditions
>= Greater than or equal to
< Less than

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 19 of 86


Oracle 10g Made Easy

<= Less than or equal to


<> Not equal to.
!= Not equal to.
SELECT last_name, salary
Using Comparison
4 FROM employees
Conditions
WHERE salary <= 3000;
Between .. And … Between two values (inclusive)
Other Comparison In Match any of a list of values
5
Conditions Like Match a character pattern
Is Null Is a null value.
SELECT last_name, salary
Using the BETWEEN
6 FROM employees
Condition
WHERE salary BETWEEN 2500 AND 3500;
SELECT employee_id, last_name, salary, manager_id
7 Using the IN Condition FROM employees
WHERE manager_id IN (100, 101, 201);
SELECT first_name
8 Using the LIKE Condition FROM employees
WHERE first_name LIKE 'S%';
SELECT last_name, manager_id
9 Using the NULL Conditions FROM employees
WHERE manager_id IS NULL;
AND Returns TRUE if both component conditions are true
10 Logical Conditions OR Returns TRUE if either component condition is true
NOT Returns TRUE if the following condition is false
SELECT employee_id, last_name, job_id, salary
FROM employees
11 Using the AND Operator
WHERE salary >=10000
AND job_id LIKE '%MAN%';
SELECT employee_id, last_name, job_id, salary
FROM employees
12 Using the OR Operator
WHERE salary >= 10000
OR job_id LIKE '%MAN%';
SELECT last_name, job_id
Using the NOT Operator FROM employees
13
WHERE job_id
NOT IN ('IT_PROG', 'ST_CLERK', 'SA_REP');
Sort rows with the ORDER BY clause
ASC: ascending order, default
14 ORDER BY Clause
DESC: descending order
The ORDER BY clause comes last in the SELECT statement.
SELECT last_name, job_id, department_id, hire_date
15 ORDER BY Clause FROM employees
ORDER BY hire_date ;
SELECT last_name, job_id, department_id, hire_date
Sorting in Descending
16 FROM employees
Order
ORDER BY hire_date DESC;
SELECT employee_id, last_name, salary*12 annsal
17 Sorting by Column Alias FROM employees
ORDER BY annsal;
SELECT last_name, department_id, salary
Sorting by Multiple
18 FROM employees
Columns
ORDER BY department_id, salary DESC;

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 20 of 86


Oracle 10g Made Easy

3. Single-Row Functions
SL Use Statements
LOWER
Case-manipulation
1 UPPER
functions
INITCAP
CONCAT
SUBSTR
LENGTH
Character-manipulation
2 INSTR
functions
LPAD | RPAD
TRIM
REPLACE
LOWER('SQL Course') sql course
Case Manipulation
3 UPPER('SQL Course') SQL COURSE
Functions
INITCAP('SQL Course') Sql Course
SELECT employee_id, last_name, department_id
FROM employees
WHERE last_name = 'higgins';
Using Case
4 no rows selected
Manipulation Functions
SELECT employee_id, last_name, department_id
FROM employees
WHERE LOWER(last_name) = 'higgins';
CONCAT('Hello', 'World') HelloWorld
SUBSTR('HelloWorld',1,5) Hello
LENGTH('HelloWorld') 10
Character-Manipulation INSTR('HelloWorld', 'W') 6
5
Functions LPAD(salary,10,'*') *****24000
RPAD(salary, 10, '*') 24000*****
TRIM('H' FROM elloWorld
'HelloWorld')
SELECT employee_id, CONCAT(first_name, last_name) NAME,
job_id, LENGTH (last_name),
Using the Character-
6 INSTR(last_name, 'a') "Contains 'a'?"
Manipulation Functions
FROM employees
WHERE SUBSTR(job_id, 4) = 'REP';
ROUND: Rounds value to specified decimal
ROUND(45.926, 2) 45.93
TRUNC: Truncates value to specified decimal
7 Number Functions
TRUNC(45.926, 2) 45.92
MOD: Returns remainder of division
MOD(1600, 300) 100
SELECT ROUND(45.923,2), ROUND(45.923,0),
Using the ROUND
8 ROUND(45.923,-1)
Function
FROM DUAL;
SELECT TRUNC(45.923,2), TRUNC(45.923),
Using the TRUNC
9 TRUNC(45.923,-2)
Function
FROM DUAL;
SELECT last_name, salary, MOD(salary, 5000)
Using the MOD
10 FROM employees
Function
WHERE job_id = 'SA_REP';
Number of months
11 Date Functions MONTHS_BETWEEN
between two dates
ADD_MONTHS Add calendar months to date
NEXT_DAY Next day of the date specified
LAST_DAY Last day of the month

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 21 of 86


Oracle 10g Made Easy

ROUND Round date


TRUNC Truncate date
MONTHS_BETWEEN ('01-SEP-95','11-JAN-94')
ADD_MONTHS ('11-JAN-94',6)
12 Use of Date Functions
NEXT_DAY ('01-SEP-95','FRIDAY')
LAST_DAY('01-FEB-95')
SELECT last_name,
Using the TO_CHAR TO_CHAR(hire_date, 'fmDD Month YYYY')
13
Function with Dates AS HIREDATE
FROM employees;
SELECT TO_CHAR(salary, '$99,999.00') SALARY
Using the TO_CHAR
14 FROM employees
Function with Numbers
WHERE last_name = 'Ernst';
SELECT last_name, TO_CHAR(hire_date, 'DD-Mon-YYYY')
15 RRRR Format FROM employees
WHERE hire_date < TO_DATE('01-Jan-90', 'DD-Mon-RR');
SELECT last_name,
Nesting Functions NVL(TO_CHAR(manager_id), 'No Manager')
16
FROM employees
WHERE manager_id IS NULL;
SELECT last_name, salary, NVL(commission_pct, 0),
Using the NVL
17 (salary*12) + (salary*12*NVL(commission_pct, 0)) AN_SAL
Function
FROM employees;
SELECT last_name, salary, commission_pct,
Using the NVL2 NVL2(commission_pct,
18
Function 'SAL+COMM', 'SAL') income
FROM employees WHERE department_id IN (50, 80);
SELECT last_name,
Using the COALESCE COALESCE(commission_pct, salary, 10) comm
19
Function FROM employees
ORDER BY commission_pct;
SELECT last_name, job_id, salary,
DECODE(job_id, 'IT_PROG', 1.10*salary,
'ST_CLERK', 1.15*salary,
'SA_REP', 1.20*salary,
salary)
REVISED_SALARY
FROM employees;
SELECT last_name, salary,
DECODE (TRUNC(salary/2000, 0),
Using the DECODE
20 0, 0.00,
Function
1, 0.09,
2, 0.20,
3, 0.30,
4, 0.40,
5, 0.42,
6, 0.44,
0.45) TAX_RATE
FROM employees
WHERE department_id = 80;

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 22 of 86


Oracle 10g Made Easy

4. Displaying Data from Multiple Tables


SL Use Statements
A Cartesian product is formed when:
– A join condition is omitted
– A join condition is invalid
1 Cartesian Products – All rows in the first table are joined to all rows in the
second table
To avoid a Cartesian product, always include a valid join condition in a
WHERE clause.
Equijoin
Oracle Proprietary Non-equijoin
2
Joins (8i and prior): Outer join
Self join
Cross joins
SQL: 1999 Natural joins
3 Compliant Joins: Using clause
Full or two sided outer joins
Arbitrary join conditions for outer joins
SELECT employees.employee_id, employees.last_name,
employees.department_id, departments.department_id,
Retrieving Records
4 departments.location_id
with Equijoins
FROM employees, departments
WHERE employees.department_id = departments.department_id;
SELECT e.employee_id, e.last_name, e.department_id,
d.department_id, d.location_id
5 Using Table Aliases
FROM employees e , departments d
WHERE e.department_id = d.department_id;
SELECT e.last_name, e.salary, j.grade_level
FROM employees e, job_grades j
Retrieving Records
6 WHERE e.salary
with Non-Equijoins
BETWEEN j.lowest_sal AND j.highest_sal;

SELECT e.last_name, e.department_id, d.department_name


7 Using Outer Joins FROM employees e, departments d
WHERE e.department_id(+) = d.department_id ;
SELECT worker.last_name || ' works for '
Joining a Table to Itself || manager.last_name
8
– Self Join FROM employees worker, employees manager
WHERE worker.manager_id = manager.employee_id ;

5. Aggregating Data Using Group Functions


SL Use Statements
• AVG
• COUNT
Types of Group
1 • MAX
Functions
• MIN
• SUM
SELECT AVG(salary), MAX(salary),
Using the AVG and MIN(salary), SUM(salary)
2
SUM Functions FROM employees
WHERE job_id LIKE '%REP%';
Using the MIN and SELECT MIN(hire_date), MAX(hire_date)
3
MAX Functions FROM employees;
Using the COUNT SELECT COUNT(*)
4
Function FROM employees

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 23 of 86


Oracle 10g Made Easy

WHERE department_id = 50;

SELECT COUNT(commission_pct)
FROM employees
WHERE department_id = 80;

SELECT COUNT(DISTINCT department_id)


FROM employees;
(Group functions ignore
SELECT AVG(commission_pct)
5 null values in the
FROM employees;
column.)
SELECT department_id, AVG(salary)
Using the GROUP BY
6 FROM employees
Clause
GROUP BY department_id ;
Using the GROUP BY SELECT department_id dept_id, job_id, SUM(salary)
7 Clause FROM employees
on Multiple Columns GROUP BY department_id, job_id ;
SELECT department_id, COUNT(last_name)
FROM employees;
Illegal Queries
8 SELECT department_id, AVG(salary)
Using Group Functions
FROM employees
WHERE AVG(salary) > 8000
GROUP BY department_id;
SELECT department_id, MAX(salary)
FROM employees
GROUP BY department_id
HAVING MAX(salary)>10000 ;
Using the HAVING
9 SELECT job_id, SUM(salary) PAYROLL
Clause
FROM employees
WHERE job_id NOT LIKE '%REP%'
GROUP BY job_id
HAVING SUM(salary) > 13000
ORDER BY SUM(salary);
SELECT MAX(AVG(salary))
Nesting Group
10 FROM employees
Functions
GROUP BY department_id;

6. Subqueries
SL Use Statements
SELECT last_name
FROM employees
Using a Subquery WHERE salary >
1
(SELECT salary
FROM employees
WHERE last_name = 'Abel');
SELECT last_name, job_id, salary
FROM employees
WHERE job_id =
Executing Single-Row
(SELECT job_id
2 Subqueries
FROM employees
WHERE employee_id = 141)
AND salary >
(SELECT salary

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 24 of 86


Oracle 10g Made Easy

FROM employees
WHERE employee_id = 143);
SELECT last_name, job_id, salary
FROM employees
Using Group Functions
WHERE salary =
3 in a Subquery
(SELECT MIN(salary)
FROM employees);

SELECT department_id, MIN(salary)


FROM employees
GROUP BY department_id
The HAVING Clause
HAVING MIN(salary) >
4 with Subqueries
(SELECT MIN(salary)
FROM employees
WHERE department_id = 50);

SELECT employee_id, last_name, job_id, salary


Using the ANY FROM employees
Operator WHERE salary < ANY
5 in Multiple-Row (SELECT salary
Subqueries FROM employees
WHERE job_id = 'IT_PROG')
AND job_id <> 'IT_PROG';
SELECT employee_id, last_name, job_id, salary
FROM employees
Using the ALL Operator
WHERE salary < ALL
in Multiple-Row
6 (SELECT salary
Subqueries
FROM employees
WHERE job_id = 'IT_PROG')
AND job_id <> 'IT_PROG';
SELECT emp.last_name
Null Values in a FROM employees emp
7 Subquery WHERE emp.employee_id NOT IN
(SELECT mgr.manager_id
FROM employees mgr);

7.Manipulating Data
SL Use Statements
INSERT INTO departments(department_id, department_name,
1 Inserting New Rows manager_id, location_id)
VALUES (70, 'Public Relations', 100, 1700);
INSERT INTO departments (department_id,
department_name )
Inserting Rows with VALUES (30, 'Purchasing');
2
Null Values
INSERT INTO departments
VALUES (100, 'Finance', NULL, NULL);
INSERT INTO employees (employee_id,
first_name, last_name,
email, phone_number,
hire_date, job_id, salary,
3 Inserting Special Values
commission_pct, manager_id,
department_id)
VALUES (113,
'Louis', 'Popp',

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 25 of 86


Oracle 10g Made Easy

'LPOPP', '515.124.4567',
SYSDATE, 'AC_ACCOUNT', 6900,
NULL, 205, 100);
INSERT INTO employees
VALUES (114,
Inserting Specific Date 'Den', 'Raphealy',
4
Values 'DRAPHEAL', '515.127.4561',
TO_DATE('FEB 3, 1999', 'MON DD, YYYY'),
'AC_ACCOUNT', 11000, NULL, 100, 30);
INSERT INTO departments
5 Creating a Script (department_id, department_name, location_id)
VALUES (&department_id, '&department_name',&location);
INSERT INTO sales_reps(id, name, salary, commission_pct)
Copying Rows SELECT employee_id, last_name, salary, commission_pct
6
from Another Table FROM employees
WHERE job_id LIKE '%REP%';
UPDATE employees
SET department_id = 70
Updating Rows in a WHERE employee_id = 113;
7
Table
UPDATE copy_emp
SET department_id = 110;
UPDATE employees
SET job_id = (SELECT job_id
FROM employees
Updating Two Columns WHERE employee_id = 205),
8
with a Subquery salary = (SELECT salary
FROM employees
WHERE employee_id = 205)
WHERE employee_id = 114;
UPDATE copy_emp
SET department_id = (SELECT department_id
FROM employees
Updating Rows Based
9 WHERE employee_id = 100)
on Another Table
WHERE job_id = (SELECT job_id
FROM employees
WHERE employee_id = 200);
Updating Rows: UPDATE employees
10 Integrity Constraint SET department_id = 55
Error WHERE department_id = 110;
DELETE FROM departments
Deleting Rows from a WHERE department_name = 'Finance';
11
Table
DELETE FROM copy_emp;
DELETE FROM employees
WHERE department_id =
Deleting Rows Based
12 (SELECT department_id
on Another Table
FROM departments
WHERE department_name LIKE '%Public%');
Deleting Rows: DELETE FROM departments
13 Integrity Constraint WHERE department_id = 60;
Error
INSERT INTO
Using a Subquery in an
14 (SELECT employee_id, last_name,
INSERT Statement
email, hire_date, job_id, salary,

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 26 of 86


Oracle 10g Made Easy

department_id
FROM employees
WHERE department_id = 50)
VALUES (99999, 'Taylor', 'DTAYLOR',
TO_DATE('07-JUN-99', 'DD-MON-RR'),
'ST_CLERK', 5000, 50);
INSERT INTO departments
(department_id, department_name, manager_id)
Using Explicit Default VALUES (300, 'Engineering', DEFAULT);
15
Values
UPDATE departments
SET manager_id = DEFAULT WHERE department_id = 10;
MERGE INTO copy_emp c
USING employees e
ON (c.employee_id = e.employee_id)
WHEN MATCHED THEN
Merging Rows
UPDATE SET
(Insert or update rows in
c.first_name = e.first_name,
the COPY_EMP table
c.last_name = e.last_name,
16 to match
...
the EMPLOYEES
c.department_id = e.department_id
table.)
WHEN NOT MATCHED THEN
INSERT VALUES(e.employee_id, e.first_name, e.last_name,
e.email, e.phone_number, e.hire_date, e.job_id,
e.salary, e.commission_pct, e.manager_id,
e.department_id);
DELETE FROM employees
WHERE employee_id = 99999;
1 row deleted.
Committing Data
17
INSERT INTO departments
VALUES (290, 'Corporate Tax', NULL, 1700);
1 row inserted.
DELETE FROM copy_emp;
State of the Data After 22 rows deleted.
18
ROLLBACK ROLLBACK;
Rollback complete.

8. Creating and Managing Tables


SL Use Statements
1 CREATE TABLE dept
(deptno NUMBER(2),
dname VARCHAR2(14),
Creating Tables loc VARCHAR2(13));

DESCRIBE dept

2 SELECT table_name
FROM user_tables ;

Querying the Data SELECT DISTINCT object_type


Dictionary FROM user_objects ;

SELECT *
FROM user_catalog ;

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 27 of 86


Oracle 10g Made Easy

3 CREATE TABLE dept80


AS
SELECT employee_id, last_name,
Creating a Table by
salary*12 ANNSAL,
Using a Subquery
hire_date
FROM employees
WHERE department_id = 80;
4 ALTER TABLE dept80
Adding a Column
ADD (job_id VARCHAR2(9));
5 Modifying a Column ALTER TABLE dept80
MODIFY (last_name VARCHAR2(30));
6 ALTER TABLE dept80
Dropping a Column
DROP COLUMN job_id;
7 ALTER TABLE table
SET UNUSED (column);

The SET UNUSED ALTER TABLE table


Option SET UNUSED COLUMN column;

ALTER TABLE table


DROP UNUSED COLUMNS;
8 Dropping a Table DROP TABLE dept80;
9 Changing the Name of RENAME dept TO detail_dept;
an Object
10 Truncating a Table TRUNCATE TABLE detail_dept;

9. Including Constraints:
NOT NULL
UNIQUE
PRIMARY KEY
FOREIGN KEY
CHECK

SL Use Statements
CREATE TABLE employees(
employee_id NUMBER(6),
first_name VARCHAR2(20),
1 Defining Constraints ...
job_id VARCHAR2(10) NOT NULL,
CONSTRAINT emp_emp_id_pk
PRIMARY KEY (EMPLOYEE_ID));
CREATE TABLE employees(
employee_id NUMBER(6),
last_name VARCHAR2(25) NOT NULL,
The NOT NULL salary NUMBER(8,2),
2
Constraint commission_pct NUMBER(2,2),
hire_date DATE
CONSTRAINT emp_hire_date_nn
NOT NULL,
CREATE TABLE employees(
employee_id NUMBER(6),
The UNIQUE last_name VARCHAR2(25) NOT NULL,
3
Constraint email VARCHAR2(25),
salary NUMBER(8,2),
commission_pct NUMBER(2,2),

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 28 of 86


Oracle 10g Made Easy

hire_date DATE NOT NULL,


...
CONSTRAINT emp_email_uk UNIQUE(email));
CREATE TABLE departments(
department_id NUMBER(4),
The PRIMARY KEY department_name VARCHAR2(30)
4 Constraint CONSTRAINT dept_name_nn NOT NULL,
manager_id NUMBER(6),
location_id NUMBER(4),
CONSTRAINT dept_id_pk PRIMARY KEY(department_id));
CREATE TABLE employees(
employee_id NUMBER(6),
last_name VARCHAR2(25) NOT NULL,
email VARCHAR2(25),
salary NUMBER(8,2),
The FOREIGN KEY commission_pct NUMBER(2,2),
5
Constraint hire_date DATE NOT NULL,
...
department_id NUMBER(4),
CONSTRAINT emp_dept_fk FOREIGN KEY (department_id)
REFERENCES departments(department_id),
CONSTRAINT emp_email_uk UNIQUE(email));
ALTER TABLE employees
ADD CONSTRAINT emp_manager_fk
6 Adding a Constraint
FOREIGN KEY(manager_id)
REFERENCES employees(employee_id);
ALTER TABLE employees
DROP CONSTRAINT emp_manager_fk;
7 Dropping a Constraint
ALTER TABLE departments
DROP PRIMARY KEY CASCADE;
ALTER TABLE employees
8 Disabling Constraints
DISABLE CONSTRAINT emp_emp_id_pk CASCADE;
ALTER TABLE employees
9 Enabling Constraints
ENABLE CONSTRAINT emp_emp_id_pk;
ALTER TABLE test1
DROP (pk) CASCADE CONSTRAINTS;
10 Cascading Constraints
ALTER TABLE test1
DROP (pk, fk, col1) CASCADE CONSTRAINTS;
SELECT constraint_name, constraint_type,
search_condition
11 Viewing Constraints
FROM user_constraints
WHERE table_name = 'EMPLOYEES';
Viewing the Columns SELECT constraint_name, column_name
12 Associated with FROM user_cons_columns
Constraints WHERE table_name = 'EMPLOYEES';

10. Creating Views:


SL Use Statements
CREATE VIEW empvu80
AS SELECT employee_id, last_name, salary
1 Creating 6a View
FROM employees
WHERE department_id = 80;

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 29 of 86


Oracle 10g Made Easy

DESCRIBE empvu80;
CREATE VIEW salvu50
Create a view by using AS SELECT employee_id ID_NUMBER, last_name NAME,
2 column aliases in the salary*12 ANN_SALARY
subquery. FROM employees
WHERE department_id = 50;
Retrieving Data from a SELECT *
3
View FROM salvu50;
CREATE OR REPLACE VIEW empvu80
(id_number, name, sal, department_id)
AS SELECT employee_id, first_name || ' ' || last_name,
4 Modifying a View
salary, department_id
FROM employees
WHERE department_id = 80;
CREATE VIEW dept_sum_vu
(name, minsal, maxsal, avgsal)
AS SELECT d.department_name, MIN(e.salary),
Creating a Complex
5 MAX(e.salary),AVG(e.salary)
View
FROM employees e, departments d
WHERE e.department_id = d.department_id
GROUP BY d.department_name;
CREATE OR REPLACE VIEW empvu20
Using the WITH AS SELECT *
6 CHECK OPTION FROM employees
Clause WHERE department_id = 20
WITH CHECK OPTION CONSTRAINT empvu20_ck ;
CREATE OR REPLACE VIEW empvu10
(employee_number, employee_name, job_title)
Denying DML AS SELECT employee_id, last_name, job_id
7
Operations FROM employees
WHERE department_id = 10
WITH READ ONLY;
8 Removing a View DROP VIEW view;
SELECT ROWNUM as RANK, last_name, salary
Example of Top-N FROM (SELECT last_name,salary FROM employees
9
Analysis ORDER BY salary DESC)
WHERE ROWNUM <= 3;

11. Other Database Objects:


 Sequence
 Index
 Synonym
SL Use Statements
CREATE SEQUENCE dept_deptid_seq
INCREMENT BY 10
START WITH 120
1 Creating a Sequence
MAXVALUE 9999
NOCACHE
NOCYCLE;
SELECT sequence_name, min_value, max_value,
increment_by, last_number
2 Confirming Sequences
FROM user_sequences;

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 30 of 86


Oracle 10g Made Easy

The LAST_NUMBER column displays the next available sequence


number if NOCACHE is specified.
INSERT INTO departments(department_id,
department_name, location_id)
3 Using a Sequence VALUES (dept_deptid_seq.NEXTVAL, 'Support', 2500);

SELECT dept_deptid_seq.CURRVAL FROM dual;


ALTER SEQUENCE dept_deptid_seq
INCREMENT BY 20
4 Modifying a Sequence MAXVALUE 999999
NOCACHE
NOCYCLE;
5 Removing a Sequence DROP SEQUENCE dept_deptid_seq;
An index:
• Is a schema object
• Is used by the Oracle server to speed up the retrieval of rows by
using a pointer
6 What is an Index?
• Can reduce disk I/O by using a rapid path access method to
locate data quickly
• Is independent of the table it indexes
• Is used and maintained automatically by the Oracle server
CREATE INDEX emp_last_name_idx
7 Creating an Index
ON employees(last_name);
SELECT ic.index_name, ic.column_name,
ic.column_position col_pos,ix.uniqueness
8 Confirming Indexes FROM user_indexes ix, user_ind_columns ic
WHERE ic.index_name = ix.index_name
AND ic.table_name = 'EMPLOYEES';
CREATE INDEX upper_dept_name_idx
9 Function-Based Indexes
ON departments(UPPER(department_name));
10 Removing an Index DROP INDEX upper_last_name_idx;
CREATE SYNONYM d_sum
Creating and Removing FOR dept_sum_vu;
11
Synonyms
DROP SYNONYM d_sum;

12. Controlling User Access


SL Use Statements
Creating Users CREATE USER scott IDENTIFIED BY tiger;
• An application developer, for example, may have the following
system privileges:
– CREATE SESSION
1 User System Privileges – CREATE TABLE
– CREATE SEQUENCE
– CREATE VIEW
– CREATE PROCEDURE
CREATE ROLE manager;
Creating and Granting
2 GRANT create table, create view TO manager;
Privileges to a Role
GRANT manager TO DEHAAN, KOCHHAR;
Changing Your ALTER USER scott IDENTIFIED BY lion;
3
Password
GRANT select ON employees TO sue, rich;
Granting Object
4
Privileges GRANT update (department_name, location_id)
ON departments

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 31 of 86


Oracle 10g Made Easy

TO scott, manager;
GRANT select, insert
ON departments
TO scott
Using the WITH
WITH GRANT OPTION;
5 GRANT OPTION and
PUBLIC Keywords
GRANT select
ON alice.departments
TO PUBLIC;
Data Dictionary View Description
ROLE_SYS_PRIVS System privileges granted to roles
ROLE_TAB_PRIVS Table privileges granted to roles
USER_ROLE_PRIVS Roles accessible by the user
USER_TAB_PRIVS_MADE Object privileges granted on the user’s
objects
Confirming Privileges USER_TAB_PRIVS_RECD Object privileges granted to the user
6
Granted USER_COL_PRIVS_MADE Object privileges granted on the
columns of the user’s objects
USER_COL_PRIVS_RECD Object privileges granted to the
user on specific columns
USER_SYS_PRIVS Lists system privileges granted to
the user

Revoking Object REVOKE select, insert ON departments FROM scott;


7
Privileges
CREATE PUBLIC DATABASE LINK hq.acme.com
8 Create the database link
USING 'sales';
Write SQL statements SELECT * FROM emp@HQ.ACME.COM;
9 that use the database
link.

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 32 of 86


Oracle 10g Made Easy

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 33 of 86


Oracle 10g Made Easy

PL/SQL Block Structure

DECLARE --Optional
--Variables, Cursors, User-defined exceptions
BEGIN --Mandatory
--SQL statements
--PL/SQL statements
EXCEPTION --Optional
--Actions to perform when errors occur
END ; --Mandatory

PL/SQL Block Type

Anonymous Procedure Function


[DECLARE] PROCEDURE name FUNCTION name
IS RETURN datatype IS
[DECLARE] [DECLARE]
BEGIN BEGIN BEGIN
--statements --statements --statements
[EXCEPTION] [EXCEPTION] [EXCEPTION]
END; END; END ;

1. Declaring Variables:
SL Use Statements
SET SERVEROUTPUT ON
DECLARE
v_chuoi VARCHAR2(20);
v_ngay DATE;
BEGIN
v_chuoi := 'Hom nay la ngay :';
v_ngay := Sysdate;
DBMS_OUTPUT.PUT_LINE (v_chuoi||v_ngay);
END;

DECLARE
v_chuoi VARCHAR2(40);
v_ngay DATE;
BEGIN
SELECT last_name||' '||first_name, hire_date
1 Declaring Variables INTO v_chuoi, v_ngay
FROM EMPLOYEES
WHERE employee_id = &ID;
DBMS_OUTPUT.PUT_LINE ('Nhan vien ' ||v_chuoi||' bat dau
lam viec ngay : ' ||v_ngay);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE ('KHONG CO NHAN VIEN
CO');
END;

DECLARE
invalid_so EXCEPTION;
v_so integer := &so;
BEGIN
IF v_so NOT IN (1,2,3) Then

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 34 of 86


Oracle 10g Made Easy

Raise invalid_so;
ELSE
DBMS_OUTPUT.PUT_LINE ('Gia tri : ' ||v_so);
END IF;
EXCEPTION
WHEN Invalid_so THEN
DBMS_OUTPUT.PUT_LINE ('KHONG HOP LE');
END;

CREATE TABLE CHUSO(


SO NUMBER(1),
TENSO VARCHAR2(10));

INSERT INTO CHUSO VALUES (0, 'khong');


INSERT INTO CHUSO VALUES (1, 'mot');
INSERT INTO CHUSO VALUES (2, 'hai');
INSERT INTO CHUSO VALUES (3, 'ba');
INSERT INTO CHUSO VALUES (4, 'bon');
INSERT INTO CHUSO VALUES (5, 'nam');
INSERT INTO CHUSO VALUES (6, 'sau');
INSERT INTO CHUSO VALUES (7, 'bay');
INSERT INTO CHUSO VALUES (8, 'tam');
INSERT INTO CHUSO VALUES (9, 'chin');
commit;
set serveroutput on
DECLARE
employee_id NUMBER(6);
BEGIN
SELECT employee_id
INTO employee_id
FROM employees
WHERE last_name = 'Kochhar';
dbms_output.put_line('aaa'||employee_id);
2 Naming Rules
END;
/

(Adopt a naming
convention for
PL/SQL identifiers:
for example,
v_employee_id;)

...
v_name employees.last_name%TYPE;
Declaring Variables
3 v_balance NUMBER(7,2);
with the %TYPE Attribute
v_min_balance v_balance%TYPE := 10;
...
VARIABLE g_salary NUMBER
BEGIN
SELECT salary
INTO :g_salary
4 Using Bind Variables FROM employees
WHERE employee_id = 178;
END;
/
PRINT g_salary

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 35 of 86


Oracle 10g Made Easy

:g_monthly_sal := v_sal / 12;

VARIABLE g_monthly_sal NUMBER


SET VERIFY OFF

Referencing Non-PL/SQL DECLARE


5
Variables v_sal NUMBER(9,2) := &p_annual_sal;
BEGIN
:g_monthly_sal := v_sal/12;
END;
/
PRINT g_monthly_sal
SET SERVEROUTPUT ON
DEFINE p_annual_sal = 60000

DECLARE
v_sal NUMBER(9,2) := &p_annual_sal;
6 DBMS_OUTPUT.PUT_LINE BEGIN
v_sal := v_sal/12;
DBMS_OUTPUT.PUT_LINE ('The monthly salary is '
||TO_CHAR(v_sal));
END;
/

2. Writing Executable Statements:


SL Use Statements
DECLARE
...
v_sal NUMBER (9,2);
BEGIN
1 Commenting Code
/* Compute the annual salary based on the
monthly salary input from the user */
v_sal := :g_monthly_sal * 12;
END; -- This is the end of the block
DECLARE
v_date DATE := TO_DATE('12-JAN-2001', 'DD-MON-YYYY');
2 Data Type Conversion
BEGIN
...
DECLARE
v_deptno NUMBER(4);
v_location_id NUMBER(4);
BEGIN
SELECT department_id,
location_id
INTO v_deptno,
3 Indenting Code
v_location_id
FROM departments
WHERE department_name
= ‘Sales’;
...
END;
/

3. Interacting with the Oracle Server

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 36 of 86


Oracle 10g Made Easy

SL Use Statements
SET SERVEROUTPUT ON
DECLARE
v_deptno NUMBER(4);
v_location_id NUMBER(4);
BEGIN
SELECT department_id, location_id
SELECT Statements in
1 INTO v_deptno, v_location_id
PL/SQL
FROM departments
WHERE department_name = 'Sales';
DBMS_OUTPUT.PUT_LINE (‘Ma phong : ‘ || v_deptno||’ – ‘||
v_location_id);
END;
/
SET SERVEROUTPUT ON
DECLARE
v_hire_date employees.hire_date%TYPE;
v_salary employees.salary%TYPE;
BEGIN
SELECT hire_date, salary
INTO v_hire_date, v_salary
FROM employees
WHERE employee_id = 100;
DBMS_OUTPUT.PUT_LINE (‘Ngay vao lam : ‘ || v_hire_date||
’ va co muc luong :‘ || v_salary);
END;
/
2 Retrieving Data in PL/SQL
SET SERVEROUTPUT ON
DECLARE
v_sum_sal NUMBER(10,2);
v_deptno NUMBER NOT NULL := 60;
BEGIN
SELECT SUM(salary) -- group function
INTO v_sum_sal
FROM employees
WHERE department_id = v_deptno;
DBMS_OUTPUT.PUT_LINE ('The sum salary is ' ||
TO_CHAR(v_sum_sal));
END;
/
BEGIN
INSERT INTO employees
(employee_id, first_name, last_name, email,
hire_date, job_id, salary)
Manipulating Data Using
3 VALUES
PL/SQL
(employees_seq.NEXTVAL, 'Ruth', 'Cores', 'RCORES',
sysdate, 'AD_ASST', 4000);
END;
/
DECLARE
v_sal_increase employees.salary%TYPE := 800;
BEGIN
4 Updating Data
UPDATE employees
SET salary = salary + v_sal_increase
WHERE job_id = 'ST_CLERK';

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 37 of 86


Oracle 10g Made Easy

END;
/
DECLARE
v_deptno employees.department_id%TYPE := 10;
BEGIN
5 Deleting Data DELETE FROM employees
WHERE department_id = v_deptno;
END;
/
DECLARE
v_empno EMPLOYEES.EMPLOYEE_ID%TYPE := 100;
BEGIN
MERGE INTO copy_emp c
USING employees e
ON (e.employee_id = v_empno)
WHEN MATCHED THEN
UPDATE SET
c.first_name = e.first_name,
c.last_name = e.last_name,
c.email = e.email,
c.phone_number = e.phone_number,
Merging Rows
6 c.hire_date = e.hire_date,
c.job_id = e.job_id,
c.salary = e.salary,
c.commission_pct = e.commission_pct,
c.manager_id = e.manager_id,
c.department_id = e.department_id
WHEN NOT MATCHED THEN
INSERT VALUES (e.employee_id, e.first_name, e.last_name,
e.email, e.phone_number, e.hire_date,
e.job_id, e.salary, e.commission_pct,
e.manager_id,e.department_id);
END;
/
VARIABLE rows_deleted VARCHAR2(30)
DECLARE
v_employee_id employees.employee_id%TYPE := 176;
BEGIN
DELETE FROM employees
WHERE employee_id = v_employee_id;
:rows_deleted := ( SQL%ROWCOUNT || ' row deleted.');
END;
/
PRINT rows_deleted
7 SQL Cursor Attributes
CREATE TABLE del_history (
tenbang VARCHAR2(20),
sodong NUMBER(5),
ngayxoa DATE);

VARIABLE rows_deleted VARCHAR2(30)


DECLARE
v_employee_id employees.employee_id%TYPE := 163;
BEGIN
DELETE FROM employees
WHERE employee_id = v_employee_id;

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 38 of 86


Oracle 10g Made Easy

:rows_deleted := SQL%ROWCOUNT;
INSERT INTO del_history VALUES ('employees',:rows_deleted,
SYSDATE);
--INSERT INTO del_history VALUES
('employees',SQL%ROWCOUNT, SYSDATE);
END;
/
SELECT * FROM del_history;

4. Writing Control Structures:


SL Use Statements
IF UPPER(v_last_name) = 'GIETZ' THEN
v_mgr := 102;
END IF;

DECLARE
v_hire_date DATE := '12-Dec-1990';
v_five_years BOOLEAN;
BEGIN
IF Statements:
...
IF MONTHS_BETWEEN(SYSDATE,v_hire_date)/12 > 5 THEN
IF condition THEN
v_five_years := TRUE;
statements;
ELSE
[ELSIF condition THEN
1 v_five_years := FALSE;
statements;]
END IF;
[ELSE
...
statements;]
END IF;
...
IF v_start > 100 THEN
v_start := 0.2 * v_start;
ELSIF v_start >= 50 THEN
v_start := 0.5 * v_start;
ELSE
v_start := 0.1 * v_start;
END IF;
...
SET SERVEROUTPUT ON
DECLARE
v_grade CHAR(1) := UPPER('&p_grade');
v_appraisal VARCHAR2(20);
BEGIN
v_appraisal := CASE v_grade
WHEN 'A' THEN 'Excellent'
CASE Expressions:
2 WHEN 'B' THEN 'Very Good'
Example
WHEN 'C' THEN 'Good'
ELSE 'No such grade'
END;
DBMS_OUTPUT.PUT_LINE ( 'Grade: '|| v_grade ||
'Appraisal ' || v_appraisal);
END;
/
Example 1:
3 Handling Nulls x := 5;
y := NULL;

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 39 of 86


Oracle 10g Made Easy

...
IF x != y THEN -- yields NULL, not TRUE
sequence_of_statements; -- not executed
END IF;
Example 2:
a := NULL;
b := NULL;
...
IF a = b THEN -- yields NULL, not TRUE
sequence_of_statements; -- not executed
END IF;

SET SERVEROUTPUT ON
DECLARE
v_country_id locations.country_id%TYPE := 'CA';
v_location_id locations.location_id%TYPE;
v_counter NUMBER(2) := 1;
v_city locations.city%TYPE := 'Montreal';
BEGIN
SELECT MAX(location_id) INTO v_location_id FROM locations
WHERE country_id = v_country_id;
4 Basic Loops LOOP
INSERT INTO locations(location_id, city, country_id)
VALUES((v_location_id + v_counter),v_city, v_country_id);
DBMS_OUTPUT.PUT_LINE (‘TRONG : ’ || v_counter);
v_counter := v_counter + 1;
EXIT WHEN v_counter > 3;
END LOOP;
DBMS_OUTPUT.PUT_LINE (‘TRONG : ’ || v_counter);
END;
/
DECLARE
v_country_id locations.country_id%TYPE := 'CA';
v_location_id locations.location_id%TYPE;
v_city locations.city%TYPE := 'Montreal';
v_counter NUMBER := 1;
BEGIN
SELECT MAX(location_id) INTO v_location_id FROM locations
WHERE country_id = v_country_id;
5 WHILE Loops
WHILE v_counter <= 3 LOOP
INSERT INTO locations(location_id, city, country_id)
VALUES((v_location_id + v_counter), v_city,
v_country_id);
v_counter := v_counter + 1;
END LOOP;
END;
/
DECLARE
v_country_id locations.country_id%TYPE := 'CA';
v_location_id locations.location_id%TYPE;
v_city locations.city%TYPE := 'Montreal';
6 FOR Loops
BEGIN
SELECT MAX(location_id) INTO v_location_id
FROM locations
WHERE country_id = v_country_id;

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 40 of 86


Oracle 10g Made Easy

FOR i IN 1..3 LOOP


INSERT INTO locations(location_id, city, country_id)
VALUES((v_location_id + i), v_city, v_country_id );
END LOOP;
END;
/

SET SERVEROUTPUT ON
DECLARE
v_myvar NUMBER(2) := 5;
BEGIN
FOR n IN REVERSE 50 .. v_myvar + 50
LOOP
DBMS_OUTPUT.PUT_LINE (‘ FOR 1 : ' || n);
END LOOP;
FOR n IN v_myvar .. v_myvar
LOOP
DBMS_OUTPUT.PUT_LINE (‘FOR 2 : ' || n);
END LOOP;
END;
/
...
BEGIN
<<Outer_loop>>
LOOP
v_counter := v_counter+1;
EXIT WHEN v_counter>10;
<<Inner_loop>>
LOOP
...
7 Nested Loops and Labels EXIT Outer_loop WHEN total_done = 'YES';
-- Leave both loops
EXIT WHEN inner_done = 'YES';
-- Leave inner loop only
...
END LOOP Inner_loop;
...
END LOOP Outer_loop;
END;

5. Working with Composite Data Types


SL Use Statements
1 SET SERVEROUTPUT ON
DECLARE
TYPE EmpRec IS RECORD (
emp_name VARCHAR2(50),
job_title VARCHAR2(9),
salary NUMBER(7,2));
Creating a PL/SQL Record emp_info EmpRec;
BEGIN
SELECT first_name||’ ‘||last_name, job_id, salary
INTO emp_info.emp_name, emp_info.job_title, emp_info.salary
FROM employees
WHERE employee_id = 105;
DBMS_OUTPUT.PUT_LINE ('Nhan vien : '||emp_info.emp_name||'

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 41 of 86


Oracle 10g Made Easy

lam cong viec '||


emp_info.job_title ||' co muc luong
'||emp_info.salary );
END;
/

SET SERVEROUTPUT ON
DECLARE
TYPE EmpRec IS RECORD (
emp_id employees.employee_id%TYPE,
job_title VARCHAR2(9),
salary NUMBER(7,2));
emp_info EmpRec;
emp_null EmpRec;
emp EmpRec;
BEGIN
emp_info.emp_id := 7788;
emp_info.job_title := 'ANALYST';
emp_info.salary := 3500;
DBMS_OUTPUT.PUT_LINE (‘Ma : ‘||emp_info.emp_id||’-
’||emp_info.job_title||
' - '||emp_info.salary );
emp := emp_info;
DBMS_OUTPUT.PUT_LINE (‘Ma : ‘||emp.emp_id||’ –
‘||emp.job_title ||' - '||emp.salary );
emp := emp_null; -- Tat ca cac field trong emp deu co gia tri null
DBMS_OUTPUT.PUT_LINE (‘Ma : ‘||emp.emp_id||’ -
'||emp.job_title ||' - '||emp.salary );
END;
/

CREATE TABLE e_temp


AS SELECT * FROM employees WHERE employee_id = 50;

SET SERVEROUTPUT ON
DECLARE
emp_rec employees%ROWTYPE;
BEGIN
SELECT * INTO emp_rec FROM employees
WHERE employee_id = 105;
INSERT INTO e_temp
VALUES (emp_rec.employee_id, emp_rec.first_name,
emp_rec.last_name,
emp_rec.email, emp_rec.phone_number, emp_rec.hire_date,
emp_rec.job_id,
emp_rec.salary, emp_rec.commission_pct, emp_rec.manager_id,
emp_rec.department_id);
COMMIT;
END;
/
SELECT * FROM e_temp;

2 SET SERVEROUTPUT ON
Creating an INDEX BY
DECLARE
Table
TYPE ename_table_type IS TABLE OF
employees.last_name%TYPE

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 42 of 86


Oracle 10g Made Easy

INDEX BY BINARY_INTEGER;
TYPE hiredate_table_type IS TABLE OF DATE
INDEX BY BINARY_INTEGER;
ename_table ename_table_type;
hiredate_table hiredate_table_type;
BEGIN
ename_table(1) := 'CAMERON';
hiredate_table(8) := SYSDATE + 7;
IF ename_table.EXISTS(1) THEN
DBMS_OUTPUT.PUT_LINE (ename_table(1) || ‘ –
‘||hiredate_table(2));
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE (‘Xu ly loi : ‘|| ename_table(1) ||
‘ – ‘ ||hiredate_table(8));
END;
/

SET SERVEROUTPUT ON
DECLARE
TYPE emp_table_type is table of
employees%ROWTYPE INDEX BY BINARY_INTEGER;
my_emp_table emp_table_type;
v_count NUMBER(3):= 10;
BEGIN
FOR i IN 1..v_count
LOOP
SELECT * INTO my_emp_table(i) FROM employees
WHERE employee_id = 100 + i;
END LOOP;
FOR i IN my_emp_table.FIRST..my_emp_table.LAST
LOOP
DBMS_OUTPUT.PUT_LINE(‘Row : ‘||i ||’ –
‘||my_emp_table(i).last_name ||
‘ co muc luong ‘ || my_emp_table(i).salary);
END LOOP;
Example of INDEX BY
3 END;
Table of Records
/

SET SERVEROUTPUT ON
DECLARE
TYPE emp_table_type is table of
employees%ROWTYPE INDEX BY BINARY_INTEGER;
my_table emp_table_type;
v_count NUMBER(3):= 130;
BEGIN
FOR i IN 100..v_count
LOOP
SELECT * INTO my_table(i) FROM employees
WHERE employee_id = i;
END LOOP;
IF my_table.exists(99) THEN
DBMS_OUTPUT.PUT_LINE(‘Khong ton tai trong bang’);
ELSE
DBMS_OUTPUT.PUT_LINE(my_table(106).last_name);

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 43 of 86


Oracle 10g Made Easy

END IF;
END;
/

SET SERVEROUTPUT ON
DECLARE
TYPE emp_table_type is table of
employees%ROWTYPE INDEX BY BINARY_INTEGER;
my_table emp_table_type;
v_count NUMBER(3):= 130;
truoc NUMBER(3):= 1;
sau NUMBER(3):= 1;
BEGIN
FOR i IN 100..v_count LOOP
SELECT * INTO my_table(i) FROM employees WHERE
employee_id = i;
END LOOP;
DBMS_OUTPUT.PUT_LINE('TEST 1: '||my_table.count);
DBMS_OUTPUT.PUT_LINE('Row first: '||my_table.first||' Row
last: '||my_table.last);
sau := my_table.NEXT(125);
truoc := my_table.PRIOR(113);
DBMS_OUTPUT.PUT_LINE('Row prior: '||truoc|| ‘ - Row next :
‘||sau);
END;

SET SERVEROUTPUT ON
DECLARE
TYPE emp_table_type is table of
employees%ROWTYPE INDEX BY BINARY_INTEGER;
my_table emp_table_type;
v_count NUMBER(3):= 130;
truoc NUMBER(3):= 1;
sau NUMBER(3):= 1;
BEGIN
FOR i IN 100..v_count LOOP
SELECT * INTO my_table(i) FROM employees WHERE
employee_id = i;
END LOOP;
DBMS_OUTPUT.PUT_LINE('TEST 1: '||my_table.count);
DBMS_OUTPUT.PUT_LINE('Row first: '||my_table.first||' Row
last: '||my_table.last);
-- my_table.DELETE; -- Xoa tat ca vung nho cap phat cho
my_table
-- my_table.DELETE(102); -- Xoa dong 102
my_table.DELETE(100,120); -- Xoa dong 100 --> 120
DBMS_OUTPUT.PUT_LINE('TEST 2: '||my_table.count);
DBMS_OUTPUT.PUT_LINE ('Row first: '||my_table.first||' Row
last: '||my_table.last);
END;

SET SERVEROUTPUT ON
DECLARE
TYPE CourseList IS TABLE OF VARCHAR2(20);
courses CourseList;
BEGIN

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 44 of 86


Oracle 10g Made Easy

courses := CourseList ( 'Oracle9i SQL', 'Oracle FUNI', 'Oracle FUN


II',
'Tuning', 'Oracle PL/SQL', 'Oracle Form',
'Oracle Report','Oracle 10g');
dbms_output.put_line ('1. '||courses.count||' - '||courses(courses.last));
courses.TRIM(2);
dbms_output.put_line ('2. '||courses.count||' - '||courses(courses.last));
courses.DELETE(courses.LAST);
dbms_output.put_line ('3. '||courses.count||' - '||courses(courses.last));
courses.TRIM(4);
dbms_output.put_line('4. '||courses.count||' - '||courses(courses.last));
END;

6. Writing Explicit Cursors


SL Use Statements
DECLARE
CURSOR emp_cursor IS
SELECT employee_id, last_name
FROM employees;
1. Open the cursor
CURSOR dept_cursor IS
1 2. Fetch a row
SELECT *
3. Close the Cursor
FROM departments
WHERE location_id = 170;
BEGIN
...
LOOP
FETCH emp_cursor INTO v_empno,v_ename;
EXIT WHEN ...;
Fetching Data from the
2 ...
Cursor
-- Process the retrieved data

END LOOP;
SET SERVEROUTPUT ON
DECLARE
v_empno employees.employee_id%TYPE;
v_ename employees.last_name%TYPE;
CURSOR emp_cursor IS
SELECT employee_id, last_name FROM employees;
BEGIN
The %NOTFOUND OPEN emp_cursor;
3 and %ROWCOUNT LOOP
Attributes FETCH emp_cursor INTO v_empno, v_ename;
EXIT WHEN emp_cursor%ROWCOUNT > 10 OR
emp_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE (TO_CHAR(v_empno)
||' '|| v_ename);
END LOOP;
CLOSE emp_cursor;
END ;
CREATE TABLE temp_list AS SELECT employee_id, last_name
FROM employees WHERE employee_id = 50;
4 Cursors and Records DECLARE
CURSOR emp_cursor IS SELECT employee_id, last_name FROM
employees;

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 45 of 86


Oracle 10g Made Easy

emp_record emp_cursor%ROWTYPE;
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO emp_record;
EXIT WHEN emp_cursor%NOTFOUND;
INSERT INTO temp_list (empid, empname)
VALUES (emp_record.employee_id, emp_record.last_name);
END LOOP;
COMMIT;
CLOSE emp_cursor;
END;

SET SERVEROUTPUT ON
DECLARE
CURSOR emp_cursor IS SELECT last_name, department_id
FROM employees;
BEGIN
FOR emp_record IN emp_cursor LOOP
--implicit open and implicit fetch occur
5 Cursor FOR Loops IF emp_record.department_id = 80 THEN
DBMS_OUTPUT.PUT_LINE (’Employee ’ ||
emp_record.last_name || ’ works in the Sales
Dept. ’);
END IF;
END LOOP; --implicit close and implicit loop exit
END ;
/
SET SERVEROUTPUT ON
BEGIN
FOR emp_record IN (SELECT last_name, department_id FROM
employees) LOOP
--implicit open and implicit fetch occur
IF emp_record.department_id = 80 THEN
Cursor FOR Loops Using DBMS_OUTPUT.PUT_LINE (’Employee ’ ||
6
Subqueries emp_record.last_name
|| ’ works in the Sales Dept. ’);
END IF;
END LOOP; --implicit close occurs
END ;
/

7. Advanced Explicit Cursor Concepts:


SL Use Statements
SET SERVEROUTPUT ON
DECLARE
CURSOR emp_cursor (p_deptno NUMBER, p_job VARCHAR2)
IS
SELECT employee_id, last_name FROM employees
1 Cursors with Parameters
WHERE department_id = p_deptno AND job_id = p_job;
emp_c emp_cursor%rowtype;
BEGIN
OPEN emp_cursor (80, 'SA_REP');
LOOP

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 46 of 86


Oracle 10g Made Easy

FETCH emp_cursor INTO emp_c;


EXIT WHEN emp_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE (‘ROWS :
‘||emp_cursor%rowcount);
END LOOP;
CLOSE emp_cursor;
OPEN emp_cursor (60, 'IT_PROG');
...
END;

SET SERVEROUTPUT ON
DECLARE
CURSOR dept_c IS SELECT * FROM departments WHERE
department_id < 60;
CURSOR emp_c (p_deptno NUMBER) IS
SELECT employee_id, last_name FROM employees
WHERE department_id = p_deptno;
dept_r dept_c%rowtype;
emp_r emp_c%rowtype;
BEGIN
OPEN dept_c;
LOOP
FETCH dept_c INTO dept_r;
EXIT WHEN dept_c%NOTFOUND;
DBMS_OUTPUT.PUT_LINE (dept_r.department_id||’
‘||dept_r.department_name);
OPEN emp_c (dept_r.department_id);
LOOP
FETCH emp_c INTO emp_r;
EXIT WHEN emp_c%NOTFOUND;
DBMS_OUTPUT.PUT_LINE (‘NV : ‘||emp_r.employee_id ||
‘-‘||emp_r.last_name);
END LOOP;
CLOSE emp_c;
END LOOP;
CLOSE dept_c;
END;
/

SET SERVEROUTPUT ON
DECLARE
CURSOR dept_c IS SELECT * FROM departments
WHERE department_id < 60;
CURSOR emp_c (p_deptno NUMBER) IS
SELECT employee_id, last_name FROM employees
WHERE department_id = p_deptno;
BEGIN
FOR dept_r IN dept_c
LOOP
DBMS_OUTPUT.PUT_LINE (dept_r.department_id||’ - ‘||
dept_r.department_name);
FOR emp_r IN emp_c (dept_r.department_id)
LOOP
DBMS_OUTPUT.PUT_LINE (‘NV : ‘||emp_r.employee_id
|| ‘-‘||
emp_r.last_name);

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 47 of 86


Oracle 10g Made Easy

END LOOP;
END LOOP;
END;
/

SET SERVEROUTPUT ON
BEGIN
FOR dept_r IN (SELECT * FROM departments
WHERE department_id<60)
LOOP
DBMS_OUTPUT.PUT_LINE (dept_r.department_id||’ - ‘||
dept_r.department_name);
FOR emp_r IN (SELECT employee_id, last_name
FROM employees
WHERE department_id =dept_r.department_id)
LOOP
DBMS_OUTPUT.PUT_LINE (‘NV : ‘||emp_r.employee_id
|| ‘-‘||
emp_r.last_name);
END LOOP;
END LOOP;
END;
/

DECLARE
CURSOR emp_cursor IS
SELECT employee_id, last_name, department_name
FROM employees,departments
2 The FOR UPDATE Clause WHERE employees.department_id =
departments.department_id
AND employees.department_id = 80
FOR UPDATE OF salary NOWAIT;

SET SERVEROUTPUT ON
DECLARE
CURSOR sal_cursor IS
SELECT department_id, employee_id emp_id, last_name, salary
FROM employees WHERE department_id = 20
FOR UPDATE OF salary NOWAIT;
BEGIN
FOR emp_r IN sal_cursor LOOP
DBMS_OUTPUT.PUT_LINE (emp_r.emp_id||’-
’||emp_r.salary);
The WHERE CURRENT
3 IF emp_r.salary > 5000 THEN
OF Clause
UPDATE employees SET salary = emp_r.salary * 1.10
WHERE CURRENT OF sal_cursor;
END IF;
END LOOP;
COMMIT;
END;
/
SELECT department_id, employee_id emp_id, last_name, salary
FROM employees WHERE department_id = 20;

SET SERVEROUTPUT ON
4 Cursors with Subqueries
DECLARE

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 48 of 86


Oracle 10g Made Easy

CURSOR my_cursor IS
SELECT t1.department_id, t1.department_name, t2.staff
FROM departments t1,
(SELECT department_id dept_id, COUNT(*) AS STAFF
FROM employees GROUP BY department_id) t2
WHERE t1.department_id = t2.dept_id AND t2.staff >=
3;
BEGIN
FOR c1 IN my_cursor
LOOP
DBMS_OUTPUT.PUT_LINE (c1.department_name||’-’||
c1.staff);
END LOOP;
END;
/

8. Handling Exceptions :
SL Use Statements
NO_DATA_FOUND
TOO_MANY_ROWS
Sample predefined exceptions:
1 INVALID_CURSOR
ZERO_DIVIDE
DUP_VAL_ON_INDEX
DEFINE p_deptno = 10
DECLARE
e_emps_remaining EXCEPTION;
PRAGMA EXCEPTION_INIT
(e_emps_remaining, -2292);
BEGIN
DELETE FROM departments
2 Nonpredefined Error WHERE department_id = &p_deptno;
COMMIT;
EXCEPTION
WHEN e_emps_remaining THEN
DBMS_OUTPUT.PUT_LINE ('Cannot remove dept ' ||
TO_CHAR(&p_deptno) || '. Employees exist. ');
END;
/
DECLARE
v_error_code NUMBER;
v_error_message VARCHAR2(255);
BEGIN
...
EXCEPTION
...
Functions for Trapping
3 WHEN OTHERS THEN
Exceptions
ROLLBACK;
v_error_code := SQLCODE ;
v_error_message := SQLERRM ;
INSERT INTO errors
VALUES(v_error_code, v_error_message);
END;
/
4 RAISE_APPLICATION_ERROR set serveroutput on

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 49 of 86


Oracle 10g Made Easy

DECLARE
e_name EXCEPTION;
PRAGMA EXCEPTION_INIT (e_name, -20999);
--Executable section :
BEGIN
DELETE FROM employees
WHERE last_name = 'Higginss';
IF SQL%NOTFOUND THEN
RAISE_APPLICATION_ERROR(-20999,'This is not a
valid last name');
END IF;
-- Exception section :
EXCEPTION
WHEN e_name THEN
dbms_output.put_line('handle the error');
END;
/

9. Creating Procedures:
SL Use Statements
CREATE TABLE T1_kiemtra (thongbao varchar2(200));
DECLARE
v_ename employees.last_name%TYPE;
v_sal employees.salary%TYPE := &p_sal;
BEGIN
SELECT last_name INTO v_ename FROM employees WHERE
salary = v_sal;
INSERT INTO T1_kiemtra (thongbao) VALUES (v_ename || ' -
' || v_sal);
EXCEPTION
WHEN no_data_found THEN
INSERT INTO T1_kiemtra (thongbao)
VALUES ('No employee with a salary of '|| TO_CHAR(v_sal));
WHEN too_many_rows THEN
INSERT INTO T1_kiemtra (thongbao)
VALUES ('More than one employee with a salary of '||
Block Structure for
TO_CHAR(v_sal));
Anonymous
1 WHEN others THEN
PL/SQL Blocks
INSERT INTO T1_kiemtra (thongbao)
VALUES ('Some other error occurred.');
END;
/
SELECT * FROM T1_kiemtra;

CREATE TABLE TEST (


MA NUMBER(4) PRIMARY KEY,
THONGBAO VARCHAR2(100));

CREATE OR REPLACE PROCEDURE INS_TEST


(p_ma IN TEST.ma%TYPE, p_thongbao IN
TEST.thongbao%TYPE)
IS
BEGIN
INSERT INTO TEST (ma, thongbao)
VALUES (p_ma, p_thongbao);

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 50 of 86


Oracle 10g Made Easy

COMMIT;
END INS_TEST;
/

EXECUTE ins_test (1111, 'Database Administrator');

SELECT * FROM TEST;

CREATE OR REPLACE PROCEDURE add_job


(p_jobid IN jobs.job_id%TYPE, p_jobtitle IN jobs.job_title%TYPE)
IS
BEGIN
INSERT INTO jobs (job_id, job_title)
VALUES (p_jobid, p_jobtitle);
2 Developing Procedures
COMMIT;
END add_job;
/
EXECUTE add_job (’IT_DBA’, ’Database Administrator’);

SELECT * FROM jobs WHERE job_id = ’IT_DBA’;


CREATE OR REPLACE PROCEDURE query_emp
( p_id IN employees.employee_id%TYPE,
p_name OUT employees.last_name%TYPE,
p_salary OUT employees.salary%TYPE,
p_comm OUT employees.commission_pct%TYPE)
IS
BEGIN
SELECT last_name, salary, commission_pct
INTO p_name, p_salary, p_comm
FROM employees
3 OUT Parameters: Example
WHERE employee_id = p_id;
END query_emp;
/

VARIABLE g_name VARCHAR2(25)


VARIABLE g_sal NUMBER
VARIABLE g_comm NUMBER
EXECUTE query_emp(171, :g_name, :g_sal, :g_comm)
PRINT g_name

CREATE OR REPLACE PROCEDURE add_dept


( p_name IN departments.department_name%TYPE
DEFAULT 'unknown‘ ,
p_loc IN departments.location_id%TYPE
DEFAULT 1700 )
DEFAULT Option for IS
4
Parameters BEGIN
INSERT INTO departments(department_id,
department_name, location_id)
VALUES (departments_seq.NEXTVAL, p_name, p_loc);
END add_dept;
/
BEGIN
Examples of Passing add_dept;
5
Parameters add_dept ('TRAINING', 2500);
add_dept ( p_loc => 2400, p_name =>'EDUCATION');

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 51 of 86


Oracle 10g Made Easy

add_dept ( p_loc => 1200) ;


END;
/
SELECT department_id, department_name, location_id
FROM departments;
create table log_table ( user_id varchar2(20),
log_date date);
CREATE OR REPLACE PROCEDURE leave_emp2
(p_id IN employees.employee_id%TYPE)
IS
PROCEDURE log_exec IS
BEGIN
INSERT INTO log_table (user_id, log_date) VALUES (USER,
6 Declaring Subprograms
SYSDATE);
END log_exec;
BEGIN
DELETE FROM employees WHERE employee_id = p_id;
log_exec;
END leave_emp2;
/

DECLARE
v_id NUMBER := 163;
BEGIN
Invoking a Procedure from leave_emp2 (v_id); --invoke procedure
7 an Anonymous COMMIT;
PL/SQL Block ...
END;
/

CREATE OR REPLACE PROCEDURE process_emps


IS
CURSOR emp_cursor IS
SELECT employee_id
FROM employees
WHERE department_id = 20;
Invoking a Procedure from
BEGIN
8 Another
FOR emp_rec IN emp_cursor
Procedure
LOOP
raise_salary(emp_rec.employee_id);
END LOOP;
COMMIT;
END process_emps;
/
CREATE PROCEDURE p2_ins_dept(p_locid NUMBER) IS
v_did NUMBER(4);
BEGIN
DBMS_OUTPUT.PUT_LINE ('Procedure p2_ins_dept started');
INSERT INTO departments VALUES (5, 'Dept 5', 145, p_locid);
SELECT department_id INTO v_did FROM employees WHERE
9 Handled Exceptions
employee_id = 999;
END;
/
CREATE PROCEDURE p1_ins_loc(p_lid NUMBER, p_city
VARCHAR2) IS
v_city VARCHAR2(30); v_dname VARCHAR2(30);

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 52 of 86


Oracle 10g Made Easy

BEGIN
DBMS_OUTPUT.PUT_LINE('Main Procedure p1_ins_loc');
INSERT INTO locations (location_id, city) VALUES (p_lid,
p_city);
SELECT city INTO v_city FROM locations WHERE location_id =
p_lid;
DBMS_OUTPUT.PUT_LINE('Inserted city '||v_city);
DBMS_OUTPUT.PUT_LINE('Invoking the procedure p2_ins_dept
...');
p2_ins_dept(p_lid);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE ('No such dept / loc for any
employee');
END;
/

CREATE PROCEDURE p2_noexcep(p_locid NUMBER) IS


v_did NUMBER(4);
BEGIN
DBMS_OUTPUT.PUT_LINE('Procedure p2_noexcep started');
INSERT INTO departments VALUES (6, 'Dept 6', 145, p_locid);
SELECT department_id INTO v_did FROM employees
WHERE employee_id = 999;
END;
/
CREATE PROCEDURE p1_noexcep(p_lid NUMBER, p_city
VARCHAR2) IS
v_city VARCHAR2(30);
v_dname VARCHAR2(30);
10 Unhandled Exceptions
BEGIN
DBMS_OUTPUT.PUT_LINE(' Main Procedure p1_noexcep');
INSERT INTO locations (location_id, city) VALUES (p_lid,
p_city);
SELECT city INTO v_city FROM locations WHERE location_id
= p_lid;
DBMS_OUTPUT.PUT_LINE('Inserted new city '||v_city);
DBMS_OUTPUT.PUT_LINE('Invoking the procedure
p2_noexcep ...');
p2_noexcep(p_lid);
END;
/

11 Removing Procedures DROP PROCEDURE raise_salary;

10. Creating Functions


SL Use Statements
CREATE OR REPLACE FUNCTION q_job
(p_jobid IN jobs.job_id%TYPE)
RETURN VARCHAR2 IS
Syntax for Creating v_jobtitle jobs.job_title%TYPE;
1
Functions BEGIN
SELECT job_title INTO v_jobtitle
FROM jobs WHERE job_id = p_jobid;
RETURN (v_jobtitle);

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 53 of 86


Oracle 10g Made Easy

END q_job;
/
SHOW ERRORS
VARIABLE g_title VARCHAR2(30)
EXECUTE :g_title := q_job (’SA_REP’)
PRINT g_title

CREATE OR REPLACE FUNCTION get_sal


(p_id IN employees.employee_id%TYPE)
RETURN NUMBER
IS
v_salary employees.salary%TYPE :=0;
Creating a Stored Function BEGIN
2 by Using SELECT salary
iSQL*Plus: Example INTO v_salary
FROM employees
WHERE employee_id = p_id;
RETURN v_salary;
END get_sal;
/
CREATE OR REPLACE FUNCTION tax(p_value IN NUMBER)
RETURN NUMBER IS
BEGIN
Invoking Functions in SQL RETURN (p_value * 0.08);
3 Expressions: END tax;
Example /
SELECT employee_id, last_name, salary, tax(salary)
FROM employees
WHERE department_id = 100;
CREATE OR REPLACE FUNCTION valid_deptid
(p_deptid IN departments.department_id%TYPE)
RETURN BOOLEAN
IS
v_dummy VARCHAR2(1);
BEGIN
SELECT ’x’
INTO v_dummy
FROM departments
WHERE department_id = p_deptid;
RETURN (TRUE);
EXCEPTION
WHEN NO_DATA_FOUND THEN
Benefits of Stored
4 RETURN (FALSE);
Procedures and Functions
END valid_deptid;
/

CREATE OR REPLACE PROCEDURE new_emp


(p_lname employees.last_name%TYPE,
p_fname employees.first_name%TYPE, p_email
employees.email%TYPE,
p_job employees.job_id%TYPE DEFAULT ’SA_REP’,
p_mgr employees.manager_id%TYPE DEFAULT 145,
p_sal employees.salary%TYPE DEFAULT 1000,
p_comm employees.commission_pct%TYPE DEFAULT 0,
p_deptid employees.department_id%TYPE DEFAULT 30)
IS

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 54 of 86


Oracle 10g Made Easy

BEGIN
IF valid_deptid(p_deptid) THEN
INSERT INTO employees(employee_id, last_name, first_name,
email,
job_id,manager_id, hire_date, salary, commission_pct,
department_id)
VALUES (employees_seq.NEXTVAL, p_lname, p_fname,
p_email,
p_job, p_mgr, TRUNC (SYSDATE, ’DD’), p_sal, p_comm,
p_deptid);
ELSE
RAISE_APPLICATION_ERROR (-20204,’Invalid department ID.
Try again.’);
END IF;
END new_emp;
/

EXECUTE new_emp(p_lname=>'Harris', p_fname=>'Jane',


p_email=>'JAHARRIS', p_deptid => 15)

EXECUTE new_emp(p_lname=>'Harris', p_fname=>'Jane',


p_email=> 'JAHARRIS', p_deptid => 80)

11. Managing Subprograms:

SL Use Statements
SELECT object_name, object_type
List All Procedures and FROM user_objects
1
Functions WHERE object_type in ('PROCEDURE','FUNCTION')
ORDER BY object_name;
SELECT text
List the Code of
FROM user_source
2 Procedures
WHERE name = 'QUERY_EMPLOYEE'
and Functions
ORDER BY line;
CREATE OR REPLACE PROCEDURE log_execution
IS
BEGIN
INPUT INTO log_table (user_id, log_date)
-- wrong
VALUES (USER, SYSDATE);
Detecting Compilation END;
3
Errors: Example /

SELECT line || '/' || position POS, text


FROM user_errors
WHERE name = 'LOG_EXECUTION'
ORDER BY line;

List Compilation Errors SHOW ERRORS PROCEDURE log_execution


4 by Using
SHOW ERRORS

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 55 of 86


Oracle 10g Made Easy

12. Creating Packages:


SL Use Statements
CREATE OR REPLACE PACKAGE comm_package IS
g_comm NUMBER := 0.10; --initialized to 0.10
Creating a Package
PROCEDURE reset_comm
1 Specification:
(p_comm IN NUMBER);
Example
END comm_package;
/
CREATE OR REPLACE PACKAGE BODY comm_package
IS
FUNCTION validate_comm (p_comm IN NUMBER)
RETURN BOOLEAN
IS
v_max_comm NUMBER;
BEGIN
SELECT MAX(commission_pct)
INTO v_max_comm
FROM employees;
IF p_comm > v_max_comm THEN RETURN(FALSE);
ELSE RETURN(TRUE);
END IF;
END validate_comm;
Creating a Package Body:
2 /
Example
PROCEDURE reset_comm (p_comm IN NUMBER)
IS
BEGIN
IF validate_comm(p_comm) THEN
g_comm:=p_comm; --reset global variable
ELSE
RAISE_APPLICATION_ERROR(-20210,'Invalid
commission');
END IF;
END reset_comm;
END comm_package;
/

CREATE OR REPLACE PACKAGE BODY comm_package IS


...
PROCEDURE reset_comm (p_comm IN NUMBER)
IS
BEGIN
IF validate_comm(p_comm) THEN
Invoking Package g_comm := p_comm;
3
Constructs ELSE
RAISE_APPLICATION_ERROR
(-20210, 'Invalid commission');
END IF;
END reset_comm;
END comm_package;
/
EXECUTE comm_package.reset_comm(0.15)
Invoking Package
4 EXECUTE scott.comm_package.reset_comm(0.15)
Constructs
EXECUTE comm_package.reset_comm@ny(0.15)
Declaring a Bodiless SET SERVEROUTPUT ON
5
Package CREATE OR REPLACE PACKAGE global_consts IS

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 56 of 86


Oracle 10g Made Easy

mile_2_kilo CONSTANT NUMBER := 1.6093;


kilo_2_mile CONSTANT NUMBER := 0.6214;
yard_2_meter CONSTANT NUMBER := 0.9144;
meter_2_yard CONSTANT NUMBER := 1.0936;
END global_consts;
/
EXECUTE DBMS_OUTPUT.PUT_LINE ('20 miles = '||20*
global_consts.mile_2_kilo||'
km')

CREATE OR REPLACE PROCEDURE meter_to_yard


(p_meter IN NUMBER, p_yard OUT NUMBER)
IS
BEGIN
Referencing a Public
p_yard := p_meter * global_consts.meter_2_yard;
6 Variable from
END meter_to_yard;
a Stand-Alone Procedure
/
VARIABLE yard NUMBER
EXECUTE meter_to_yard (1, :yard)
PRINT yard
DROP PACKAGE package_name;
7 Removing Packages
DROP PACKAGE BODY package_name;

13.More Package Concepts :


SL Use Statements
SET SERVEROUTPUT ON
CREATE OR REPLACE PACKAGE overload IS
procedure p (x number);
procedure p (n number);
END;
/
CREATE OR REPLACE PACKAGE BODY overload IS
PROCEDURE p (x number) IS
BEGIN
DBMS_OUTPUT.PUT_LINE ('Tham so hinh thuc x :'||x);
1 Overloading
END;
PROCEDURE p (n number) IS
BEGIN
DBMS_OUTPUT.PUT_LINE ('Tham so hinh thuc n :'||n);
END;
END overload;
/
EXECUTE overload.p (x=>4);
EXECUTE overload.p (n=>3);

CREATE OR REPLACE PACKAGE over_pack


IS
PROCEDURE add_dept
(p_deptno IN departments.department_id%TYPE,
p_name IN departments.department_name%TYPE
2 Overloading: Example DEFAULT 'unknown',
p_loc IN departments.location_id%TYPE DEFAULT 0);
PROCEDURE add_dept
(p_name IN departments.department_name%TYPE
DEFAULT 'unknown',
p_loc IN departments.location_id%TYPE DEFAULT 0);

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 57 of 86


Oracle 10g Made Easy

END over_pack;
/

CREATE OR REPLACE PACKAGE BODY over_pack IS


PROCEDURE add_dept
(p_deptno IN departments.department_id%TYPE,
p_name IN departments.department_name%TYPE DEFAULT
'unknown',
p_loc IN departments.location_id%TYPE DEFAULT 0)
IS
BEGIN
INSERT INTO departments (department_id, department_name,
location_id)
VALUES (p_deptno, p_name, p_loc);
END add_dept;
PROCEDURE add_dept
(p_name IN departments.department_name%TYPE DEFAULT
'unknown',
p_loc IN departments.location_id%TYPE DEFAULT 0)
IS
BEGIN
INSERT INTO departments (department_id, department_name,
location_id)
VALUES (departments_seq.NEXTVAL, p_name, p_loc);
END add_dept;
END over_pack;
/

FUNCTION TO_CHAR (p1 DATE) RETURN VARCHAR2;


FUNCTION TO_CHAR (p2 NUMBER) RETURN VARCHAR2;
FUNCTION TO_CHAR (p1 DATE, P2 VARCHAR2) RETURN
3 Overloading: Example VARCHAR2;
FUNCTION TO_CHAR (p1 NUMBER, P2 VARCHAR2) RETURN
VARCHAR2;

CREATE OR REPLACE PACKAGE pack_cur


IS
CURSOR c1 IS SELECT employee_id
FROM employees
ORDER BY employee_id DESC;
PROCEDURE proc1_3rows;
PROCEDURE proc4_6rows;
END pack_cur;
/
Controlling the Persistent
4 CREATE OR REPLACE PACKAGE BODY pack_cur IS
State of a Package Cursor
v_empno NUMBER;
PROCEDURE proc1_3rows IS
BEGIN
OPEN c1;
LOOP
FETCH c1 INTO v_empno;
DBMS_OUTPUT.PUT_LINE('Id :' ||(v_empno));
EXIT WHEN c1%ROWCOUNT >= 3;
END LOOP;
END proc1_3rows;

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 58 of 86


Oracle 10g Made Easy

PROCEDURE proc4_6rows IS
BEGIN
LOOP
FETCH c1 INTO v_empno;
DBMS_OUTPUT.PUT_LINE('Id :' ||(v_empno));
EXIT WHEN c1%ROWCOUNT >= 6;
END LOOP;
CLOSE c1;
END proc4_6rows;
END pack_cur;
/

SET SERVEROUTPUT ON
5 Executing PACK_CUR EXECUTE pack_cur.proc1_3rows
EXECUTE pack_cur.proc4_6rows
CREATE OR REPLACE PACKAGE emp_package IS
TYPE emp_table_type IS TABLE OF employees%ROWTYPE
INDEX BY BINARY_INTEGER;
PROCEDURE read_emp_table (p_emp_table OUT
emp_table_type);
END emp_package;
/
CREATE OR REPLACE PACKAGE BODY emp_package IS
PROCEDURE read_emp_table (p_emp_table OUT
PL/SQL Tables and Records emp_table_type) IS
6
in Packages i BINARY_INTEGER := 0;
BEGIN
FOR emp_record IN (SELECT * FROM employees) LOOP
p_emp_table(i) := emp_record;
i:= i+1;
END LOOP;
END read_emp_table;
END emp_package;
/

SET SERVEROUTPUT ON
DECLARE
v_emp_table emp_package.emp_table_type;
BEGIN
emp_package.read_emp_table(v_emp_table);
FOR i IN 1 .. 5 LOOP
PL/SQL Tables and Records DBMS_OUTPUT.PUT_LINE(‘Nhan vien :
7
in Packages '||v_emp_table(i).last_name ||
‘ co luong : ‘||
v_emp_table(i).salary);
END loop;
END;
/

14. Creating Database Triggers:


SL Use Statements
CREATE OR REPLACE TRIGGER secure_emp
Creating DML BEFORE INSERT ON employees
1
Statement Triggers BEGIN
IF (TO_CHAR(SYSDATE,'DY') IN ('SAT','SUN')) OR

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 59 of 86


Oracle 10g Made Easy

(TO_CHAR(SYSDATE,'HH24:MI')
NOT BETWEEN '08:00' AND '18:00') THEN
RAISE_APPLICATION_ERROR (-20500,'You
may insert into EMPLOYEES table only
during business hours.');
END IF;
END;
/

INSERT INTO employees (employee_id, last_name,


first_name, email, hire_date,
Testing
2 job_id, salary, department_id)
SECURE_EMP
VALUES ( 300, 'Smith', 'Rob', 'RSMITH', SYSDATE,
'IT_PROG', 4500, 60);
CREATE OR REPLACE TRIGGER secure_emp
BEFORE INSERT OR UPDATE OR DELETE ON employees
BEGIN
IF (TO_CHAR (SYSDATE,'DY') IN ('SAT','SUN')) OR
(TO_CHAR (SYSDATE, 'HH24') NOT BETWEEN '08' AND '18')
THEN
IF DELETING THEN
RAISE_APPLICATION_ERROR (-20502,'You may delete from
EMPLOYEES table only during business hours.');
ELSIF INSERTING THEN
Using Conditional RAISE_APPLICATION_ERROR (-20500,'You may insert into
3
Predicates EMPLOYEES table only during business hours.');
ELSIF UPDATING ('SALARY') THEN
RAISE_APPLICATION_ERROR (-20503,'You may update
SALARY only during business hours.');
ELSE
RAISE_APPLICATION_ERROR (-20504,'You may update
EMPLOYEES table only during normal hours.');
END IF;
END IF;
END;
/
CREATE OR REPLACE TRIGGER restrict_salary
BEFORE INSERT OR UPDATE OF salary ON employees
FOR EACH ROW
BEGIN
IF NOT (:NEW.job_id IN ('AD_PRES', 'AD_VP'))
AND :NEW.salary > 15000
Creating DML Row
4 THEN
Triggers
RAISE_APPLICATION_ERROR (-20202,'Employee
cannot earn this amount');
END IF;
END;
/

CREATE OR REPLACE TRIGGER audit_emp_values


AFTER DELETE OR INSERT OR UPDATE ON employees
FOR EACH ROW
Using OLD and
5 BEGIN
NEW Qualifiers
INSERT INTO audit_emp_table (user_name, timestamp,
id, old_last_name, new_last_name, old_title,
new_title, old_salary, new_salary)

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 60 of 86


Oracle 10g Made Easy

VALUES (USER, SYSDATE, :OLD.employee_id ,


:OLD.last_name , :NEW.last_name , :OLD.job_id ,
:NEW.job_id , :OLD.salary , :NEW.salary );
END;
/

CREATE OR REPLACE TRIGGER derive_commission_pct


BEFORE INSERT OR UPDATE OF salary ON employees
FOR EACH ROW
WHEN (NEW.job_id = 'SA_REP')
BEGIN
IF INSERTING THEN
:NEW.commission_pct := 0;
Restricting a Row
6 ELSIF :OLD.commission_pct IS NULL THEN :NEW.commission_pct
Trigger
:= 0;
ELSE
:NEW.commission_pct := :OLD.commission_pct + 0.05;
END IF;
END;
/

CREATE TABLE new_emps AS


SELECT employee_id, last_name, salary, department_id, email, job_id,
hire_date
FROM employees;
CREATE TABLE new_depts AS
SELECT d.department_id, d.department_name, d.location_id,
Creating an sum(e.salary) tot_dept_sal
7 INSTEAD OF FROM employees e, departments d
Trigger WHERE e.department_id = d.department_id
GROUP BY d.department_id, d.department_name, d.location_id;
CREATE VIEW emp_details AS
SELECT e.employee_id, e.last_name, e.salary, e.department_id,
e.email, e.job_id, d.department_name, d.location_id
FROM employees e, departments d
WHERE e.department_id = d.department_id;
CREATE OR REPLACE TRIGGER new_emp_dept
INSTEAD OF INSERT OR UPDATE OR DELETE ON emp_details
FOR EACH ROW
BEGIN
IF INSERTING THEN
INSERT INTO new_emps
VALUES (:NEW.employee_id, :NEW.last_name, :NEW.salary,
:NEW.department_id, :NEW.email, :New.job_id,
SYSDATE);
Creating an
UPDATE new_depts
8 INSTEAD OF
SET tot_dept_sal = tot_dept_sal + :NEW.salary
Trigger
WHERE department_id = :NEW.department_id;
ELSIF DELETING THEN
DELETE FROM new_emps
WHERE employee_id = :OLD.employee_id;
UPDATE new_depts
SET tot_dept_sal = tot_dept_sal - :OLD.salary
WHERE department_id = :OLD.department_id;
ELSIF UPDATING ('salary') THEN
UPDATE new_emps

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 61 of 86


Oracle 10g Made Easy

SET salary = :NEW.salary


WHERE employee_id = :OLD.employee_id;
UPDATE new_depts
SET tot_dept_sal = tot_dept_sal + (:NEW.salary - :OLD.salary)
WHERE department_id = :OLD.department_id;
ELSIF UPDATING ('department_id') THEN
UPDATE new_emps
SET department_id = :NEW.department_id
WHERE employee_id = :OLD.employee_id;
UPDATE new_depts
SET tot_dept_sal = tot_dept_sal - :OLD.salary
WHERE department_id = :OLD.department_id;
UPDATE new_depts
SET tot_dept_sal = tot_dept_sal + :NEW.salary
WHERE department_id = :NEW.department_id;
END IF;
END;
/

CREATE OR REPLACE TRIGGER audit_emp_trig


AFTER UPDATE or INSERT or DELETE on EMPLOYEES
FOR EACH ROW
BEGIN
IF DELETING THEN var_pack.set_g_del(1);
ELSIF INSERTING THEN var_pack.set_g_ins(1);
ELSIF UPDATING ('SALARY')
THEN var_pack.set_g_up_sal(1);
ELSE var_pack.set_g_upd(1);
After Row and After END IF;
9
Statement Triggers END audit_emp_trig;
/

CREATE OR REPLACE TRIGGER audit_emp_tab


AFTER UPDATE or INSERT or DELETE on employees
BEGIN
audit_emp;
END audit_emp_tab;
/

CREATE OR REPLACE PACKAGE var_pack


IS
-- these functions are used to return the
-- values of package variables
FUNCTION g_del RETURN NUMBER;
FUNCTION g_ins RETURN NUMBER;
FUNCTION g_upd RETURN NUMBER;
Demonstration:
FUNCTION g_up_sal RETURN NUMBER;
VAR_PACK
10 -- these procedures are used to modify the
Package
-- values of the package variables
Specification
PROCEDURE set_g_del (p_val IN NUMBER);
PROCEDURE set_g_ins (p_val IN NUMBER);
PROCEDURE set_g_upd (p_val IN NUMBER);
PROCEDURE set_g_up_sal (p_val IN NUMBER);
END var_pack;
/

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 62 of 86


Oracle 10g Made Easy

CREATE OR REPLACE PROCEDURE audit_emp IS


v_del NUMBER := var_pack.g_del;
v_ins NUMBER := var_pack.g_ins;
v_upd NUMBER := var_pack.g_upd;
v_up_sal NUMBER := var_pack.g_up_sal;
BEGIN
IF v_del + v_ins + v_upd != 0 THEN
UPDATE audit_table SET del = del + v_del, ins = ins + v_ins,
upd = upd + v_upd
Demonstration: WHERE user_name=USER AND tablename='EMPLOYEES'
Using the AND column_name IS NULL;
11
AUDIT_EMP END IF;
Procedure IF v_up_sal != 0 THEN
UPDATE audit_table SET upd = upd + v_up_sal
WHERE user_name=USER AND tablename='EMPLOYEES'
AND column_name = 'SALARY';
END IF;
-- resetting global variables in package VAR_PACK
var_pack.set_g_del (0); var_pack.set_g_ins (0);
var_pack.set_g_upd (0); var_pack.set_g_up_sal (0);
END audit_emp;
/

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 63 of 86


Oracle 10g Made Easy

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 64 of 86


Oracle 10g Made Easy

KEYBOARD SHORTCUTS :

F2 => LAYOUT EDITOR


F3=> OBJECT NAVIGATOR
F4=> PROPERTY PALATE.

CTRL+SHIFT+K => COMPILE


CTRL+T => MAKE EXECUTABLE FILE. e.g. (.fmx)

ctrl+J => connect

Software Desktop Shortcuts :

C:\orant\BIN\ifrun60.EXE [installation folder]


C:\ITINV\MAIN\ITINV_MAIN.fmx [form folder]
itinv/i@home [username/password@database]

Maximum Used Triggers:

WHEN-NEW-FORMS-INSTANCES = WHEN FORM LOADS


POST-CHANGE =FIRES ON EVERY KEY STROKE.
KEY-NEXT-ITEM = FIRES ON KEY STROKE ON A PARTICULAR ITEM.
WHEN-BUTTON-PRESSED =WHEN BUTTON IS PRESSED.
ON-ERROR = FIRES ON ERROR OCCURED.
KEY-UP = FIRES WHEN CURSOR KEY UP IS PRESSED.
WHEN-VALIDATE-RECORD = VALIDATION ON RECORD LEVEL.

Model View Controller:

Model :

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 65 of 86


Oracle 10g Made Easy

SCHEMA SCRIPTS :

-- Schema : ENSOFTBD

CREATE USER ENSOFTBD IDENTIFIED BY E;


GRANT DBA TO ENSOFTBD;

CREATE TABLE BACKPATH


(
ID NUMBER(2),
EXPPATH VARCHAR2(50 BYTE),
SUPER VARCHAR2(10 BYTE),
PASSWD VARCHAR2(10 BYTE),
DRIVE CHAR(1 BYTE)
);

CREATE TABLE COMPANY


(
ID NUMBER(2),
NAME VARCHAR2(100 BYTE)
);

CREATE TABLE DESIG


(
CODE CHAR(1 BYTE),
NAME VARCHAR2(30 BYTE)
);

CREATE TABLE OFFICE


(
CODE VARCHAR2(2 BYTE),
NAME VARCHAR2(50 BYTE)
);

CREATE TABLE PATH


(
ID NUMBER(2),
PATH VARCHAR2(100 BYTE)
);

CREATE TABLE PHPMODEL


(
EMPID NUMBER(11),
EMPNAME VARCHAR2(50 BYTE),
DOJ DATE,
OFFICE VARCHAR2(2 BYTE),
GENDER CHAR(1 BYTE),
DESIG CHAR(1 BYTE),

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 66 of 86


Oracle 10g Made Easy

CORRECT CHAR(1 BYTE),


OPRTR VARCHAR2(10 BYTE),
INDATE DATE,
LUSR VARCHAR2(10 BYTE),
LUDT DATE
);

CREATE TABLE PHPSL


(
ID NUMBER(3),
TABNAME VARCHAR2(200 BYTE),
SL NUMBER(11)
);

----------------------- DATA IN TABLES.----------------------------------------------------

ALTER TABLE PHPMODEL ADD (CONSTRAINT PK_PHPMODEL_EMPID PRIMARY


KEY(EMPID));

INSERT INTO PHPSL ( ID, TABNAME, SL ) VALUES ( 1, 'PHPMODEL', 8);


commit;

INSERT INTO PHPMODEL ( EMPID, EMPNAME, DOJ, OFFICE, GENDER, DESIG,


CORRECT, OPRTR, INDATE, LUSR,LUDT ) VALUES ( 6, 'SARWAR', TO_Date(
'01/01/2013 12:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM'), '01', 'M', '4', 'N', 'TUSHAR',
TO_Date( '01/03/2014 08:58:09 PM', 'MM/DD/YYYY HH:MI:SS AM'), 'ENSOFTBD',
TO_Date( '01/04/2014 06:59:08 PM', 'MM/DD/YYYY HH:MI:SS AM'));
INSERT INTO PHPMODEL ( EMPID, EMPNAME, DOJ, OFFICE, GENDER, DESIG,
CORRECT, OPRTR, INDATE, LUSR,LUDT ) VALUES ( 3, 'AWFASFSADF', TO_Date(
'01/01/2013 12:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM'), '01', 'M', '4', 'N', 'ENSOFTBD',
TO_Date( '01/03/2014 08:47:54 PM', 'MM/DD/YYYY HH:MI:SS AM'), NULL, NULL);
INSERT INTO PHPMODEL ( EMPID, EMPNAME, DOJ, OFFICE, GENDER, DESIG,
CORRECT, OPRTR, INDATE, LUSR,LUDT ) VALUES ( 4, 'ASFASFASD', TO_Date(
'02/01/2013 12:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM'), '01', 'M', '8', 'Y', 'ENSOFTBD',
TO_Date( '01/03/2014 08:49:14 PM', 'MM/DD/YYYY HH:MI:SS AM'), NULL, NULL);
INSERT INTO PHPMODEL ( EMPID, EMPNAME, DOJ, OFFICE, GENDER, DESIG,
CORRECT, OPRTR, INDATE, LUSR,LUDT ) VALUES ( 5, 'AEWFGASFSADF', TO_Date(
'01/01/2013 12:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM'), '01', 'M', '8', 'Y', 'ENSOFTBD',
TO_Date( '01/03/2014 08:49:33 PM', 'MM/DD/YYYY HH:MI:SS AM'), NULL, NULL);
INSERT INTO PHPMODEL ( EMPID, EMPNAME, DOJ, OFFICE, GENDER, DESIG,
CORRECT, OPRTR, INDATE, LUSR,LUDT ) VALUES ( 8, 'safsdsdsfdfsd', TO_Date(
'01/01/2013 12:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM'), '01', 'M', '8', 'N', 'ENSOFTBD',
TO_Date( '01/04/2014 05:34:28 PM', 'MM/DD/YYYY HH:MI:SS AM'), NULL, NULL);
INSERT INTO PHPMODEL ( EMPID, EMPNAME, DOJ, OFFICE, GENDER, DESIG,
CORRECT, OPRTR, INDATE, LUSR,LUDT ) VALUES ( 7, 'dxbxdzgzx', TO_Date(
'01/01/2013 12:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM'), '03', 'M', '4', 'N', 'ENSOFTBD',
TO_Date( '01/04/2014 05:25:36 PM', 'MM/DD/YYYY HH:MI:SS AM'), NULL, NULL);
commit;

INSERT INTO PATH ( ID, PATH ) VALUES (1, 'D:\HRMS\');

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 67 of 86


Oracle 10g Made Easy

commit;

INSERT INTO OFFICE ( CODE, NAME ) VALUES ( '01', 'DHAKA');


INSERT INTO OFFICE ( CODE, NAME ) VALUES ( '02', 'KHULNA');
INSERT INTO OFFICE ( CODE, NAME ) VALUES ( '03', 'RAJSHAHI');
INSERT INTO OFFICE ( CODE, NAME ) VALUES ( '04', 'CHITTAGONG');
INSERT INTO OFFICE ( CODE, NAME ) VALUES ( '05', 'BORISAL');
commit;

INSERT INTO DESIG ( CODE, NAME ) VALUES ( '1', 'MANAGER');


INSERT INTO DESIG ( CODE, NAME ) VALUES ( '2', 'WORKER');
INSERT INTO DESIG ( CODE, NAME ) VALUES ( '3', 'PEON');
INSERT INTO DESIG ( CODE, NAME ) VALUES ( '4', 'SALES');
INSERT INTO DESIG ( CODE, NAME ) VALUES ( '5', 'DBA');
INSERT INTO DESIG ( CODE, NAME ) VALUES ( '6', 'PROGRAMMER');
INSERT INTO DESIG ( CODE, NAME ) VALUES ( '7', 'ADMIN');
INSERT INTO DESIG ( CODE, NAME ) VALUES ( '8', 'RECEPTIONIST');
commit;

INSERT INTO COMPANY ( ID, NAME ) VALUES ( 1, 'ENLIGHTENED SOFTWARE');


commit;

INSERT INTO BACKPATH ( ID, EXPPATH, SUPER, PASSWD, DRIVE ) VALUES ( 1,


'D:\oracle\product\10.2.0\db_1\bin\', 'ENSOFTBD', 'E', 'D');
commit;

Real Environment Maximum used Forms PL-SQL Scripts:


Auto Number Generations :

PROCEDURE P_AUTONO (VID IN NUMBER,P1 OUT NUMBER) IS


BEGIN
SELECT SL INTO P1 FROM ENSOFTBD.PHPSL WHERE ID=VID FOR UPDATE NOWAIT;
P1:=P1+1;
UPDATE ENSOFTBD.PHPSL SET SL=P1 WHERE ID=VID;
FORMS_DDL('COMMIT');
END;

WHEN-NEW-FORMS-INSTANCE : WNFI

PROCEDURE WNFI IS
W NUMBER;
H NUMBER;
W1 NUMBER;
H1 NUMBER;
BEGIN
P_COMPANY;
P_ED('CONTROL.SAVE','D');
IF LTRIM(RTRIM(USER))='ENSOFTBD' THEN
P_ED('CONTROL.DELETE','E');
ELSE
P_ED('CONTROL.DELETE','D');
END IF;
W:=GET_WINDOW_PROPERTY(FORMS_MDI_WINDOW, WIDTH);
H:=GET_WINDOW_PROPERTY(FORMS_MDI_WINDOW, HEIGHT);
W1:= GET_WINDOW_PROPERTY('HRMS', WIDTH);

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 68 of 86


Oracle 10g Made Easy

H1:= GET_WINDOW_PROPERTY('HRMS',HEIGHT);
W:=(W-W1)/2;
H:=(H-H1)/2;
SET_WINDOW_PROPERTY('HRMS', POSITION,W,H);
END;

TRAP ERROR :

PROCEDURE TRAP_ERROR IS
errcode NUMBER := ERROR_CODE;
dbmserrcode NUMBER;
dbmserrtext VARCHAR2(200);
errtxt VARCHAR2(80) := ERROR_TEXT;
errtyp VARCHAR2(3) := ERROR_TYPE;
BEGIN
:MESS :=NULL;
dbmserrcode := DBMS_ERROR_CODE;
dbmserrtext := DBMS_ERROR_TEXT;
:CONTROL.MESS := errtyp||'-'||errcode||'-'||errtxt||'-'||dbmserrcode||'-'||dbmserrtext;
exception
when others then
:CONTROL.MESS := errtyp||'-'||errcode||'-'||errtxt||'-'||dbmserrcode||'-'||dbmserrtext;
END;

SAVE:-1 (Without Auto Number):

PROCEDURE P_SAVE IS
STP CHAR(1);
VEMPID NUMBER(11);
BEGIN
UPDATE ENSOFTBD.PHPMODEL SET
EMPID=EMPID,
EMPNAME=EMPNAME,
DOJ=DOJ,
OFFICE=OFFICE,
GENDER=GENDER,
DESIG=DESIG,
CORRECT=CORRECT,
LUSR=LTRIM(RTRIM(USER)),
LUDT=SYSDATE
WHERE LTRIM(RTRIM(EMPID))=LTRIM(RTRIM(:PHPMODEL.EMPID));
IF SQL%NOTFOUND THEN
P_AUTONO (1,VEMPID);
INSERT INTO ENSOFTBD.PHPMODEL(EMPID, EMPNAME,DOJ, OFFICE
,GENDER,DESIG, CORRECT,OPRTR,INDATE)
VALUES (VEMPID,:PHPMODEL.EMPNAME,:PHPMODEL.DOJ,:PHPMODEL.OFFICE
,:PHPMODEL.GENDER,:PHPMODEL.DESIG,:PHPMODEL.CORRECT,USER,SYSDATE);
STP:='I';
ELSE
STP:='U';
END IF;
FORMS_DDL('COMMIT');
IF FORM_SUCCESS() AND STP='I' THEN
:CONTROL.MESS:='SAVED';
ELSIF FORM_SUCCESS() AND STP='U' THEN
:CONTROL.MESS:='UPDATED';
END IF;
END;

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 69 of 86


Oracle 10g Made Easy

SAVE:-2 (Auto Number) :

PROCEDURE P_SAVE(VSTP IN CHAR,VMESS OUT VARCHAR2) IS


BEGIN
IF VSTP='I' THEN
P_AUTONO (1,:PHPMODEL.EMPID);
INSERT INTO ENSOFTBD.PHPMODEL(EMPID, EMPNAME,DOJ,
OFFICE
,GENDER,DESIG, CORRECT,OPRTR,INDATE)
VALUES
(:PHPMODEL.EMPID,:PHPMODEL.EMPNAME,:PHPMODEL.DOJ,:PHPMODEL.OFFICE
,:PHPMODEL.GENDER,:PHPMODEL.DESIG,:PHPMODEL.CORRECT,USER,SYSDATE);
ELSIF VSTP='U' THEN
UPDATE ENSOFTBD.PHPMODEL SET
EMPNAME = :PHPMODEL.EMPNAME,
DOJ = :PHPMODEL.DOJ,
OFFICE = :PHPMODEL.OFFICE,
GENDER = :PHPMODEL.GENDER,
DESIG = :PHPMODEL.DESIG,
CORRECT = :PHPMODEL.CORRECT,
LUSR = LTRIM(RTRIM(USER)),
LUDT = SYSDATE
WHERE EMPID=:PHPMODEL.EMPID;
END IF;
FORMS_DDL('COMMIT');
IF FORM_SUCCESS() THEN
IF VSTP='I' THEN
VMESS:='SAVED';
ELSIF VSTP='U' THEN
VMESS:='UPDATED';
END IF;
ELSE
VMESS:='NOT SAVED';
END IF;
END;

DELETE :

PROCEDURE P_DELETE IS
V_ALERT NUMBER;
BEGIN
if F_CODE_EXISTS(:PHPMODEL.EMPID) then ---- IF EXISTS.
set_alert_property('ALERT_DELETE',ALERT_MESSAGE_TEXT,'Do you really want to delete?');
v_alert:=show_alert('ALERT_DELETE');
IF v_alert =Alert_Button1 Then
DELETE FROM ENSOFTBD.PHPMODEL
WHERE LTRIM(RTRIM(EMPID))=LTRIM(RTRIM(:PHPMODEL.EMPID));
FORMS_DDL('COMMIT');
IF FORM_SUCCESS() THEN
:CONTROL.MESS:='DELETED.';
CLEAR_FORM(NO_VALIDATE);
P_COMPANY;
END IF;
else
:CONTROL.MESS:=NULL;
CLEAR_FORM(NO_VALIDATE);
P_COMPANY;
GO_ITEM('CONTROL.CLEAR');
end if;
ELSE ---- IF NOT EXISTS.

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 70 of 86


Oracle 10g Made Easy

GO_ITEM('CONTROL.CLEAR');
END IF;
END;

VALIDATION :

FUNCTION F_VAL RETURN VARCHAR2 IS


MSG VARCHAR2(2000):='';
BEGIN
IF :STP='U' THEN
IF :PHPMODEL.EMPID IS NULL THEN
MSG:=MSG||'EMPLOYEE ID,';
END IF;
/*IF NOT f_CODE_VALIDATION(:PHPMODEL.EMPID) THEN
MSG:=MSG||'EMPLOYEE ID DIGITS ONLY,';
END IF;
IF NOT f_CODE_VALIDATION(:PHPMODEL.OFFICE) THEN
MSG:=MSG||'OFFICE CODE DIGITS ONLY,';
END IF;*/
END IF;
IF :PHPMODEL.EMPNAME IS NULL THEN
MSG:=MSG||'EMPLOYEE NAME,';
END IF;
IF :PHPMODEL.DOJ IS NOT NULL THEN
IF
TO_CHAR(:PHPMODEL.DOJ,'RRRRMMDD')>TO_CHAR(SYSDATE,'RRRRMMDD') THEN
MSG:=MSG||'JOINING DATE,';
END IF;
ELSE
MSG:=MSG||'JOINING DATE NULL,';
END IF;
IF :PHPMODEL.DESIG IS NULL THEN
MSG:=MSG||'DESIGNATION,';
END IF;
RETURN MSG;
END;

CLEAR FORM:

CLEAR_FORM(NO_VALIDATE);

ENSURE DIGITS IN A TEXT FIELD :

function f_CODE_VALIDATION (mcode varchar2) return BOOLEAN is


mlen number;
x char(14);
MBOOLEAN BOOLEAN;
begin
select length(ltrim(rtrim(mcode))) into mlen from SYS.dual;
for i in 1 .. mlen loop
x:=substr(ltrim(rtrim(mcode)),i,1);
if ASCII(x) not BETWEEN 48 AND 57 then
MBOOLEAN:=FALSE;
IF MBOOLEAN=FALSE THEN
EXIT;
END IF;
end if;
end loop;
return mBOOLEAN;
end f_CODE_VALIDATION;

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 71 of 86


Oracle 10g Made Easy

SHOW LOV:

PROCEDURE P_OFFICE_KNI(VCODE VARCHAR2) IS


LV BOOLEAN;
CURSOR C_OFFICE IS SELECT CODE,NAME FROM ENSOFTBD.OFFICE
WHERE LTRIM(RTRIM(CODE))=LTRIM(RTRIM(VCODE));
MCODE ENSOFTBD.OFFICE.CODE%TYPE;
BEGIN
IF :PHPMODEL.OFFICE IS NULL THEN
LV:=SHOW_LOV('LOV_OFFICE');
END IF;
OPEN C_OFFICE;
FETCH C_OFFICE INTO MCODE,:PHPMODEL.OFFICENM;
CLOSE C_OFFICE;
IF MCODE IS NULL THEN
:CONTROL.MESS:='OFFICE CODE NOT FOUND.';
RAISE FORM_TRIGGER_FAILURE;
END IF;
IF :PHPMODEL.OFFICE IS NULL THEN
:CONTROL.MESS:='OFFICE CODE CANNOT BE NULL.';
RAISE FORM_TRIGGER_FAILURE;
END IF;
GO_ITEM('PHPMODEL.GENDER');
END;

ENABLE AND DISABLE ITEMS :

PROCEDURE P_ED (ITEM_NAME VARCHAR2,ED CHAR) IS


BEGIN
IF ED='E' THEN --- ENABLE
IF GET_ITEM_PROPERTY(ITEM_NAME,ENABLED)='FALSE'
THEN

SET_ITEM_PROPERTY(ITEM_NAME,ENABLED,PROPERTY_TRUE);
END IF;
ELSIF ED='D' THEN --- DISABLE.
IF GET_ITEM_PROPERTY(ITEM_NAME,ENABLED)='TRUE' THEN

SET_ITEM_PROPERTY(ITEM_NAME,ENABLED,PROPERTY_FALSE);
END IF;
END IF;
END;

GO TO :

GO_TO(‘BLOCK.ITEM’);

CALL REPORTS WITHOUT PARAMETERS:

run_product(reports,:GLOBAL.REPORTS_PATH||'PHPMODEL.REP', synchronous, runtime, filesystem,' ', null);

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 72 of 86


Oracle 10g Made Easy

CALL REPORT FROM FORMS WITH PARAMETERS:

DECLARE
PD PARAMLIST;
MZHQ VARCHAR2(2);
BEGIN
IF TO_NUMBER(SUBSTR(LTRIM(RTRIM(:BIZ.BMON3)),1,4)) NOT BETWEEN 2012 AND
TO_NUMBER(TO_CHAR(SYSDATE,'RRRR'))+1 THEN
:BIZ.MESS:='INVALID YEAR GIVEN';
END IF;
IF TO_NUMBER(SUBSTR(LTRIM(RTRIM(:BIZ.BMON3)),5,2)) NOT BETWEEN 1 AND 12
THEN
:BIZ.MESS:='INVALID MONTH GIVEN';
END IF;
IF LENGTH(LTRIM(RTRIM(:BIZ.ZONE)))<>3 OR :BIZ.ZONE IS NULL THEN
:BIZ.MESS:='INVALID ZONE GIVEN';
END IF;
PD :=GET_PARAMETER_LIST('TEST');
IF NOT ID_NULL(PD) THEN
DESTROY_PARAMETER_LIST('TEST');
END IF;
SELECT ZHQ INTO MZHQ FROM PADMA.NEWOFFICE WHERE
LTRIM(RTRIM(ZON))=LTRIM(RTRIM(:ZONE))
AND BRANCH IS NULL
AND ZHQ IS NOT NULL
and rownum=1;
PD :=CREATE_PARAMETER_LIST('TEST');
ADD_PARAMETER(PD, 'P_ZHQ', TEXT_PARAMETER,MZHQ);
ADD_PARAMETER(PD, 'P_ZON', TEXT_PARAMETER,:ZONE);
ADD_PARAMETER(PD, 'P_BMON', TEXT_PARAMETER,:BMON3);
Add_Parameter(PD, 'PARAMFORM', TEXT_PARAMETER, 'no');
Add_Parameter(PD, 'MAXIMIZE', TEXT_PARAMETER, 'Yes');
run_product(reports, :GLOBAL.REPORTS_PATH||'BIZ_ZON.rep', synchronous, runtime, filesystem,PD, null);
END;

run_product(reports, :GLOBAL.REPORTS_PATH||'ZHQPRBK.rep', synchronous, runtime, filesystem,' ', null);

DIRECT PRINT WITHOUT SHOWING REPORT IN PREVIEWER :

Run_Product(REPORTS, :GLOBAL.REPORTS_PATH||'PHPMODEL.REP',SYNCHRONOUS,
RUNTIME,FILESYSTEM, '', NULL);

PROCEDURE PRNT IS
pl_id ParamList;
BEGIN
pl_id := Get_Parameter_List('tmpdata');
IF NOT Id_Null(pl_id) THEN
Destroy_Parameter_List( pl_id );
END IF;
pl_id := Create_Parameter_List('tmpdata');
IF NOT Id_Null(pl_id) THEN
Add_Parameter(pl_id,'number_of_copies',TEXT_PARAMETER,'1');
Add_Parameter(pl_id,'DESTYPE',TEXT_PARAMETER,'PRINTER');

Add_Parameter(pl_id,'P_POLICY',TEXT_PARAMETER,LTRIM(RTRIM(:PRBM_POLNO)));
Add_Parameter(pl_id, 'PARAMFORM', TEXT_PARAMETER, 'NO');
Run_Product(REPORTS, :GLOBAL.REPORTS_PATH||'GFPR.REP',
SYNCHRONOUS, RUNTIME,FILESYSTEM, pl_id, NULL);
END IF;
END;

P_ADD:

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 73 of 86


Oracle 10g Made Easy

:CONTROL.STP:='I';
:CONTROL.MESS:=NULL;
GO_ITEM('PHPMODEL.EMPNAME');

P_EDIT:

:CONTROL.STP:='U';
:CONTROL.MESS:=NULL;
GO_ITEM('PHPMODEL.EMPID');

P_CLEAR:

CLEAR_FORM(NO_VALIDATE);
P_COMPANY;
GO_ITEM('CONTROL.ADD');

COLOR CHANGE WITHIN FIELDS :

WHEN NEW ITEM INSTANCE:

DECLARE
pitm varchar2(80);
pitp varchar2(80);
BEGIN
pitm:=ltrim(rtrim(:pitm));
if pitm is not null then
pitp:=Get_Item_Property(pitm,item_type);
end if;
if pitm is not null and pitp='TEXT ITEM' then
Set_Item_Property(pitm,VISUAL_ATTRIBUTE,'v3');
end if;
pitm:=:System.Cursor_Item;
if pitm is not null then
pitp:=Get_Item_Property(pitm,item_type);
end if;
if pitm is not null and pitp='TEXT ITEM' then
Set_Item_Property(pitm,VISUAL_ATTRIBUTE,'v4');
:pitm:=Get_Item_Property(pitm,item_name);
end if;
--F_PROP;
END;

RUN SCRIPTS FROM FORMS :

the_command:='PLUS80.EXE PADMA/'||MPASS||'@'||PD||' @'||:fl.ffPOL;


Host(the_command,NO_PROMPT);

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 74 of 86


Oracle 10g Made Easy

BACKUPS :

PROCEDURE P_BK IS
MPSSWRD VARCHAR2(50);
CURSOR C1 IS SELECT EXPPATH,SUPER,PASSWD,DRIVE FROM
ENSOFTBD.BACKPATH WHERE ID=1;
R1 C1%ROWTYPE;
MBK VARCHAR2(500);
DB VARCHAR2(200);
BEGIN
DB:=GET_APPLICATION_PROPERTY(CONNECT_STRING);
OPEN C1;
FETCH C1 INTO :EXPPATH,:SUPER,:PASSWD,:DRIVE;
CLOSE C1;
mbk:=LTRIM(RTRIM(:EXPPATH))||'\EXP.EXE '||:SUPER||'/'||:PASSWD||'@'||DB||'
FILE='||:DRIVE||':\HRMS\BACKUP\FBACKUP\'||LTRIM(RTRIM(:SUPER))||TO_CHAR(SYSDATE,'RRRRMMDD
-HH24MISS')||'.DMP FULL=N'||' LOG='||:DRIVE||':\HRMS\BACKUP\FBACKUP\'||LTRIM(RTRIM(:SUPER))||'
STATISTICS=NONE';
Host(MBK,NO_PROMPT);
END;

MAKE RAR BY WIN RAR FILES:

PROCEDURE P_RAR IS
RAR VARCHAR2(200);
BEGIN
--C:\Progra~1\WinRAR\WINRAR.EXE a -r -m3 E:\S0025\S0025NOM
E:\BACKTXT\*NOM.SQL
RAR:='C:\Progra~1\WinRAR\WINRAR.EXE a -r -m3
'||:BACKSYS.DRIVE||':\BACKUP\CBACKUP\BK'||TO_CHAR(SYSDATE,'RRRRMMDD-HH24MISS');
RAR:=RAR||' '||:BACKSYS.DRIVE||':\BACKUP\FBACKUP\';
--------------------------------
synchronize;
Host(RAR,NO_PROMPT);
SYNCHRONIZE;
END;

CREATE FOLDER BY FORMS :

PROCEDURE P_CREATE_FOLDER IS
m varchar2(100);
BK varchar2(100);
mDrv varchar2(3):=:DRIVE||':\';
l_hostcommand varchar2(1000);
begin
m:='MKDIR '||mDrv||'BACKUP';
BK:=M||'\';
l_hostcommand := 'cmd /c if not exist '||m||' exit 100';
host(l_hostcommand, no_screen);
if not form_success then
HOST(M,NO_PROMPT);
end if;
--------------------------------------------------
m:='MKDIR '||BK||'FBACKUP';
:BACKSYS.FBACKUP:=M;
l_hostcommand := 'cmd /c if not exist '||m||' exit 100';
host(l_hostcommand, no_screen);
if not form_success then
HOST(M,NO_PROMPT);
end if;
--------------------------------------------------
m:='MKDIR '||BK||'CBACKUP';

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 75 of 86


Oracle 10g Made Easy

:BACKSYS.CBACKUP:=M;
l_hostcommand := 'cmd /c if not exist '||m||' exit 100';
host(l_hostcommand, no_screen);
if not form_success then
HOST(M,NO_PROMPT);
end if;
--------------------------------------------------
m:='MKDIR '||BK||'HBACKUP';
:BACKSYS.HBACKUP:=M;
l_hostcommand := 'cmd /c if not exist '||m||' exit 100';
host(l_hostcommand, no_screen);
if not form_success then
HOST(M,NO_PROMPT);
end if;
--------------------------------------------------
END;

VISIBLE AND INVISIBLE IN FORMS:

PROCEDURE P_VIZ (ITEM_NAME VARCHAR2,ED CHAR) IS


BEGIN
IF ED='E' THEN --- ENABLE
IF GET_ITEM_PROPERTY(ITEM_NAME,VISIBLE)='FALSE' THEN
SET_ITEM_PROPERTY(ITEM_NAME,VISIBLE,PROPERTY_TRUE);
END IF;
ELSIF ED='D' THEN --- DISABLE.
IF GET_ITEM_PROPERTY(ITEM_NAME,VISIBLE)='TRUE' THEN
SET_ITEM_PROPERTY(ITEM_NAME,VISIBLE,PROPERTY_FALSE);
END IF;
END IF;
END;

ENABLE AND DISABLE IN FORMS :

PROCEDURE P_ED (ITEM_NAME VARCHAR2,ED CHAR) IS


BEGIN
IF ED='E' THEN --- ENABLE
IF GET_ITEM_PROPERTY(ITEM_NAME,ENABLED)='FALSE' THEN
SET_ITEM_PROPERTY(ITEM_NAME,ENABLED,PROPERTY_TRUE);
END IF;
ELSIF ED='D' THEN --- DISABLE.
IF GET_ITEM_PROPERTY(ITEM_NAME,ENABLED)='TRUE' THEN
SET_ITEM_PROPERTY(ITEM_NAME,ENABLED,PROPERTY_FALSE);
END IF;
END IF;
END;

LIST ITEMS PROGRAMMATICALLY:

PROCEDURE P_DESIG(MCODE CHAR) IS


CNT NUMBER := 1;
CURSOR C_DESIG IS SELECT CODE,LTRIM(RTRIM(NAME))||'('||LTRIM(RTRIM(CODE))||')' NAME
FROM ENSOFTBD.DESIG
ORDER BY NAME;
BEGIN
--CLEAR_LIST (MCODE);
FIRST_RECORD;
FOR R_DESIG IN C_DESIG LOOP

ADD_LIST_ELEMENT(MCODE,CNT,R_DESIG.NAME,R_DESIG.CODE);
CNT := CNT + 1;

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 76 of 86


Oracle 10g Made Easy

END LOOP;
IF (:SYSTEM.LAST_RECORD = 'TRUE') THEN
FIRST_RECORD;
END IF;
END;

LOGIN AND LOGOUT :

LOGOUT;
LOGON('HR',MPASS||'@'||MDB); ‘HR’=USERNAME, MPASS=PASSWORD, MDB= DATABASE

USERNAME, PASSWORD AND DATABASE IN VARIABLES VU,VP,VD:

VU:=GET_APPLICATION_PROPERTY(USERNAME);
VP:=GET_APPLICATION_PROPERTY(PASSWORD);
VD:=GET_APPLICATION_PROPERTY(CONNECT_STRING);

MENUS:

CALL MENU PROGRAMMATICALLY :

REPLACE_MENU(:GLOBAL.MENUS_PATH||'MAIN_MENU_ONLINE_SMALL.MMX');

MENU TOGGLE:

ENABLE AND DISABLE :

PROCEDURE Toggle_Enabled( menuitem_name VARCHAR2) IS


mi_id MenuItem;
BEGIN
mi_id := Find_Menu_Item( menuitem_name );
IF Get_Menu_Item_Property(mi_id,ENABLED) = 'TRUE' THEN
Set_Menu_Item_Property(mi_id,ENABLED,PROPERTY_FALSE);
ELSE
Set_Menu_Item_Property(mi_id,ENABLED,PROPERTY_TRUE);
END IF;
END;

VISIBLE AND INVISIBLE :

PROCEDURE Toggle_INVISIBLE( menuitem_name VARCHAR2) IS


mi_id MenuItem;
BEGIN
mi_id := Find_Menu_Item( menuitem_name );
IF Get_Menu_Item_Property(mi_id,VISIBLE) = 'TRUE' THEN
Set_Menu_Item_Property(mi_id,VISIBLE,PROPERTY_FALSE);
ELSE
Set_Menu_Item_Property(mi_id,VISIBLE,PROPERTY_TRUE);
END IF;
END;

OPEN FORMS :

OPEN_FORM(:GLOBAL.FORMS_PATH||'BIZ_SHORT.fmx');

SAVE WITH VALIDATIONS:

BEGIN
IF LENGTH(LTRIM(RTRIM(F_VAL)))>10 THEN

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 77 of 86


Oracle 10g Made Easy

:MESS:=F_VAL;
ELSE
P_SAVE;
END IF;
END;

MAIN PROCEDURE IN MAIN FORM:

PROCEDURE P_MAIN IS
W NUMBER;
H NUMBER;
W1 NUMBER;
H1 NUMBER;
VPATH VARCHAR2(100);
BEGIN
SELECT PATH INTO VPATH FROM ENSOFTBD.PATH WHERE ID=1;
:GLOBAL.FORMS_PATH:=VPATH||'FORMS\';
:GLOBAL.REPORTS_PATH:=VPATH||'REPORTS\';
:GLOBAL.MENUS_PATH:=VPATH||'MENUS\';
REPLACE_MENU(:GLOBAL.MENUS_PATH||'MODEL_MENU.MMX');
-----------------------------------------------------------
SET_WINDOW_PROPERTY(forms_mdi_window, TITLE,'HRMS');
SET_WINDOW_PROPERTY('HRMS', window_state, maximize);
SET_WINDOW_PROPERTY(forms_mdi_window, window_state, maximize);
W:=GET_WINDOW_PROPERTY(forms_mdi_window, width);
H:=GET_WINDOW_PROPERTY(forms_mdi_window, height);
W:=W1;
H:=H1;
IF H>H1+50 THEN
SET_WINDOW_PROPERTY('HRMS', width,W1);
SET_WINDOW_PROPERTY('HRMS', height,H1);
W:=(W-W1)/2;
H:=(H-H1)/2;
SET_WINDOW_PROPERTY('HRMS', POSITION, W,H);
ELSE
SET_WINDOW_PROPERTY('HRMS', window_state, maximize);
END IF;
END;

MENU CONTROL DYNAMICALLY :

PROCEDURE P_MENU_CTRL(MROLE VARCHAR2) IS


BEGIN
IF MROLE='05' THEN -- FPR & OR
TOGGLE_INVISIBLE('SYSTEM_MENU.OFFICE_HANDLING');
TOGGLE_INVISIBLE('POLICY_MENU.POLICY_ENTRY_OLD');
TOGGLE_INVISIBLE('HELP_MENU.BANK_BRANCH_ENTRY');
TOGGLE_INVISIBLE('HELP_MENU.DEATH');
TOGGLE_INVISIBLE('HELP_MENU.MATURITY');
TOGGLE_INVISIBLE('HELP_MENU.SURRENDER');
TOGGLE_INVISIBLE('HELP_MENU.SESSION_ENTER');
TOGGLE_INVISIBLE('HELP_MENU.PLANS');
TOGGLE_INVISIBLE('HELP_MENU.RATE');
TOGGLE_ENABLED('COLLECTION_MENU.RENEWAL_CASH');

TOGGLE_INVISIBLE('COLLECTION_MENU.AREAR_COLLECTION');
END IF;
IF MROLE='06' THEN --06-CLAIMS/SB/SURRENDER/MATURITY
TOGGLE_INVISIBLE('POLICY_MENU.SUMMARY');
TOGGLE_INVISIBLE('POLICY_MENU.ALTERATION');
TOGGLE_INVISIBLE('POLICY_MENU.POLICY_ENTRY_OLD');
TOGGLE_INVISIBLE('POLICY_MENU.PRBM_HANDLING');

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 78 of 86


Oracle 10g Made Easy

TOGGLE_INVISIBLE('MENU1.COLLECTION');
TOGGLE_INVISIBLE('HELP_MENU.BANK_BRANCH_ENTRY');
TOGGLE_INVISIBLE('HELP_MENU.PLANS');
TOGGLE_INVISIBLE('HELP_MENU.RATE');
TOGGLE_INVISIBLE('HELP_MENU.SESSION_ENTER');
END IF;
END;

Browse Files :

DECLARE
filename VARCHAR2(256);
BEGIN
filename := GET_FILE_NAME(File_Filter=> 'DMP Files (*.DMP)|*.DMP|');
:fl.ff:=LTRIM(RTRIM(filename));
END;

PROCEDURE P_FORMS IS
filename VARCHAR2(256);
BEGIN
filename := GET_FILE_NAME(File_Filter=> 'FMX Files (*.FMX)|*.FMX|');
:fl.ff:=LTRIM(RTRIM(filename));
END;

PROCEDURE P_REPORTS IS
filename VARCHAR2(256);
BEGIN
filename := GET_FILE_NAME(File_Filter=> 'REP Files (*.REP)|*.REP|');
:fl.rr:=LTRIM(RTRIM(filename));
END;

COLUMN NAME DISPLAY:

SELECT 'REPLACE '||COLUMN_NAME||' WITH M'||COLUMN_NAME FROM USER_TAB_COLUMNS WHERE


TABLE_NAME='NEWOFFICE' ORDER BY COLUMN_ID;

Oracle 10g Reports Call From Forms with Parameter :

PROCEDURE Run_Report (RPT_FILE VARCHAR2,RPT_SVR VARCHAR2)IS


repid REPORT_OBJECT;
v_rep VARCHAR2(100);
v_rep_status VARCHAR2(20);
QT char(1):='''';
rep_svr varchar2(30);
----------------------------------------------
v_doc VARCHAR2(200);
BLK_NAME varchar(100):= :system.cursor_block;
PARA_ORDER VARCHAR2(100);
BEGIN
repid := find_report_object('REP_CALL');
rep_svr:=RPT_SVR;

SET_REPORT_OBJECT_PROPERTY(repid,REPORT_EXECUTION_MODE,BATCH);
SET_REPORT_OBJECT_PROPERTY(repid,REPORT_COMM_MODE,SYNCHRONOU
S);
SET_REPORT_OBJECT_PROPERTY(repid,REPORT_FILENAME,RPT_FILE);

SET_REPORT_OBJECT_PROPERTY(repid,REPORT_DESTYPE,CACHE);

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 79 of 86


Oracle 10g Made Easy

SET_REPORT_OBJECT_PROPERTY(repid,REPORT_DESFORMAT,'PDF');
--SET_REPORT_OBJECT_PROPERTY(repid,REPORT_DESFORMAT,'html');
SET_REPORT_OBJECT_PROPERTY(repid,REPORT_SERVER,rep_svr);
-- for edit -------------
-- SET_REPORT_OBJECT_PROPERTY(repid,REPORT_OTHER,'paramform=no
sdate='||:BLOCK3.STARTDATE||' edate='||:BLOCK3.ENDDATE||' messid='||:BLOCK3.FMESSID);

---SET_REPORT_OBJECT_PROPERTY(repid,REPORT_OTHER,'paramform=no
EMP_ID='||QT||:BLOCK2.ID||QT||' LOAN_DATE='||QT||:BLOCK2.LOAN_DT||QT);
SET_REPORT_OBJECT_PROPERTY(repid,REPORT_OTHER,'paramform=no
P_OFFICE='||:BLOCK3.OFFICE);

v_rep := RUN_REPORT_OBJECT(repid);
v_rep_status := REPORT_OBJECT_STATUS(v_rep);
---message(v_rep_status);
WHILE v_rep_status in ('RUNNING','OPENING_REPORT','ENQUEUED') LOOP
v_rep_status := report_object_status(v_rep);
END LOOP;
IF v_rep_status = 'FINISHED' THEN
/*Display report in the browser*/
v_doc := '/reports/rwservlet/getjobid'|| substr(v_rep,instr(v_rep,'_',-
1)+1)||'?'||'server='||rep_svr;
WEB.SHOW_DOCUMENT(v_doc,'_blank');
ELSE
MESSAGE('Error when running report');
MESSAGE(' ');
END IF;
END;

Calling :
RUN_REPORT('D:\HRMS10g\REPORTS\PHPMODEL_desig.rep','myrpserv');

Oracle 10g Reports Call From Forms without Parameter (From Menu etc.):

DECLARE
rep_url varchar2(2000);
BEGIN
:GLOBAL.REPORTS_PATH:='D:\HRMS10g\REPORTS\';
---
rep_url:='/reports/rwservlet?'||'&report=D:\HRMS10g\REPORTS\PHPMODEL_desig.rep'||'&desformat=ht
mlcss&destype=cache'||'&userid=ensoftbd/e@bappy paramform=yes';
rep_url:='/reports/rwservlet?'||'&report='||:GLOBAL.REPORTS_PATH||'PHPMODEL_desig.jsp'||'&desfor
mat=pdf&destype=cache'||'&userid=ensoftbd/e@bappy paramform=no p_office='||:block3.office;
WEB.SHOW_DOCUMENT(rep_url,'_blank');
END;

For Reports :

(win-7):

1. Change the path of G:\DevSuiteHome_1\reports\conf\rwservlet.properties

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 80 of 86


Oracle 10g Made Easy

add or remove comments as e.g.


SERVER=myrpserv

2. Start Report Server first. e.g.

set ORACLE_HOME=G:\DevSuiteHome_1

set
PATH=%ORACLE_HOME%\bin;%ORACLE_HOME%\jdk\jre\bin;%ORACLE_HOM
E%\jdk\jre\bin;%ORACLE_HOME%\jdk\jre\bin;%ORACLE_HOME%\jlib;%ORACLE
_HOME%\jdk\bin

G:\DEVSUITEHOME_1\BIN\rwserver server=myrpserv autostart=yes

(Win-XP):

1. rwserver SERVER=myserver autostart=yes

Batch file for report server :

set ORACLE_HOME=D:\DevSuite10g
set
PATH=%ORACLE_HOME%\bin;%ORACLE_HOME%\jdk\jre\bin;%ORACLE_HOME%\jdk\jre\bin;%
ORACLE_HOME%\jdk\jre\bin;%ORACLE_HOME%\jlib;%ORACLE_HOME%\jdk\bin
D:\DevSuite10g\BIN\rwserver server=myrpserv autostart=yes

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 81 of 86


Oracle 10g Made Easy

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 82 of 86


Oracle 10g Made Easy

Installing Oracle 10g/11g and Maintaining it.

Steps to complete Oracle 10g Developer Suite in Windows 7 :

For Forms :

1. Increase Virtual Memory as recommended by the OS.


a. Go to systems @ control Pannel
b. Go to Advanced System Settings.
c. Click Settings at Performance Tab.
d. Click Advanced Tab and click Change.
e. Click Custom Size and give values more than recommended given at bottom.

2. Install Oracle 10g @ Complete.

3. Copy the formsweb.cfg to e.g. G:\DevSuiteHome_1\forms\server

4. Run jinit.exe to install jinitiator.

5. Copy jvm.dll to C:\Program Files\Oracle\JInitiator 1.3.1.22\bin (Win -7)

6. Copy jvm.dll to C:\Program Files\Oracle\JInitiator 1.3.1.22\bin\hotspot (Win -7)

7. Start Oc4j Instances.

For Reports :

(win-7):

1. Change the path of G:\DevSuiteHome_1\reports\conf\rwservlet.properties


add or remove comments as e.g.
SERVER=myrpserv

2. Start Report Server first. e.g.

set ORACLE_HOME=G:\DevSuiteHome_1

set
PATH=%ORACLE_HOME%\bin;%ORACLE_HOME%\jdk\jre\bin;%ORACLE_HOM
E%\jdk\jre\bin;%ORACLE_HOME%\jdk\jre\bin;%ORACLE_HOME%\jlib;%ORACLE
_HOME%\jdk\bin

G:\DEVSUITEHOME_1\BIN\rwserver server=myrpserv autostart=yes

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 83 of 86


Oracle 10g Made Easy

(Win-XP):

2. rwserver SERVER=myserver autostart=yes

Oracle 10g Reports Call From Forms with Parameter :

PROCEDURE Run_Report (RPT_FILE VARCHAR2,RPT_SVR VARCHAR2)IS


repid REPORT_OBJECT;
v_rep VARCHAR2(100);
v_rep_status VARCHAR2(20);
QT char(1):='''';
rep_svr varchar2(30);
----------------------------------------------
v_doc VARCHAR2(200);
BLK_NAME varchar(100):= :system.cursor_block;
PARA_ORDER VARCHAR2(100);
BEGIN
repid := find_report_object('REP_CALL');
rep_svr:=RPT_SVR;

SET_REPORT_OBJECT_PROPERTY(repid,REPORT_EXECUTION_MODE,BATCH);
SET_REPORT_OBJECT_PROPERTY(repid,REPORT_COMM_MODE,SYNCHRONOU
S);
SET_REPORT_OBJECT_PROPERTY(repid,REPORT_FILENAME,RPT_FILE);

SET_REPORT_OBJECT_PROPERTY(repid,REPORT_DESTYPE,CACHE);
SET_REPORT_OBJECT_PROPERTY(repid,REPORT_DESFORMAT,'PDF');
--SET_REPORT_OBJECT_PROPERTY(repid,REPORT_DESFORMAT,'html');
SET_REPORT_OBJECT_PROPERTY(repid,REPORT_SERVER,rep_svr);
-- for edit -------------
-- SET_REPORT_OBJECT_PROPERTY(repid,REPORT_OTHER,'paramform=no
sdate='||:BLOCK3.STARTDATE||' edate='||:BLOCK3.ENDDATE||' messid='||:BLOCK3.FMESSID);

---SET_REPORT_OBJECT_PROPERTY(repid,REPORT_OTHER,'paramform=no
EMP_ID='||QT||:BLOCK2.ID||QT||' LOAN_DATE='||QT||:BLOCK2.LOAN_DT||QT);
SET_REPORT_OBJECT_PROPERTY(repid,REPORT_OTHER,'paramform=no
P_OFFICE='||:BLOCK3.OFFICE);

v_rep := RUN_REPORT_OBJECT(repid);
v_rep_status := REPORT_OBJECT_STATUS(v_rep);
---message(v_rep_status);
WHILE v_rep_status in ('RUNNING','OPENING_REPORT','ENQUEUED') LOOP
v_rep_status := report_object_status(v_rep);
END LOOP;
IF v_rep_status = 'FINISHED' THEN
/*Display report in the browser*/
v_doc := '/reports/rwservlet/getjobid'|| substr(v_rep,instr(v_rep,'_',-
1)+1)||'?'||'server='||rep_svr;
WEB.SHOW_DOCUMENT(v_doc,'_blank');
ELSE
MESSAGE('Error when running report');
MESSAGE(' ');
END IF;

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 84 of 86


Oracle 10g Made Easy

END;

Calling :
RUN_REPORT('D:\HRMS10g\REPORTS\PHPMODEL_desig.rep','myrpserv');

Oracle 10g Reports Call From Forms without Parameter (From Menu etc.):

DECLARE
rep_url varchar2(2000);
BEGIN
:GLOBAL.REPORTS_PATH:='D:\HRMS10g\REPORTS\';
---
rep_url:='/reports/rwservlet?'||'&report=D:\HRMS10g\REPORTS\PHPMODEL_desig.rep'||'&desformat=ht
mlcss&destype=cache'||'&userid=ensoftbd/e@bappy paramform=yes';
rep_url:='/reports/rwservlet?'||'&report='||:GLOBAL.REPORTS_PATH||'PHPMODEL_desig.jsp'||'&desfor
mat=pdf&destype=cache'||'&userid=ensoftbd/e@bappy paramform=no p_office='||:block3.office;
WEB.SHOW_DOCUMENT(rep_url,'_blank');
END;

Oracle 11g Fusion Middleware Installation:

(Forms):

1. Install weblogic without creating domains.


2. Install Oracle 11g with domains.
3. Configure internet explorer by setting down the security level.
4. Install java.
5. Check formsweb.cfg at:
E:\Ora11GDevSuite\Middleware\user_projects\domains\Cl
assicDomain\servers\AdminServer\tmp\_WL_user\formsap
p_11.1.2\xb7byf\config
6. Give tnsnames.ora at:
E:\Ora11GDevSuite\Middleware\asinst_1\config

(Reports):

Start Report Server :

Step -1:

E:\Ora11GDevSuite\Middleware\asinst_1\bin\opmnctl createcomponent -
adminUsername weblogic33 -adminHost S0020002L -adminPort 7001 -oracleInstance
E:\Ora11GDevSuite\Middleware\asinst_1 -instanceName asinst_3 -componentName
RPRTSRVR33 -componentType ReportsServerComponent

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 85 of 86


Oracle 10g Made Easy

Step-2:

E:\Ora11GDevSuite\Middleware\asinst_1\bin\opmnctl startproc ias-


component=RPRTSRVR33

Step -3:

rwserver server=RPRTSRVR33

Step -4:

Check Diagnostic of Report server :

E:\Ora11GDevSuite\Middleware\asinst_1\config\reports\bin\rwdiag.bat -findall

Enlightened Software, www.ensoftbd.com, 017-9072-1177

Oracle Made Easy Lecture Sheet 86 of 86

You might also like