Oracle Database Notes For Professionals
Oracle Database Notes For Professionals
Database
Notes for Professionals
Contents
About................................................................................................................................................................. 1
Chapter 1: Getting started with Oracle Database..................................................................................2
Section 1.1: Hello World................................................................................................................................................................ 2
Section 1.2: SQL Query................................................................................................................................................................ 2
Section 1.3: Hello world! from table.......................................................................................................................................... 2
Section 1.4: Hello World from PL/SQL...................................................................................................................................... 3
Chapter 2: Getting started with PL/SQL.................................................................................................. 4
Section 2.1: Hello World............................................................................................................................................................... 4
Section 2.2: Definition of PL/SQL.............................................................................................................................................. 4
Section 2.3: Difference between %TYPE and %ROWTYPE.................................................................................................. 5
Section 2.4: Create or replace a view...................................................................................................................................... 6
Section 2.5: Create a table......................................................................................................................................................... 6
Section 2.6: About PL/SQL..........................................................................................................................................................6
Chapter 3: Anonymous PL/SQL Block...................................................................................................... 8
Section 3.1: An example of an anonymous block.................................................................................................................. 8
Chapter 4: PL/SQL procedure................................................................................................................... 9
Section 4.1: Syntax.........................................................................................................................................................................9
Section 4.2: Hello World..............................................................................................................................................................9
Section 4.3: In/Out Parameters................................................................................................................................................. 9
Chapter 5: Data Dictionary....................................................................................................................... 11
Section 5.1: Describes all objects in the database............................................................................................................... 11
Section 5.2: To see all the data dictionary views to which you have access................................................................. 11
Section 5.3: Text source of the stored objects..................................................................................................................... 11
Section 5.4: Get list of all tables in Oracle............................................................................................................................. 11
Section 5.5: Privilege information............................................................................................................................................11
Section 5.6: Oracle version...................................................................................................................................................... 12
Chapter 6: Dates........................................................................................................................................... 13
Section 6.1: Date Arithmetic - Difference between Dates in Days, Hours, Minutes and/or Seconds........................ 13
Section 6.2: Setting the Default Date Format Model.......................................................................................................... 14
Section 6.3: Date Arithmetic - Difference between Dates in Months or Years.............................................................. 14
Section 6.4: Extract the Year, Month, Day, Hour, Minute or Second Components of a Date..................................... 15
Section 6.5: Generating Dates with No Time Component.................................................................................................. 16
Section 6.6: Generating Dates with a Time Component..................................................................................................... 16
Section 6.7: The Format of a Date......................................................................................................................................... 17
Section 6.8: Converting Dates to a String............................................................................................................................ 17
Section 6.9: Changing How SQL/Plus or SQL Developer Display Dates........................................................................ 18
Section 6.10: Time Zones and Daylight Savings Time........................................................................................................18
Section 6.11: Leap Seconds........................................................................................................................................................19
Section 6.12: Getting the Day of the Week........................................................................................................................... 19
Chapter 7: Working with Dates................................................................................................................. 20
Section 7.1: Date Arithmetic...................................................................................................................................................... 20
Section 7.2: Add_months function......................................................................................................................................... 20
Chapter 8: DUAL table.................................................................................................................................22
Section 8.1: The following example returns the current operating system date and time......................................... 22
Section 8.2: The following example generates numbers between start_value and end_value................................22
Chapter 9: JOINS.......................................................................................................................................... 23
Section 9.1: CROSS JOIN...........................................................................................................................................................23
Section 9.2: LEFT OUTER JOIN............................................................................................................................................... 24
Section 9.3: RIGHT OUTER JOIN............................................................................................................................................. 25
Section 9.4: FULL OUTER JOIN............................................................................................................................................... 27
Section 9.5: ANTIJOIN............................................................................................................................................................... 28
Section 9.6: INNER JOIN........................................................................................................................................................... 29
Section 9.7: JOIN........................................................................................................................................................................ 30
Section 9.8: SEMIJOIN.............................................................................................................................................................. 30
Section 9.9: NATURAL JOIN.................................................................................................................................................... 31
Chapter 10: Handling NULL values........................................................................................................... 33
Section 10.1: Operations containing NULL are NULL, except concatenation.................................................................. 33
Section 10.2: NVL2 to get a different result if a value is null or not................................................................................ 33
Section 10.3: COALESCE to return the first non-NULL value............................................................................................. 33
Section 10.4: Columns of any data type can contain NULLs............................................................................................ 33
Section 10.5: Empty strings are NULL.................................................................................................................................... 33
Section 10.6: NVL to replace null value..................................................................................................................................34
Chapter 11: String Manipulation................................................................................................................. 35
Section 11.1: INITCAP.................................................................................................................................................................... 35
Section 11.2: Regular expression.............................................................................................................................................. 35
Section 11.3: SUBSTR.................................................................................................................................................................... 35
Section 11.4: Concatenation: Operator || or concat() function...........................................................................................36
Section 11.5: UPPER..................................................................................................................................................................... 36
Section 11.6: LOWER.................................................................................................................................................................... 37
Section 11.7: LTRIM / RTRIM.....................................................................................................................................................37
Chapter 12: IF-THEN-ELSE Statement....................................................................................................... 38
Section 12.1: IF-THEN.................................................................................................................................................................. 38
Section 12.2: IF-THEN-ELSE..................................................................................................................................................... 38
Section 12.3: IF-THEN-ELSIF-ELSE.......................................................................................................................................... 38
Chapter 13: Limiting the rows returned by a query (Pagination)................................................... 39
Section 13.1: Get first N rows with row limiting clause......................................................................................................... 39
Section 13.2: Get row N through M from many rows (before Oracle 12c).................................................................... 39
Section 13.3: Get N numbers of Records from table.......................................................................................................... 39
Section 13.4: Skipping some rows then taking some.......................................................................................................... 40
Section 13.5: Skipping some rows from result..................................................................................................................... 40
Section 13.6: Pagination in SQL............................................................................................................................................... 40
Chapter 14: Recursive Sub-Query Factoring using the WITH Clause (A.K.A. Common
Table Expressions)...................................................................................................................................... 42
Section 14.1: Splitting a Delimited String................................................................................................................................ 42
Section 14.2: A Simple Integer Generator.............................................................................................................................. 42
Chapter 15: Different ways to update records..................................................................................... 44
Section 15.1: Update using Merge........................................................................................................................................... 44
Section 15.2: Update Syntax with example........................................................................................................................... 44
Section 15.3: Update Using Inline View.................................................................................................................................. 44
Section 15.4: Merge with sample data................................................................................................................................... 45
Chapter 16: Update with Joins................................................................................................................... 47
Section 16.1: Examples: what works and what doesn't....................................................................................................... 47
Chapter 17: Functions................................................................................................................................... 49
Section 17.1: Calling Functions.................................................................................................................................................. 49
Chapter 18: Statistical functions................................................................................................................50
Section 18.1: Calculating the median of a set of values......................................................................................................50
Chapter 19: Window Functions................................................................................................................... 51
Section 19.1: Ratio_To_Report..................................................................................................................................................... 51
Chapter 20: Creating a Context............................................................................................................... 52
Section 20.1: Create a Context................................................................................................................................................ 52
Chapter 21: Splitting Delimited Strings.................................................................................................... 53
Section 21.1: Splitting Strings using a Hierarchical Query.................................................................................................. 53
Section 21.2: Splitting Strings using a PL/SQL Function..................................................................................................... 53
Section 21.3: Splitting Strings using a Recursive Sub-query Factoring Clause.............................................................. 54
Section 21.4: Splitting Strings using a Correlated Table Expression................................................................................ 55
Section 21.5: Splitting Strings using CROSS APPLY (Oracle 12c)..................................................................................... 56
Section 21.6: Splitting Strings using XMLTable and FLWOR expressions........................................................................57
Section 21.7: Splitting Delimited Strings using XMLTable................................................................................................... 57
Chapter 22: Collections and Records...................................................................................................... 59
Section 22.1: Use a collection as a return type for a split function.................................................................................. 59
Chapter 23: Object Types........................................................................................................................... 60
Section 23.1: Accessing stored objects.................................................................................................................................. 60
Section 23.2: BASE_TYPE..........................................................................................................................................................60
Section 23.3: MID_TYPE............................................................................................................................................................ 61
Section 23.4: LEAF_TYPE.......................................................................................................................................................... 62
Chapter 24: Loop.......................................................................................................................................... 64
Section 24.1: Simple Loop......................................................................................................................................................... 64
Section 24.2: WHILE Loop........................................................................................................................................................ 64
Section 24.3: FOR Loop............................................................................................................................................................ 64
Chapter 25: Cursors..................................................................................................................................... 67
Section 25.1: Parameterized "FOR loop" Cursor ................................................................................................................ 67
Section 25.2: Implicit "FOR loop" cursor................................................................................................................................67
Section 25.3: Handling a CURSOR.......................................................................................................................................... 67
Section 25.4: Working with SYS_REFCURSOR...................................................................................................................... 68
Chapter 26: Sequences................................................................................................................................ 69
Section 26.1: Creating a Sequence: Example........................................................................................................................ 69
Chapter 27: Indexes.....................................................................................................................................71
Section 27.1: b-tree index......................................................................................................................................................... 71
Section 27.2: Bitmap Index...................................................................................................................................................... 71
Section 27.3: Function Based Index....................................................................................................................................... 71
Chapter 28: Hints.......................................................................................................................................... 72
Section 28.1: USE_NL.................................................................................................................................................................. 72
Section 28.2: APPEND HINT.................................................................................................................................................... 72
Section 28.3: Parallel Hint........................................................................................................................................................ 72
Section 28.4: USE_HASH...........................................................................................................................................................73
Section 28.5: FULL..................................................................................................................................................................... 73
Section 28.6: Result Cache....................................................................................................................................................... 74
Chapter 29: Packages.................................................................................................................................. 75
Section 29.1: Define a Package header and body with a function.................................................................................. 75
Section 29.2: Overloading......................................................................................................................................................... 75
Section 29.3: Package Usage.................................................................................................................................................. 76
Chapter 30: Exception Handling............................................................................................................... 78
Section 30.1: Syntax.................................................................................................................................................................... 78
Please feel free to share this PDF with anyone for free,
latest version of this book can be downloaded from:
https://goalkicker.com/OracleDatabaseBook
This Oracle® Database Notes for Professionals book is compiled from Stack
Overflow Documentation, the content is written by the beautiful people at Stack
Overflow. Text content is released under Creative Commons BY-SA, see credits at
the end of this book whom contributed to the various chapters. Images may be
copyright of their respective owners unless otherwise specified
This is an unofficial free book created for educational purposes and is not
affiliated with official Oracle® Database group(s) or company(s) nor Stack
Overflow. All trademarks and registered trademarks are the property of their
respective company owners
1
Chapter 1: Getting started with Oracle
Database
Version Release Date
Version 1 (unreleased) 1978-01-01
Oracle V2 1979-01-01
Oracle Version 3 1983-01-01
Oracle Version 4 1984-01-01
Oracle Version 5 1985-01-01
Oracle Version 6 1988-01-01
Oracle7 1992-01-01
Oracle8 1997-07-01
Oracle8i 1999-02-01
Oracle9i 2001-06-01
Oracle 10g 2003-01-01
Oracle 11g 2007-01-01
Oracle 12c 2013-01-01
In Oracle's flavor of SQL, "dual is just a convienence table". It was originally intended to double rows via a JOIN, but
now contains one row with a DUMMY value of 'X'.
Show the number of employees in each department with at least 5 employees. List the largest departments first.
SELECT department_id,
COUNT(*) FROM employees
GROUP BY
department_id HAVING
Insert values (you can omit target columns if you provide values for all columns)
INSERT INTO my_table (what, who, mark) VALUES ('Hello',
'world', '!' ); INSERT INTO my_table VALUES ('Bye bye', 'ponies',
'?' );
SET serveroutput
ON BEGIN
DBMS_OUTPUT.PUT_LINE ('Hello World!');
END;
3
Chapter 2: Getting started with PL/SQL
Section 2.1: Hello World
SET serveroutput ON
DECLARE
message CONSTANT VARCHAR2(32767):= 'Hello,
World!'; BEGIN
DBMS_OUTPUT.put_line(message
Command SET serveroutput ON is required in SQL*Plus and SQL Developer clients to enable the output of
The END; line signals the end of the anonymous PL/SQL block. To run the code from SQL command line, you may
need to type / at the beginning of the first blank line after the last line of the code. When the above code is
executed at SQL prompt, it produces the following result:
Hello, World!
The basic unit in PL/SQL is called a block, which is made up of three parts: a declarative part, an executable part,
and an exception-building part.
DECLARE
<declarations section>
BEGIN
<executable command(s)>
EXCEPTION
Declarations - This section starts with the keyword DECLARE. It is an optional section and defines all variables,
cursors, subprograms, and other elements to be used in the program.
Executable Commands - This section is enclosed between the keywords BEGIN and END and it is a mandatory
section. It consists of the executable PL/SQL statements of the program. It should have at least one executable line
of code, which may be just a NULL command to indicate that nothing should be executed.
Exception Handling - This section starts with the keyword EXCEPTION. This section is again optional and contains
exception(s) that handle errors in the program.
Every PL/SQL statement ends with a semicolon (;). PL/SQL blocks can be nested within other PL/SQL blocks using
BEGIN and END.
4
In anonymous block, only executable part of block is required, other parts are not nessesary. Below is example of
simple anonymous code, which does not do anything but perform without error reporting.
BEGIN
NUL
L; END;
Missing excecutable instruction leads to an error, becouse PL/SQL does not support empty blocks. For example,
excecution of code below leads to an error:
BEGIN
END;
/
Application will raise error:
END;
*
ERROR AT line 2:
ORA-06550: line 2, column 1:
PLS-00103: Encountered the symbol "END" WHEN expecting one OF
the following: ( BEGIN CASE DECLARE EXIT FOR GOTO IF LOOP MOD NULL
PRAGMA
DECLAR
E vEmployeeName
BEGI Employee.Name%TYP
N E;
SELECT Name
INTO
vEmployeeNam
e FROM Employee
WHERE ROWNUM =
EN
D;
/
%ROWTYPE: Used to declare a record with the same types as found in the specified table, view or cursor (= multiple
DBMS_OUTPUT.PUT_LINE(vEmployeeName
columns). );
DECLAR
E rEmploye Employee%ROWTYP
BEGI e E;
N
rEmployee.Name :=
'Matt';
rEmployee.Age := 31;
DBMS_OUTPUT.PUT_LINE(rEmployee.Na 5
me);
DBMS_OUTPUT.PUT_LINE(rEmployee.A
EN ge);
D;
/
Example 1:
View with a select on one table.
C.Name,
L.Subject,
L.Teacher
FROM ClassRoom
CREATE TABLE
Employee (
Id NUMBER NOT
Name NULL,
Contra
CONSTRAINT p_Id PRIMARY KEY(Id),
CONSTRAINT c_Contract CHECK (Contract
) ---
IN('Y','N')) CHAR DEFAULT 'N' NOT
; NULL,
6
1. To build stored procedures. .
2. To create database triggers.
3. To implement client-side logic in your Oracle Forms application.
4. To link a World Wide Web home page to an Oracle database.
7
Chapter 3: Anonymous PL/SQL Block
Section 3.1: An example of an anonymous block
DECLARE
-- declare a variable
message
VARCHAR2(20); BEGIN
8
Chapter 4: PL/SQL procedure
PL/SQL procedure is a group of SQL statements stored on the server for reuse. It increases the performance
because the SQL statements do not have to be recompiled every time it is executed.
Stored procedures are useful when same code is required by multiple applications. Having stored procedures
eliminates redundancy, and introduces simplicity to the code. When data transfer is required between the client
and server, procedures can reduce communication cost in certain situations.
[, ...])]
{IS | AS}
<
declarations >
BEGIN
World!'); END;
You need to execute this at the SQL prompt to create the procedure in the database, or you can run the query
below to get the same result:
IN specifies that the parameter is read only and the value cannot be changed by the procedure.
9
OUT specifies the parameter is write only and a procedure can assign a value to it, but not reference the value.
The variables passed in the above example need to be typed as they are defined in the procedure parameter
section.
10
Chapter 5: Data Dictionary
Section 5.1: Describes all objects in the database
SELECT *
FROM dba_objects
Section 5.2: To see all the data dictionary views to which you
have access
SELECT * FROM dict
ALL_SOURCE describes the text source of the stored objects accessible to the current user.
DBA_SOURCE describes the text source of all stored objects in the database.
ALL_TAB_COLUMNS describes the columns of the tables, views, and clusters accessible to the current user. COLS is a
SELECT *
FROM all_tab_columns
WHERE table_name
SELECT *
FROM dba_role_privs
WHERE
Privileges granted to user:
1. system privileges
SELECT * 11
FROM dba_sys_privs
WHERE grantee = :username
2. object grants
SELECT *
FROM dba_tab_privs
WHERE grantee = :username
Permissions granted to roles.
SELECT *
FROM role_role_privs
WHERE role IN (SELECT granted_role FROM dba_role_privs WHERE grantee= :username)
1. system privileges
SELECT *
FROM role_sys_privs
WHERE role IN (SELECT granted_role FROM dba_role_privs WHERE grantee= :username)
2. object grants
SELECT *
FROM role_tab_privs
WHERE role IN (SELECT granted_role FROM dba_role_privs WHERE grantee= :username)
12
Chapter 6: Dates
Section 6.1: Date Arithmetic - Difference between Dates in
Days, Hours, Minutes and/or Seconds
In oracle, the difference (in days and/or fractions thereof) between two DATEs can be found using subtraction:
DIFFERENCE
89
And:
DIFFERENCE
1.0425
The difference in hours, minutes or seconds can be found by multiplying this number by 24, 24*60 or 24*60*60
respectively.
The previous example can be changed to get the days, hours, minutes and seconds between two dates using:
);
FROM
(Note: TRUNC()
DUAL is used rather than FLOOR() to correctly handle negative differences.)
Outputs:
1 1 1 12
13
The previous example can also be solved by converting the numeric difference to an interval using
NUMTODSINTERVAL():
difference ) AS minutes,
EXTRACT( SECOND FROM difference ) AS
seconds
FROM (
SELECT NUMTODSINTERVAL(
TO_DATE( '2016-01-02 01:01:12', 'YYYY-MM-DD HH24:MI:SS' )
explicitly called without a format model) the NLS_DATE_FORMAT session parameter will be used as the format
model in the conversion. If the literal does not match the format model then an exception will be raised.
You can set this value within your current session using:
(Note: this does not change the value for any other users.)
If you rely on the NLS_DATE_FORMAT to provide the format mask in TO_DATE() or TO_CHAR() then you should not be
surprised when your queries break if this value is ever changed.
Outputs:
DIFFERENCE
12
If the difference includes part months then it will return the fraction of the month based on there being 31 days in
each month:
14
Outputs:
15
DIFFERENCE
1.4516129
Due to MONTHS_BETWEEN assuming 31 days per month when there can be fewer days per month then this can
result in different values for differences spanning the boundaries between months.
Example:
Output:
The difference in years can be found by dividing the month difference by 12.
] FROM datevalue )
Outputs:
2016 7 25
Using CAST( datevalue AS TIMESTAMP ) to convert the DATE to a TIMESTAMP and then using
For example:
16
SELECT EXTRACT( HOUR FROM CAST( datetime AS TIMESTAMP ) )
AS Hours, EXTRACT( MINUTE FROM CAST( datetime AS
17
)
;
Outputs:
9 42 1
(More information on the date format models can be found in the Oracle documentation.)
or:
SELECT TO_DATE(
'January 1, 2000, 00:00
(If you are converting language specific terms such as month names then it is good practice to include the 3rd nlsparam
parameter to the TO_DATE() function and specify the language to be expected.)
CREATE TABLE
date_table( date_value
DATE
);
Oracle will implicitly cast a TIMESTAMP to a DATE when storing it in a DATE column of a table; however you can
A DATE which is not stored in a table (i.e. generated by SYSDATE and having "type 13" when using the
DUMP() command) has 8-bytes and has the structure (the numbers on the right are the internal
A DATE which is stored in a table ("type 12" when using the DUMP() command) has 7-bytes and has the structure (the
If you want the date to have a specific format then you will need to convert it to something that has a format (i.e. a
string). The SQL client may implicitly do this or you can explicitly convert the value to a string using TO_CHAR( DATE,
format_model, nls_params ).
(Note: if a format model is not provided then the NLS_DATE_FORMAT session parameter will be used as the default
format model; this can be different for every session so should not be relied on. It is good practice to always specify the
format model.)
);
20
SELECT TO_CHAR( date_value, 'YYYY-MM-DD' ) AS formatted_date FROM table_name;
Outputs:
FORMATTED_DATE
2000-01-01
2016-07-21
2016-07-21
And:
SELECT TO_CHAR(
date_value,
'FMMonth d yyyy, hh12:mi:ss
AM', 'NLS_DATE_LANGUAGE =
French'
Outputs:
FORMATTED_DATE
You can change how a date is displayed by changing the NLS_DATE_FORMAT parameter.
Either:
A DATE can be stored as Coordinated Universal Time (UTC) and converted to the current session time zone like this:
SELECT FROM_TZ(
CAST(
TO_DATE( '2016-01-01 12:00:00', 'YYYY-MM-DD
HH24:MI:SS' ) AS TIMESTAMP
),
21
'UTC'
FROM DUAL;
If you run ALTER SESSION SET TIME_ZONE = '+01:00'; then the output is:
TIME
and ALTER SESSION SET TIME_ZONE = 'PST'; then the output is:
TIME
parameter:
Outputs 5
ALTER SESSION SET NLS_TERRITORY = 'UNITED KINGDOM'; -- First day of week is Monday
SELECT TO_CHAR( DATE '1970-01-01', 'D' ) FROM DUAL;
Outputs 4
To do this independent of the NLS settings, you can truncate the date to midnight of the current day (to remove any
fractions of days) and subtract the date truncated to the start of the current iso-week (which always starts on
Monday):
22
Chapter 7: Working with Dates
Section 7.1: Date Arithmetic
Oracle supports DATE (includes time to the nearest second) and TIMESTAMP (includes time to fractions of a second)
datatypes, which allow arithmetic (addition and subtraction) natively. For example:
Oracle also provides the built-in datatype INTERVAL which represents a duration of time (e.g. 1.5 days, 36 hours, 2
months, etc.). These can also be used with arithmetic with DATE and TIMESTAMP expressions. For example:
SELECT * FROM logfile WHERE last_updated >= SYSDATE - INTERVAL '1' HOUR;
24
2015-03-12
M
2014-11-12
When the calculated month has fewer days as the given date, the last day of the calculated month will be returned.
25
Chapter 8: DUAL table
Section 8.1: The following example returns the current
operating system date and time
SELECT SYSDATE FROM dual
1 n FROM dual
CONNECT BY LEVEL <= :end_value - :start_value + 1
26
Chapter 9: JOINS
Section 9.1: CROSS JOIN
A CROSS JOIN performs a join between two tables that does not use an explicit join clause and results in the
Cartesian product of two tables. A Cartesian product means each row of one table is combined with each row of the
second table in the join. For example, if TABLEA has 20 rows and TABLEB has 20 rows, the result would be
Example:
SELECT *
FROM TABLEA CROSS JOIN TABLEB;
SELECT *
FROM TABLEA, TABLEB;
+-------+---------------- +
| VALUE | NAME |
+-------+---------------- +
| 1 | ONE |
| 2 | TWO |
+-------+---------------- +
+-------+-------------- +
| VALUE | NAME |
+-------+-------------- +
| 3 | THREE |
| 4 | FOUR |
+-------+-------------- +
SELECT *
FROM TABLEA CROSS JOIN TABLEB;
Output:
+-------+--------+-------+-------------- +
| VALUE | NAME | VALUE | NAME |
+-------+--------+-------+-------------- +
| 1 | ONE | 3 | THREE |
| 1 | ONE | 4 | FOUR |
| 2 | TWO | 3 | THREE |
| 2 | TWO | 4 | FOUR |
27
+-------+--------+-------+-------------- +
Example:
SELECT
ENAME,
DNAME,
EMP.DEPTNO
,
DEPT.DEPTN
Even though ANSI syntax is the recommended way, it is likely to encounter legacy syntax very often. Using (+)
within a condition determines which side of the equation to be considered as outer.
SELECT
ENAME,
DNAME,
EMP.DEPTNO
,
DEPT.DEPTN
FROM
Here's an example of Left Outer Join between two tables:
+-----------+---------------- +
| NAME | DEPTNO |
+-----------+---------------- +
| A | 2 |
| B | 1 |
| C | 3 |
| D | 2 |
| E | 1 |
| F | 1 |
| G | 4 |
| H | 4 |
28
+-----------+---------------- +
+---------+------------------------- +
| DEPTNO | DEPTNAME |
+---------+------------------------- +
| 1 | ACCOUNTING |
| 2 | FINANCE |
| 5 | MARKETING |
| 6 | HR |
+---------+------------------------- +
SELECT
*
FROM
EMPLOYEE LEFT OUTER JOIN DEPT
Output:
+-----------+---------+---------+------------------------- +
| NAME | DEPTNO | DEPTNO | DEPTNAME |
+-----------+---------+---------+------------------------- +
| F | 1 | 1 | ACCOUNTING |
| E | 1 | 1 | ACCOUNTING |
| B | 1 | 1 | ACCOUNTING |
| D | 2 | 2 | FINANCE |
| A | 2 | 2 | FINANCE |
| C | 3 | | |
| H | 4 | | |
| G | 4 | | |
+-----------+---------+---------+------------------------- +
Example:
SELECT
ENAME,
DNAME,
EMP.DEPTNO
,
DEPT.DEPTN
As the unmatched rows of SCOTT.DEPT are included, but unmatched rows of SCOTT.EMP are not, the above is
29
SELECT
ENAME,
DNAME,
EMP.DEPTNO
DEPT.DEPTN
+-----------+---------------- +
| NAME | DEPTNO |
+-----------+---------------- +
| A | 2 |
| B | 1 |
| C | 3 |
| D | 2 |
| E | 1 |
| F | 1 |
| G | 4 |
| H | 4 |
+-----------+---------------- +
+---------+------------------------- +
| DEPTNO | DEPTNAME |
+---------+------------------------- +
| 1 | ACCOUNTING |
| 2 | FINANCE |
| 5 | MARKETING |
| 6 | HR |
+---------+------------------------- +
SELECT
*
FROM
EMPLOYEE RIGHT OUTER JOIN DEPT
Output:
+-----------+---------+---------+------------------------- +
| NAME | DEPTNO | DEPTNO | DEPTNAME |
+-----------+---------+---------+------------------------- +
| A | 2 | 2 | FINANCE |
| B | 1 | 1 | ACCOUNTING |
| D | 2 | 2 | FINANCE |
| E | 1 | 1 | ACCOUNTING |
| F | 1 | 1 | ACCOUNTING |
| | | 5 | MARKETING |
| | | 6 | HR |
30
+-----------+---------+---------+------------------------- +
SELECT *
FROM EMPLOYEE, DEPT
WHERE EMPLOYEE.DEPTNO(+) = DEPT.DEPTNO;
Example:
SELECT
*
FROM
EMPLOYEE FULL OUTER JOIN DEPT
+-----------+---------------- +
| NAME | DEPTNO |
+-----------+---------------- +
| A | 2 |
| B | 1 |
| C | 3 |
| D | 2 |
| E | 1 |
| F | 1 |
| G | 4 |
| H | 4 |
+-----------+---------------- +
+---------+------------------------- +
| DEPTNO | DEPTNAME |
+---------+------------------------- +
| 1 | ACCOUNTING |
| 2 | FINANCE |
| 5 | MARKETING |
| 6 | HR |
+---------+------------------------- +
SELECT
*
FROM
EMPLOYEE FULL OUTER JOIN DEPT
31
ON EMPLOYEE.DEPTNO = DEPT.DEPTNO;
Output
+-----------+---------+---------+------------------------- +
| NAME | DEPTNO | DEPTNO | DEPTNAME |
+-----------+---------+---------+------------------------- +
| A | 2 | 2 | FINANCE |
| B | 1 | 1 | ACCOUNTING |
| C | 3 | | |
| D | 2 | 2 | FINANCE |
| E | 1 | 1 | ACCOUNTING |
| F | 1 | 1 | ACCOUNTING |
| G | 4 | | |
| H | 4 | | |
| | | 6 | HR |
| | | 5 | MARKETING |
+-----------+---------+---------+------------------------- +
Here the columns that do not match has been kept NULL.
+-----------+---------------- +
| NAME | DEPTNO |
+-----------+---------------- +
| A | 2 |
| B | 1 |
| C | 3 |
| D | 2 |
| E | 1 |
| F | 1 |
| G | 4 |
| H | 4 |
+-----------+---------------- +
+---------+------------------------- +
| DEPTNO | DEPTNAME |
+---------+------------------------- +
| 1 | ACCOUNTING |
| 2 | FINANCE |
32
| 5 | MARKETING |
| 6 | HR |
+---------+------------------------- +
SELECT
*
FROM
EMPLOYEE WHERE DEPTNO
Output:
+-----------+---------------- +
| NAME | DEPTNO |
+-----------+---------------- +
| C | 3 |
| H | 4 |
| G | 4 |
+-----------+---------------- +
The output shows that only the rows of EMPLOYEE table, of which DEPTNO were not present in DEPT table.
Syntax
You can specify the join clause by specifying ON with a boolean expression.
The scope of expressions in the ON clause includes the current tables and any tables in outer query blocks to the
current SELECT. In the following example, the ON clause refers to the current tables:
SAMP.EMPLOYEE ON EMP_ACT.EMPNO
= EMPLOYEE.EMPNO
-- Join the EMPLOYEE and DEPARTMENT tables,
-- select the employee number (EMPNO),
-- employee surname (LASTNAME),
-- department number (WORKDEPT in the EMPLOYEE table and DEPTNO in the
-- DEPARTMENT table)
-- and department name (DEPTNAME)
-- of all employees who were born (BIRTHDATE) earlier than 1930.
33
-- using a query which selects from a VALUES clause
(which is an
-- alternate form of a fullselect).
-- This query shows how a table can be derived called "X"
-- having 2 columns "R1" and "R2" and 1 row of data
SELECT *
FROM (VALUES (3, 4), (1, 5),
(2, 6)) AS VALUESTABLE1(C1,
C2)
-- |4 |3 |2
3 |5 |1 |2
EMPLOYEE
ON MGRNO = EMPNO
Oracle 9i forward, the JOIN is equivalent in function to the INNER JOIN. This operation requires an explicit join
Example:
SELECT t1.*,
t2.DeptId
FROM table_1
Oracle documentation:
10g
11g
12g
SELECT * FROM
departments WHERE
34
(SELECT 1 FROM employees
WHERE departments.department_id =
This is more efficient than the full join alternatives, as inner joining on employees then giving a where clause
detailing that the salary has to be greater than 2500 could return the same department numerous times. Say if the
Fire department has n employees all with salary 3000, SELECT * FROM departments, employees with the
necessary join on ids and our where clause would return the Fire department n times.
The join will be done on the fields ID and DESCR, common to both the tables:
SQL> SELECT *
2 FROM tab1
3 NATURAL
JOIN
4 tab2;
ID DESCR
3 three
Columns with different names will not be used in the JOIN condition:
SQL> SELECT *
2 FROM (SELECT id AS id, descr AS descr1 FROM
tab1)
3 NATURAL JOIN
4 (SELECT id AS id, descr AS descr2 FROM
ID DESCR1 DESCR2
tab2);
1 one ONE
3 three three
If the joined tables have no common columns, a JOIN with no conditions will be done:
SQL> SELECT *
2 FROM (SELECT id AS id1, descr AS descr1
FROM tab1)
3 NATURAL JOIN
4 (SELECT id AS id2, descr AS descr2 FROM
ID1 DESCR1 ID2 DESCR2
tab2);
35
1 one 1 ONE
2 two 1 ONE
3 three 1 ONE
1 one 3 three
2 two 3 three
3 three 3 three
36
Chapter 10: Handling NULL values
A column is NULL when it has no value, regardless of the data type of that column. A column should never be
compared to NULL using this syntax a = NULL as the result would be UNKNOWN. Instead use a IS NULL or a
IS NOT NULL conditions. NULL is not equal to NULL. To compare two expressions where null can happen, use
one of the functions described below. All operators except concatenation return NULL if one of their operand is
NULL. For instance the result of 3 * NULL + 5 is null.
In some case, using COALESCE with two parameters can be faster than using NVL when the second parameter is
not a constant. NVL will always evaluate both parameters. COALESCE will stop at the first non-NULL value it
encounters. It means that if the first value is non-NULL, COALESCE will be faster.
37
Section 10.6: NVL to replace null value
SELECT a column_with_null, NVL(a, 'N/A') column_without_null
SELECT
CASE WHEN a = b THEN 1 WHEN a <> b THEN 0 ELSE -1 END comparison_without_nvl,
CASE WHEN NVL(a, -1) = NVL(b, -1) THEN 1 WHEN NVL(a, -1) <> NVL(b, -1) THEN 0
ELSE -1 END
comparison_with_nvl
FROM
COMPARISON_WITHOUT_NVL COMPARISON_WITH_NVL
-1 0
-1 1
38
Chapter 11: String Manipulation
Section 11.1: INITCAP
The INITCAP function converts the case of a string so that each word starts with a capital letter and all subsequent
letters are in lowercase.
Output
NEW
Hello Mr Macdonald!
Results in:
If I want to swap parts of the text, I use \1, \2, \3 to call for the matched strings:
returns:
bcd
To count from the end of the string, SUBSTR accepts a negative number as the second parameter, e.g.
returns:
de
39
To get the last character in a string: SUBSTR(mystring,-1,1)
40
Section 11.4: Concatenation: Operator || or concat() function
The Oracle SQL and PL/SQL || operator allows you to concatenate 2 or more strings together.
Example:
id firstname lastname
1 Thomas Woody
Query:
Output:
My Sentence
Example:
Query:
Output:
Expr1
Thomas is in my database.
Output:
RESULT
MY TEXT 123!
41
Section 11.6: LOWER
LOWER converts all uppercase letters in a string to lowercase.
Outputs:
text
hello world123!
For example,
SELECT LTRIM('<===>HELLO<===>',
'=<>')
,RTRIM('<===>HELLO<===>', '=<>')
Returns:
HELLO<===>
<===>HELLO
42
Chapter 12: IF-THEN-ELSE Statement
Section 12.1: IF-THEN
DECLARE
v_num1
NUMBER(10);
v_num2
NUMBER(10);
BEGIN
v_num1 := 2;
v_num2 := 1;
NUMBER(10);
v_num2
NUMBER(10);
BEGIN
v_num1 := 2;
v_num2 := 10;
NUMBER(10);
v_num2
NUMBER(10);
BEGIN
v_num1 := 2;
v_num2 := 2;
43
Chapter 13: Limiting the rows returned by
a query (Pagination)
Section 13.1: Get first N rows with row limiting clause
The FETCH clause was introduced in Oracle 12c R1:
SELECT val
FROM mytable
ORDER BY val
SELECT * FROM
(
SELECT val
FROM mytable
WITH t AS
( SELECT
col1
, col2
, ROW_NUMBER() over (ORDER BY col1,
)
SELECT col1
Oracle 12c handles this more easily with OFFSET and FETCH.
SELECT *
FROM (
SELECT *
FROM (
SELECT *
FROM (
SELECT val FROM mytable ORDER BY val
) WHERE rownum<=5
Section 13.4: Skipping some rows then taking some
In Oracle 12g+
In earlier Versions
SELECT Id,
Col1
FROM (SELECT Id,
Col1,
ROW_NUMBER() over (ORDER BY Id)
TableName
In earlier Versions
SELECT Id,
Col1
FROM (SELECT Id,
Col1,
ROW_NUMBER() over (ORDER BY Id)
rownum_order_tes
45
this way we can paginate the table data , just like web serch page
46
Chapter 14: Recursive Sub-Query
Factoring using the WITH Clause (A.K.A.
Common Table Expressions)
Section 14.1: Splitting a Delimited String
Sample Data:
e UNION ALL
SELECT VALUE,
REGEXP_SUBSTR( VALUE, '[^,]+', 1, lvl + 1 ),
lvl + 1
Output:
A,B,C,D,E A 1
A,B,C,D,E B 2
A,B,C,D,E C 3
A,B,C,D,E D 4
A,B,C,D,E E 5
DUAL
UNION ALL
SELECT VALUE + 1
FROM generator
Output:
47
VALUE
1
2
3
4
5
6
7
8
9
10
48
Chapter 15: Different ways to update
records
Section 15.1: Update using Merge
Using Merge
MERGE INTO
TESTTABLE
USING
(SELECT
T1.ROWID AS
RID,
T2.TESTTABLE_I
FROM
TESTTABLE
T1 INNER JOIN
MASTERTABLE T2
ON TESTTABLE.TESTTABLE_ID =
Section 15.2: Update Syntax with example
Normal Update
UPDATE
TESTTABLE
SET
TEST_COLUMN= 'Testvalue',TEST_COLUMN2= 123
WHERE
EXISTS
(SELECT
Note: If you face a non key preserved row error add an index to resolve the same to make it update-able
UPDATE
(SELECT
TESTTABLE.TEST_COLUMN AS OLD,
'Testvalue' AS NEW
FROM
TESTTABLE
INNER JOIN
MASTERTABLE
ON TESTTABLE.TESTTABLE_ID =
49
T.OL =
D T.NEW;
TABLE table02;
--
50
MERGE INTO table02 a USING (
SELECT b.code, b.old FROM table01 b
) c ON (
a.code = c.code
)
WHEN matched THEN UPDATE SET a.old = c.old
;
--
EXIST
S (
SELECT * FROM table01 a WHERE a.code IN (SELECT b.codetable01 FROM table02 b);
--
51
SELECT * FROM
table01 a WHERE
NOT
EXISTS (
SELECT 'x' FROM table02 b WHERE a.code = b.codetable01
);
52
Chapter 16: Update with Joins
Contrary to widespread misunderstanding (including on SO), Oracle allows updates through joins. However, there
are some (pretty logical) requirements. We illustrate what doesn't work and what does through a simple example.
Another way to achieve the same is the MERGE statement.
dual
;
FROM dual
;
SQL Error: ORA-01779: cannot modify a column which maps to a non key-preserved table
01779. 00000 - "cannot modify a column which maps to a non key-preserved table"
*Cause: An attempt was made to insert or update columns of a join view which
map to a non-key-preserved table.
*Action: Modify the underlying base tables directly.
Imagine what would happen if we had the value 1 in the column src.id more than once, with different values for
;
src.val. Obviously, the update would make no sense (in ANY database - that's a logical issue). Now, we know that
there are no duplicates in src.id, but the Oracle engine doesn't know that - so it's complaining. Perhaps this is why
so many practitioners believe Oracle "doesn't have UPDATE with joins"?
What Oracle expects is that src.id should be unique, and that it, Oracle, would know that beforehand. Easily fixed!
Note that the same works with composite keys (on more than one column), if the matching for the update needs to
use more than one column. In practice, src.id may be PK and tgt.id may be FK pointing to this PK, but that is
not relevant for updates with join; what is relevant is the unique constraint.
UPDATE
( SELECT t.val AS t_val, s.val AS s_val
FROM tgt t inner JOIN src s ON t.id = s.id
) 53
SET t_val = s_val
2 rows updated.
SELECT * FROM
tgt; ID VAL
-- ---
1 x
2 y
The same result could be achieved with a MERGE statement (which deserves its own Documentation article), and I
personally prefer MERGE in these cases, but the reason is not that "Oracle doesn't do updates with joins." As this
example shows, Oracle does do updates with joins.
54
Chapter 17: Functions
Section 17.1: Calling Functions
There are a few ways to use functions.
DECLARE
x NUMBER := functionName(); --functions can be called in declaration section
BEGIN
x :=
IF functionName() = 100
THEN NULL;
END IF;
Calling a function in a SELECT statement
55
Chapter 18: Statistical functions
Section 18.1: Calculating the median of a set of values
The MEDIAN function since Oracle 10g is an easy to use aggregation function:
SELECT
MEDIAN(SAL) FROM
The result of MEDIAN is computed by first ordering the rows. Using N as the number of rows in the
group, Oracle calculates the row number (RN) of interest with the formula RN = (1 + (0.5*(N-1)). The final
result of the aggregate function is computed by linear interpolation between the values from rows at row
numbers CRN = CEILING(RN) and FRN = FLOOR(RN).
Since Oracle 9i you can use PERCENTILE_CONT which works the same as MEDIAN function with percentile value
defaults to 0.5
56
Chapter 19: Window Functions
Section 19.1: Ratio_To_Report
Provides the ratio of the current rows value to all the values within the window.
--Data
CREATE TABLE Employees (Name VARCHAR2(30), Salary
57
Chapter 20: Creating a Context
Parameter Details
OR REPLACE Redefine an existing context namespace
namespace Name of the context - this is the namespace for calls to SYS_CONTEXT
schema Owner of the package
Database package that sets or resets the context attributes. Note: the database package
package
doesn't have to exist in order to create the context.
INITIALIZED Specify an entity other than Oracle Database that can set the context.
GLOBALLY Allow the LDAP directory to initialize the context when establishing the session.
Allow the context to be accessible throughout the entire instance - multiple sessions can
ACCESSED GLOBALLY
share the attribute values as long as they have the same Client ID.
This creates a context that can only be set by routines in the database package my_pkg, e.g.:
set_ctx; END
my_pkg;
IS BEGIN
my_pkg.set_ctx;
VALUE
58
Chapter 21: Splitting Delimited Strings
Section 21.1: Splitting Strings using a Hierarchical Query
Sample Data:
Query:
SELECT t.id,
REGEXP_SUBSTR( list, '([^,]*)(,|$)', 1, LEVEL, NULL, 1 )
id = PRIOR id
Output:
ID ITEM LVL
1 a 1
1 b 2
1 c 3
1 d 4
2 e 1
3 (NULL) 1
4 f 1
4 (NULL) 2
4 g 3
59
CREATE OR REPLACE FUNCTION
split_String( i_str IN
VARCHAR2,
60
p_result( p_result.COUNT ) := SUBSTR( i_str, p_start, p_end -
p_result.EXTEND;
END IF;
Sample Data:
Query:
SELECT t.id,
v.column_value AS VALUE,
ROW_NUMBER() OVER ( PARTITION BY id ORDER BY ROWNUM ) AS lvl
FROM table_name t,
Output:
ID ITEM LVL
1 a 1
1 b 2
1 c 3
1 d 4
2 e 1
3 (NULL) 1
4 f 1
4 (NULL) 2
4 g 3
61
SELEC 4 'f,,g' FROM DUA -- NULL item in the list
T , L;
Query:
62
SELECT id, list, 1, INSTR( list, ',' ), 1 FROM
1,
1 ), lvl + 1
FROM bounds
)
SELECT id,
SUBSTR(
list,
start_pos,
Output:
ID ITEM LVL
1 a 1
1 b 2
1 c 3
1 d 4
2 e 1
3 (NULL) 1
4 f 1
4 (NULL) 2
4 g 3
Query:
63
SELECT t.id,
v.COLUMN_VALUE AS VALUE,
ROW_NUMBER() OVER ( PARTITION BY id ORDER BY ROWNUM ) AS lvl
FROM table_name
t, TABLE(
CAST(
64
SELECT REGEXP_SUBSTR( t.list, '([^,]*)(,|$)', 1,
LEVEL, NULL, 1 ) FROM DUAL
ID ITEM LVL
1 a 1
1 b 2
1 c 3
1 d 4
2 e 1
3 (NULL) 1
4 f 1
4 (NULL) 2
4 g 3
Query:
SELECT t.id,
REGEXP_SUBSTR( t.list, '([^,]*)($|,)', 1, l.lvl, NULL,
1 ) AS item, l.lvl
FROM table_name t
CROSS
APPLY (
SELECT LEVEL AS
ID ITEM LVL
1 a 1
1 b 2
1 c 3
1 d 4
2 e 1
3 (NULL) 1
65
4 f 1
4 (NULL) 2
4 g 3
66
Section 21.6: Splitting Strings using XMLTable and FLWOR
expressions
This solution uses the ora:tokenize XQuery function that is available from Oracle 11.
Sample Data:
SELECT t.id,
x.ite
m,
x.lvl
FROM table_name t,
XMLTABLE(
'let $list := ora:tokenize(.,","),
$cnt := count($list)
return $val'
Output:
ID ITEM LVL
1 a 1
1 b 2
1 c 3
1 d 4
2 e 1
3 (NULL) (NULL)
4 f 1
4 (NULL) 2
4 g 3
SELECT t.id,
SUBSTR( x.item.getStringVal(), 2 ) AS
item, x.lvl
FROM table_name t
CROSS JOIN
XMLTABLE(
Output:
ID ITEM LVL
1 a 1
1 b 2
1 c 3
1 d 4
2 e 1
3 (NULL) 1
4 f 1
4 (NULL) 2
4 g 3
68
Chapter 22: Collections and Records
Section 22.1: Use a collection as a return type for a split
function
It's necessary to declare the type; here t_my_list; a collection is a TABLE OF something
Here's the function. Notice the () used as a kind of constructor, and the COUNT and EXTEND keywords that help
you create and grow your collection;
CREATE OR REPLACE
FUNCTION cto_table(p_sep IN VARCHAR2, p_list IN
AS
--- this function takes a string list, element being separated by p_sep
-- as separator
l_string VARCHAR2(4000) := p_list || p_sep;
l_sep_index PLS_INTEGER;
l_index PLS_INTEGER := 1;
l_tab t_my_list :=
t_my_list(); BEGIN
LOOP
l_sep_index := INSTR(l_string, p_sep,
l_index); EXIT
WHEN l_sep_index = 0;
l_tab.EXTEND;
Then you can see the content of the collection with the TABLE() function from SQL; it can be used as a list inside a
69
Chapter 23: Object Types
Section 23.1: Accessing stored objects
CREATE SEQUENCE test_seq START WITH 1001;
CREATE TABLE
test_tab (
test_id INTEGER,
test_obj base_type,
PRIMARY KEY
(test_id)
);
(test_id, test_obj)
VALUES (test_seq.NEXTVAL,
SELECT test_id
,test_obj
FROM
Returns object reference, pushing all to subtype
SELECT test_id
,TREAT(test_obj AS mid_type) AS
SELECT test_id
,TREAT(test_obj AS base_type).to_string() AS to_string -- Parenthesis are needed
after the function name, or Oracle will look for an attribute of this name.
base_id INTEGER,
base_attr
VARCHAR2(4
00),
70
i_base_attr VARCHAR2
) RETURN SELF AS RESULT,
MEMBER FUNCTION get_base_id RETURN INTEGER,
MEMBER FUNCTION get_base_attr RETURN
VARCHAR2, MEMBER PROCEDURE
set_base_id(i_base_id INTEGER),
Type body:
i_base_id INTEGER,
i_base_attr
VARCHAR2
) RETURN SELF AS
RESULT IS
BEGIN
self.base_id := i_base_id;
self.base_attr := i_base_attr;
RETURN;
END base_type;
IS BEGIN
RETURN self.base_id;
END get_base_id;
VARCHAR2 IS BEGIN
RETURN self.base_attr;
END get_base_attr;
self.base_id := i_base_id;
END set_base_id;
self.base_attr := i_base_attr;
END set_base_attr;
71
VARCHAR2 IS BEGIN
RETURN 'BASE_ID ['||self.base_id||']; BASE_ATTR
END;
mid_type (
72
i_base_attr
VARCHAR2,
i_mid_attr DATE
Type body:
INTEGE
R, i_base_attr
VARCHAR2,
i_mid_attr DATE
) RETURN SELF AS
RESULT IS
BEGIN
self.base_id := i_base_id;
self.base_attr :=
i_base_attr;
self.mid_attr :=
i_mid_attr; RETURN;
END mid_type;
DATE IS BEGIN
RETURN
self.mid_attr; END
mid_type (
leaf_attr
VARCHAR2(1000),
CONSTRUCTOR FUNCTION
leaf_type (
i_base_id
INTEGE
R, i_base_attr
VARCHAR2,
73
Type Body:
leaf_type (
i_base_id
INTEGE
R, i_base_attr
VARCHAR2,
i_mid_attr DATE,
i_leaf_attr
VARCHAR2
) RETURN SELF AS
RESULT IS
BEGIN
self.base_id := i_base_id;
self.base_attr :=
i_base_attr;
self.mid_attr :=
i_mid_attr;
self.leaf_attr :=
i_leaf_attr; RETURN;
END leaf_type;
74
Chapter 24: Loop
Section 24.1: Simple Loop
DECLARE
v_counter NUMBER(2);
BEGIN
v_counter :=
0; LOOP
v_counter := v_counter + 1;
DBMS_OUTPUT.put_line('Line number' ||
v_counter);
DECLARE
v_counter NUMBER(2); --declaration of counter variable
BEGIN
v_counter := 0; --point of start, first value of our iteration
The result:
75
The most important thing is, that our loop starts with '0' value, so first line of results is 'Current iteration of loop is
0'.
76
known at the beginning - lower and upper limits are directly set in code. In every step in this example, loop is
increment by 1.
Simple example:
DECLARE
v_counter NUMBER(2); --declaration of counter variable
BEGIN
v_counter := 0; --point of start, first value of our iteration, execute of variable
FOR v_counter IN 1..10 LOOP --The point, where lower and upper point of loop
statement is declared
- in this example, loop will be executed 10 times, start with value of 1
Loop FOR has additional property, which is working in reverse. Using additional word 'REVERSE' in declaration of
lower and upper limit of loop allow to do that. Every execution of loop decrement value of v_counter by 1.
Example:
DECLARE
v_counter NUMBER(2); --declaration of counter variable
BEGIN
v_counter := 0; --point of start
OF LOOP IS 8 CURRENT
78
CURRENT iteration OF LOOP
IS 5 CURRENT iteration OF
LOOP IS 4 CURRENT
iteration OF LOOP IS 3
79
Chapter 25: Cursors
Section 25.1: Parameterized "FOR loop" Cursor
DECLARE
CURSOR c_emp_to_be_raised(p_sal emp.sal%TYPE)
p_sal;
BEGIN
FOR cRowEmp IN c_emp_to_be_raised(1000) LOOP
DBMS_OUTPUT.Put_Line(cRowEmp .eName ||' ' ||cRowEmp.sal||'... should be
END;
First advantage is there is no tedious declaration to do (think of this horrible "CURSOR" thing you had in
previous versions)
second advantage is you first build your select query, then when you have what you want, you immediately
can access the fields of your query (x.<myfield>) in your PL/SQL loop
The loop opens the cursor and fetches one record at a time for every loop. At the end of the loop the cursor
is closed.
Implicit cursors are faster because the interpreter's work grows as the code gets longer. The less code the
less work the interpreter has to do.
--
DECLARE
CURSOR curCols IS -- select column name and type from a given table
SELECT column_name, data_type FROM all_tab_columns WHERE
table_name='MY_TABLE'; v_tab_column all_tab_columns.column_name%TYPE;
v_data_type
all_tab_columns.data_type%TYPE; v_
INTEGER := 1;
BEGIN
OPEN curCols;
LOOP
80
DBMS_OUTPUT.put_line(v_||':Column '||v_tab_column||' is of '|| v_data_type||'
Type.'); v_:= v_ + 1;
END LOOP;
curCols;
Section 25.4: Working with SYS_REFCURSOR
SYS_REFCURSOR can be used as a return type when you need to easily handle a list returned not from a table, but
SYS_REFCURSOR;
BEGIN
CASE required_type_in
WHEN 'CATS'
THEN
OPEN v_ FOR
SELECT nickname FROM (
SELECT 'minou' nickname FROM
dual
UNION ALL SELECT 'minon' FROM dual
);
WHEN
'DOGS'
THEN
and how to use it:
DECLARE
v_names SYS_REFCURSOR;
v_ VARCHAR2
(32767); BEGIN
v_names :=
list_of('CATS'); LOOP
END LOOP;
81
Chapter 26: Sequences
Parameter Details
schema schema name
increment by interval between the numbers
start with first number needed
maxvalue Maximum value for the sequence
nomaxvalue Maximum value is defaulted
minvalue minimum value for the sequence
nominvalue minimum value is defaulted
cycle Reset to the start after reaching this value
nocycle Default
cache Preallocation limit
nocache Default
order Guarantee the order of numbers
noorder default
Use the CREATE SEQUENCE statement to create a sequence, which is a database object from which multiple users
may generate unique integers. You can use sequences to automatically generate primary key values.
When a sequence number is generated, the sequence is incremented, independent of the transaction committing
or rolling back. If two users concurrently increment the same sequence, then the sequence numbers each user
acquires may have gaps, because sequence numbers are being generated by the other user. One user can never
acquire the sequence number generated by another user. After a sequence value is generated by one user, that
user can continue to access that value regardless of whether the sequence is incremented by another user.
Sequence numbers are generated independently of tables, so the same sequence can be used for one or for
multiple tables. It is possible that individual sequence numbers will appear to be skipped, because they were
generated and used in a transaction that ultimately rolled back. Additionally, a single user may not realize that
other users are drawing from the same sequence.
After a sequence is created, you can access its values in SQL statements with the CURRVAL pseudocolumn, which
returns the current value of the sequence, or the NEXTVAL pseudocolumn, which increments the sequence and
returns the new value.
Prerequisites
To create a sequence in your own schema, you must have the CREATE SEQUENCE system privilege.
To create a sequence in another user's schema, you must have the CREATE ANY SEQUENCE system privilege.
Creating a Sequence: Example The following statement creates the sequence customers_seq in the sample schema
oe. This sequence could be used to provide customer ID numbers when rows are added to the customers table.
CREATE SEQUENCE
customers_seq START WITH
1000
82
NOCYCLE;
The first reference to customers_seq.nextval returns 1000. The second returns 1001. Each subsequent reference
will return a value 1 greater than the previous reference.
83
Chapter 27: Indexes
Here I will explain different index using example, how index increase query performance, how index decrease DML
performance etc
By default, if we do not mention anything, oracle creates an index as a b-tree index. But we should know when to
use it. B-tree index stores data as binary tree format. As we know that, index is a schema object which stores some
sort of entry for each value for the indexed column. So, whenever any search happens on those columns, it checks
in the index for the exact location of that record to access fast. Few points about indexing:
To search for entry in the index, some sort of binary search algorithm used.
When data cardinality is high, b-tree index is perfect to use.
Index makes DML slow, as for each record, there should be one entry in the index for indexed column.
So, if not necessary, we should avoid creating index.
SELECT *
FROM user_data
WHERE UPPER(first_name) =
'JOHN2';
Function based index means, creating index based on a function.
If in search (where clause), frequently any function is used, it's better to create index based on that function.
Here, in the example, for search, Upper() function is being used. So, it's better to create index using upper
function.
84
Chapter 28: Hints
Parameters Details
It is the number of parallel connection/processes which you want your query to open
Degree of Parallelism (DOP)
up. It is usually 2, 4, 8, 16 so on.
Table Name The name of the table on which parallel hint will be applied.
Usage : use_nl(A B)
This hint will ask the engine to use nested loop method to join the tables A and B. That is row by row comparison.
The hint does not force the order of the join, just asks for NL.
SELECT /*+use_nl(e
d)*/ * FROM
Employees E
The APPEND hint instructs the engine to use direct path load. This means that the engine will not use a
conventional insert using memory structures and standard locks, but will write directly to the tablespace the data.
Always creates new blocks which are appended to the table's segment. This will be faster, but have some
limitations:
You cannot read from the table you appended in the same session until you commmit or rollback the
transaction.
If there are triggers defined on the table Oracle will not use direct path(it's a different story for sqlldr loads).
others
Example.
FROM Employees;
Object-level parallel hints give more control but are more prone to errors; developers often forget to use the alias
instead of the object name, or they forget to include some objects.
85
Let's say a query takes 100 seconds to execute without using parallel hint. If we change DOP to 2 for same query,
86
then ideally the same query with parallel hint will take 50 second. Similarly using DOP as 4 will take 25 seconds.
In practice, parallel execution depends on many other factors and does not scale linearly. This is especially true for
small run times where the parallel overhead may be larger than the gains from running in multiple parallel servers.
As explained in many places, "in a HASH join, Oracle accesses one table (usually the smaller of the joined results)
and builds a hash table on the join key in memory. It then scans the other table in the join (usually the larger one)
and probes the hash table for matches to it."
It is preferred against Nested Loops method when the tables are big, no indexes are at hand, etc.
Note: The hint does not force the order of the join, just asks for HASH JOIN method.
Example of usage:
CREATE TABLE fullTable(id) AS SELECT LEVEL FROM dual CONNECT BY LEVEL < 100000;
CREATE INDEX idx ON fullTable(id);
SELECT /*+ full(f) */ COUNT(1) FROM fullTable f WHERE id BETWEEN 10 AND 100;
87
Section 28.6: Result Cache
Oracle (11g and above) allows the SQL queries to be cached in the SGA and reused to improve performance. It
queries the data from cache rather than database. Subsequent execution of same query is faster because now the
data is being pulled from cache.
Output -
Number
1
2
3
4
5
6
7
8
9
10
Elapsed: 00:00:02.20
If I run the same query again now, the time to execute will reduce since the data is now fetched from cache which
was set during the first execution.
Output -
Number
1
2
3
4
5
6
7
8
9
10
Elapsed: 00:00:00.10
Notice how the elapsed time reduced from 2.20 seconds to 0.10 seconds.
Result Cache holds the cache until the data in database is updated/altered/deleted. Any change will
release the cache.
88
Chapter 29: Packages
Section 29.1: Define a Package header and body with a
function
In this example we define a package header and a package body wit a function.
After that we are calling a function from the package that return a return value.
Package header:
END;
Package body:
FUNCTION GetSkyColour(vPlanet IN
VARCHAR2) RETURN VARCHAR2
AS
vColour VARCHAR2(100) := NULL;
BEGIN
IF vPlanet = 'Earth' THEN
vColour := 'Blue';
ELSIF vPlanet = 'Mars' THEN
vColour := 'Red';
END IF;
DECLAR
E vColour
BEGI VARCHAR2(100);
N vColour := SkyPkg.GetSkyColour(vPlanet =>
'Earth');
EN DBMS_OUTPUT.PUT_LINE(vColour);
D;
/
89
PROCEDURE print_number(p_number IN
PROCEDURE print_number(p_number IN
INTEGER) IS BEGIN
DBMS_OUTPUT.put_line('Digit: ' ||
p_number); END;
PROCEDURE print_number(p_number IN
VARCHAR2) IS BEGIN
We call both procedures. The first with integer parameter, the second with varchar2.
SQL>
Digit: 3
PL/SQL procedure successfully completed
String: three
PL/SQL procedure successfully completed
Restrictions on Overloading
Only local or packaged subprograms, or type methods, can be overloaded. Therefore, you cannot overload
standalone subprograms. Also, you cannot overload two subprograms if their formal parameters differ only in
name or parameter mode
Modularity
Better Performance/ Funtionality
Parts of a Package
Specification - Sometimes called a package header. Contains variable and type declarations and the signatures of
the functions and procedures that are in the package which are public to be called from outside the package.
90
The package specification must be compiled before the package body, otherwise the package body compilation will
report an error.
91
Chapter 30: Exception Handling
Oracle produces a variety of exceptions. You may be surprised how tedious it can be to have your code stop with
some unclear message. To improve your PL/SQL code's ability to get fixed easily it is necessary to handle exceptions
at the lowest level. Never hide an exception "under the carpet", unless you're here to keep your piece of code for
you only and for no one else to maintain.
DECLARE
declaration Section
BEGIN
some statements
EXCEPTION
WHEN exception_one
THEN DO something
WHEN exception_two
THEN DO something
WHEN exception_three
An exception section has to be on the end of the PL/SQL block. PL/SQL gives us the opportunity to nest blocks, then
each block may have its own exception section for example:
BEGIN
some statements
BEGIN
some statements
EXCEPTION
WHEN exception_one
THEN DO something
END;
If exception will be raised in the nested block it should be handled in the inner exception section, but if inner
exception section does not handle this exception then this exception will go to exception section of the external
block.
92
1. Declare the exception
2. Raise it from your program
3. Create suitable exception handler to catch him.
Example
I want to update all salaries of workers. But if there are no workers, raise an exception.
update_salary IS
no_workers EXCEPTION;
v_counter NUMBER :=
0;
BEGIN
SELECT COUNT(*) INTO v_counter FROM
no_workers; ELSE
UPDATE emp SET salary =
Exceptions are raised by database server automatically when there is a need, but if you want, you can raise
explicitly any exception using RAISE.
Procedure raise_application_error(error_number,error_message);
If you know that your database operation might raise specific exceptions those which don't have names, then you
can give them names so that you can write exception handlers specifically for them. Otherwise, you can use them
only with OTHERS exception handlers.
Syntax
DECLARE
my_name_exc EXCEPTION;
PRAGMA
exception_init(my_name_exc,-37); BEGIN
...
EXCEPTION
WHEN my_name_exc
93
my_name_exc EXCEPTION; that is the exception name declaration.
PRAGMA exception_init(my_name_exc,-37); assign name to the error code of internally defined exception.
Example
We have an emp_id which is a primary key in emp table and a foreign key in dept table. If we try to remove emp_id
when it has child records, it will be thrown an exception with code -2292.
remove_employee IS
emp_exception EXCEPTION;
PRAGMA exception_init(emp_exception,-
2292); BEGIN
DELETE FROM emp WHERE emp_id = 3;
EXCEPTION
Oracle documentation says: "An internally defined exception with a user-declared name is still an
internally defined exception, not a user-defined exception."
Example
insert_emp IS
BEGIN
INSERT INTO emp (emp_id, ename) VALUES ('1','Jon');
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
DBMS_OUTPUT.put_line('Duplicate value on index!');
Below are examples exceptions name with theirs codes:
94
Section 30.5: Define custom exception, raise it and see where
it comes from
To illustrate this, here is a function that has 3 different "wrong" behaviors
DECLARE
this_is_not_acceptable EXCEPTION;
PRAGMA EXCEPTION_INIT(this_is_not_acceptable, -
defined';
w_schema all_tables.OWNER%TYPE;
VARCHAR2) IS
w_err VARCHAR2 (200) := 'to-be-
defined'; BEGIN
w_err := 'get_schema-step-1:';
IF (p_table = 'Delivery-Manager-Is-Silly')
THEN RAISE this_is_not_acceptable;
END IF;
w_err := 'get_schema-step-2:';
FROM all_tables
WHERE table_name LIKE(p_table||'%');
EXCEPTION
DBMS_OUTPUT.put_line('[ERR]'||w_err||'unhandled
exception:'||SQLERRM); RAISE;
END Get_schema;
BEGIN
g_err := 'Global; first call:';
get_schema('Delivery-Manager-Is-Silly',
95
w_schema); g_err := 'Global; second call:';
get_schema('AAA', w_schema);
get_schema('', w_schema);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.put_line('[ERR]'||g_err||'unhandled exception:'||SQLERRM);
-- you may raise this again to the caller if error log isn't enough.
-- raise;
END;
/
96
[WARN]get_schema-step-1:Please don't make fun of the delivery manager.
[WARN]get_schema-step-2:This can happen. Check the table name you entered.
[ERR]get_schema-step-2:unhandled exception:ORA-01422: exact fetch returns more than requested
number of rows
[ERR]Global; third call:unhandled exception:ORA-01422: exact fetch returns more than requested
number of rows
Remember that exception are here to handle rare cases. I saw applications who raised an exception at every access,
just to ask for the user password, saying "not connected"... so much computation waste.
Here is a way to test what goes wrong with the user used by the database link:
DECLARE
v_dummy NUMBER;
BEGIN
-- testing db link
EXECUTE IMMEDIATE 'select COUNT(1) from [email protected]' INTO v_dummy ;
-- if we get here, exception wasn't raised: display COUNT's result
DBMS_OUTPUT.put_line(v_dummy||' users on PASS db');
EXCEPTION
-- exception can be referred by their name in the predefined Oracle's list
WHEN
LOGIN_DENIED
THEN
THEN
-- or referred by their number: stored automatically in reserved variable SQLCODE
IF SQLCODE = '-
2019' THEN
THEN
DBMS_OUTPUT.put_line('ORA-1035 / DATABASE IS ON RESTRICTED SESSION, CONTACT YOUR
DBA');
97
ELSIF SQLCODE = '-
28000' THEN
THEN
DBMS_OUTPUT.put_line('ORA-28002 / PASSWORD IS EXPIRED,
98
END
EN IF;
D;
/
Exception handling is a possibility to keep our program running even if appear runtime error resulting from
for example coding mistakes, hardware failures.We avoid it from exiting abruptly.
99
Chapter 31: Error logging
Section 31.1: Error logging when writing to database
Create Oracle error log table ERR$_EXAMPLE for existing EXAMPLE table:
100
Chapter 32: Database Links
Section 32.1: Creating a database link
CREATE DATABASE LINK
dblink_name CONNECT TO
remote_username IDENTIFIED BY
To test a database link connection without needing to know any of the object names in the linked database, use the
following query:
To explicitly specify a domain for the linked database service, the domain name is added to the USING statement.
For example:
USING 'tns_service_name.WORLD'
If no domain name is explicitly specified, Oracle uses the domain of the database in which the link is being created.
10g: https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_5005.htm
11g: https://docs.oracle.com/cd/B28359_01/server.111/b28310/ds_concepts002.htm
12g: https://docs.oracle.com/database/121/SQLRF/statements_5006.htm#SQLRF01205
Prerequisites: For creating a private Database link you need a CREATE DATABASE LINK privilege. For creating a
private Database link you need a CREATE PUBLIC DATABASE LINK privilege.
From ORA1:
SQL> CREATE <public> DATABASE LINK ora2 CONNECT TO user1 IDENTIFIED BY pass1 USING <tns
name OF ora2>;
Now that we have the DB link set up, we can prove that by running the following from ORA1:
101
You can also access the DB Objects of "ORA2" from "ORA1", given the user user1 has the SELECT privilege on those
objects on ORA2 (such as TABLE1 below):
Pre-requistes:
102
Chapter 33: Table partitioning
Partitioning is a functionality to split tables and indexes into smaller pieces. It is used to improve performance and
to manage the smaller pieces individually. The partition key is a column or a set of columns that defines in which
partition each row is going to be stored. Partitioning Overview in official Oracle documentation
Table "A" doesn't contain data in partition "OLD_VALUES" and table "B" contains data
103
Result : data is "moved" from table "B" (contains no data after operation) to partition "OLD_VALUES"
Table "A" contains data in partition "OLD_VALUES" and table "B" doesn't contain data
Result : data is "moved" from partition "OLD_VALUES" (contains no data after operation) to table "B"
Note : there is a quite a few additional options, features and restrictions for this operation
VARCHAR2(2),
order_value
You should use a power of 2 for the number of hash partitions, so that you get an even distribution in partition size.
)
Section 33.8: Range partitioning
This creates a table partitioned by ranges, in this example on order values.
NUMBER(15), user_id
VARCHAR2(2),
order_value
NUMBER(15), store_id
NUMBER(5)
)
PARTITION BY RANGE(order_value)
NUMBER(15), user_id
VARCHAR2(2),
order_value
104
PARTITION BY LIST(store_id)
( PARTITION p1 VALUES
(1,2,3), PARTITION p2
VALUES(4,5,6),
PARTITION p3
105
Chapter 34: Oracle Advanced Queuing
(AQ)
Section 34.1: Simple Producer/Consumer
Overview
Create a queue that we can send a message to. Oracle will notify our stored procedure that a message has been
enqueued and should be worked. We'll also add some subprograms we can use in an emergency to stop messages
from being deqeued, allow dequeuing again, and run a simple batch job to work through all of the messages.
These examples were tested on Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production.
Create Queue
We will create a message type, a queue table that can hold the messages, and a queue. Messages in the queue will
be dequeued first by priority then be their enqueue time. If anything goes wrong working the message and the
dequeue is rolled-back AQ will make the message available for dequeue 3600 seconds later. It will do this 48 times
before moving it an exception queue.
sender VARCHAR2
( 50 ), message
VARCHAR2 ( 512 )
);
/
-- Type MESSAGE_T compiled
BEGIN
DBMS_AQADM.create_queue_table( queue_t
106
PROCEDURE disable_dequeue;
END;
/
message_worker_pkg IS
-- raised by Oracle when we try to dequeue but no more messages are ready to
-- be dequeued at this moment
no_more_messages_ex EXCEPTION;
PRAGMA exception_init
(no_more_messages_ex,
-25228);
enable_dequeue AS
BEGIN
DBMS_AQADM.start_queue (queue_name => queue_name_c, dequeue =>
TRUE); END enable_dequeue;
-- prevents messages from being worked but will still allow them to be created and
enqueued
PROCEDURE
disable_dequeue AS
BEGIN
DBMS_AQADM.stop_queue (queue_name => queue_name_c, dequeue => TRUE, enqueue =>
BEGIN
DBMS_OUTPUT.put_line ( message_in.sender || ' says ' ||
107
message_in.message ); END work_message;
DBMS_AQ.dequeue_options
_t; message_id_l RAW (16);
message_l message_t;
message_properties_l
DBMS_AQ.message_properties_
t;
BEGIN
dequeue_options_l.msgid := descr.msg_id;
dequeue_options_l.consumer_name :=
descr.consumer_name; dequeue_options_l.wait :=
DBMS_AQ.no_wait; DBMS_AQ.dequeue (queue_name
=> descr.queue_name,
108
dequeue_options => dequeue_options_l,
message_properties =>
message_l,
msgid => message_id_l);
work_message (message_l);
COMMIT;
EXCEPTION
WHEN no_more_messages_ex
THEN
WHEN
OTHERS
THEN
-- we don't need to have a raise here. I just wanted to point out that
-- since this will be called by AQ throwing the exception back to it
-- will have it put the message back on the queue and retry later
RAISE;
END on_message_enqueued;
work_old_messages AS
PRAGMA autonomous_transaction;
dequeue_options_l
DBMS_AQ.dequeue_options
message_properties_l
DBMS_AQ.message_properties_
t;
BEGIN
dequeue_options_l.wait := DBMS_AQ.no_wait;
dequeue_options_l.navigation :=
DBMS_AQ.first_message;
message_properties =>
message_properties_l, payload => message_l,
END LOOP;
EXCEPTION
WHEN no_more_messages_ex
THEN
NULL;
END work_old_messages;
END;
Next tell AQ that when a message is enqueued to MESSAGE_Q (and committed) notify our procedure it has work to
do. AQ will start up a job in its own session to handle this.
BEGIN
DBMS_AQ.register
( sys.aq$_reg_info_list (
DBMS_AQ.namespace_aq,
'plsql://' || USER || '.message_worker_pkg.on_message_enqueued',
HEXTORAW ('FF'))),
110
Start Queue and Send a Message
DECLARE
enqueue_options_l DBMS_AQ.enqueue_options_t;
message_properties_l
DBMS_AQ.message_properties_
message_l message_t;
BEGIN
111
Chapter 35: constraints
Section 35.1: Update foreign keys with new value in Oracle
Suppose you have a table and you want to change one of this table primary id. you can use the following scrpit.
primary ID here is "PK_S"
BEGIN
FOR i IN (SELECT a.table_name, c.column_name
FROM user_constraints a, user_cons_columns c
END
LOOP;
END;
BEGIN
FOR I IN (SELECT table_name, constraint_name FROM user_constraint t WHERE
r_constraint_name='pk_t1') LOOP
EXECUTE IMMEDIATE ' alter table ' || I.table_name || ' disable constraint ' ||
112
Chapter 36: Autonomous Transactions
Section 36.1: Using autonomous transaction for logging errors
The following procedure is a generic one which will be used to log all errors in an application to a common error log
table.
p_calling_program IN
VARCHAR2, p_error_code IN
INTEGER, p_error_description
IN VARCHAR2
)
IS
PRAGMA
AUTONOMOUS_TRANSACTION; BEGIN
INSERT INTO
error_log VALUES
(
p_calling_program,
The following anonymous PL/SQL block shows how to call the log_errors procedure.
BEGIN
DELETE FROM dept WHERE deptno = 10;
EXCEPTION
WHEN OTHERS THEN
log_errors('Delete dept',SQLCODE,
SQLERRM); RAISE;
END;
CALLING_PROGR ERROR_CODE
SELECT * FROM error_log; ERROR_DESCRIPTIO
AM N
- ORA-02292: integrity constraint violated - child
DB_USER RECORD found
229 APEX_PUBLIC_US
ERROR_DATETI
2 ER
08/09/2016
113
Chapter 37: Oracle MAF
Section 37.1: To get value from Binding
ValueExpression ve = AdfmfJavaUtilities.getValueExpression(<binding>,
String.class); String <variable_name> = (String)
Here "binding" indicates the EL expression from which the value is to be get.
"variable_name" the parameter to which the value from the binding to be stored
114
Chapter 38: level query
Section 38.1: Generate N Number of records
SELECT ROWNUM NO FROM DUAL CONNECT BY LEVEL <= 10
/*The above query is useful in various scenarios like generating a sequence of dates from a given date. The
following query generates 10 consecutive dates */
01- JAN-17
02- JAN-17
03- JAN-17
04- JAN-17
05- JAN-17
06- JAN-17
07- JAN-17
08- JAN-17
09- JAN-17
10-JAN-17
115
Chapter 39: Hierarchical Retrieval With
Oracle Database 12C
You can use hierarchical queries to retrieve data based on a natural hierarchical relationship between rows in a
table
The CONNECT BY clause to define the relationship between employees and managers.
Down"
FROM HR.EMPLOYEES E
116
Chapter 40: Data Pump
Following are the steps to create a data pump import/export:
DBA_DATAPUMP_SESSIONS;
2. Datapump status:
Note down the job name from the import/export logs or data dictionary name and
Run attach command:
type status in Import/Export prompt
impdp <bkpadmin>/<bkp123>
attach=<SYS_IMPORT_SCHEMA_01> Import> status
*Please replace the data in <> with appropriate values as per your environment. You can add/modify parameters as
per your requirements. In the above example all the remaining parameters are added in parameter files as stated
below: *
schemas=<schema>
directory= DATAPUMP_REMOTE_DIR
dumpfile=<dbname>_<schema>.dmp
117
Parameter file details [say exp.par] :
schemas=<schema>
directory=
DATAPUMP_REMOTE_DIR
dumpfile=<dbname>_<schema>_%U.dmp
logfile=exp_<dbname>_<schema>.LO
Prior to user import it is a good practice to drop the schema or table imported.
Commands:
*Please replace the data in <> with appropriate values as per your environment. You can add/modify parameters as
per your requirements. In the above example all the remaining parameters are added in parameter files as stated
below: *
schemas=<schema>
directory= DATAPUMP_REMOTE_DIR
dumpfile=<dbname>_<schema>.dmp
schemas=<schema>
directory=
DATAPUMP_REMOTE_DIR
dumpfile=<dbname>_<schema>_%U.dmp
118
Parameter file details [say imp.par] :
DATAPUMP_REMOTE_DIR
dumpfile=<dbname>_<schema>.dm
119
Chapter 41: Bulk collect
Section 41.1: Bulk data Processing
local collections are not allowed in select statements. Hence the first step is to create a schema level collection. If
the collection is not schema level and being used in SELECT statements then it would cause "PLS-00642: local
collection types not allowed in SQL statements"
a_2 VARCHAR2(10)
);
--Grant permissions on collection so that it could be used publically in database
DECLARE
table1_tbl table1_tbl_typ;
BEGIN
table1_tbl :=
table1_tbl_typ(); SELECT
table1_t(a_1,a_2)
WHERE ROWNUM<10;
120
Chapter 42: Real Application Security
Oracle Real Application Security was introduced in Oracle 12c. It summarize many Security Topics like User-Role-
Model, Access Control, Application vs. Database, End-User-Security or Row- and Column Level Security
Application Privilege: An Application Privilege describes Privileges like SELECT, INSERT, UPDATE, DELETE, ...
Application Privileges can be summarized as an Aggregate Privilege.
XS$PRIVILEGE(
name=>'privilege_name'
[, implied_priv_list=>XS$NAME_LIST('"SELECT"', '"INSERT"', '"UPDATE"', '"DELETE"')]
)
XS$PRIVILEGE_LIST( XS$P
RIVILEGE(...),
XS$PRIVILEGE(...),
Application User:
BEGIN
SYS.XS_PRINCIPAL.CREATE_USER('user_name
'); END;
Direct Login Application User:
BEGIN
SYS.XS_PRINCIPAL.CREATE_USER(name => 'user_name', schema =>
'schema_name'); END;
BEGIN
SYS.XS_PRINCIPAL.SET_PASSWORD('user_name',
'password'); END;
PASSWORD_REUSE_TIME
1/4440
PASSWORD_REUSE_MAX 3
PASSWORD_VERIFY_FUNCTION Verify_Pass;
BEGIN
(optional:)
BEGIN
SYS.XS_PRINCIPAL.SET_VERIFIER('user_name', '6DFF060084ECE67F',
121
END;
Application Role:
DECLARE
st_date TIMESTAMP WITH TIME
Dynamic Application Role: (gets enabled dynamical based on the authenatication state)
BEGIN
SYS.XS_PRINCIPAL.CREATE_DYNAMIC_ROLE
(name => 'app_dynamic_role',
Regular:
XSPUBLIC
XSBYPASS
XSSESSIONADMIN
XSNAMESPACEADMI
N XSPROVISIONER
XSCACHEADMI
XSDISPATCHER
122
XSAUTHENTICATED: (direct or middle tier application)
123
Chapter 43: Assignments model and
language
Section 43.1: Assignments model in PL/SQL
All programming languages allow us to assign values to variables. Usually, a value is assigned to variable, standing
on left side. The prototype of the overall assignment operations in any contemporary programming language looks
like this:
This will assign right operand to the left operand. In PL/SQL this operation looks like this:
left_operand := right_operand;
Left operand must be always a variable. Right operand can be value, variable or function:
SET serveroutput ON
DECLARE
v_hello1
VARCHAR2(32767);
v_hello2
VARCHAR2(32767);
v_hello3
VARCHAR2(32767);
FUNCTION hello RETURN VARCHAR2 IS BEGIN RETURN 'Hello from a
There is a feature in PL/SQL that allow us to assign "from right to the left". It's possible to do in SELECT INTO
statement. Prototype of this instrunction you will find below:
SELECT [ literal |
column_value ] INTO
local_variable
124
This code will assign character literal to a local variable:
SET serveroutput ON
DECLARE
v_hello
VARCHAR2(32767); BEGIN
SELECT 'Hello
When the code block is executed in SQL*Plus the following output is printed in console:
Hello world!
Asignment "from right to the left" is not a standard, but it's valuable feature for programmers and users. Generally
it's used when programmer is using cursors in PL/SQL - this technique is used, when we want to return a single
scalar value or set of columns in the one line of cursor from SQL cursor.
Further Reading:
125
Chapter 44: Triggers
Introduction:
Triggers are a useful concept in PL/SQL. A trigger is a special type of stored procedure which does not require to be
explicitly called by the user. It is a group of instructions, which is automatically fired in response to a specific data
modification action on a specific table or relation, or when certain specified conditions are satisfied. Triggers help
maintain the integrity, and security of data. They make the job convenient by taking the required action
automatically.
BEGIN
IF inserting THEN
-- only set the current date if it is not specified
IF :NEW.created IS NULL THEN
:NEW.created :=
SYSDATE; END IF;
END IF;
126
Chapter 45: Dynamic SQL
Dynamic SQL allows you to assemble an SQL query code in the runtime. This technique has some disadvantages
and have to be used very carefully. At the same time, it allows you to implement more complex logic. PL/SQL
requires that all objects, used in the code, have to exist and to be valid at compilation time. That's why you can't
execute DDL statements in PL/SQL directly, but dynamic SQL allows you to do that.
BEGIN
EXECUTE IMMEDIATE 'select column_value from ' ||
p_table_name || ' where id = :P' INTO
DECLARE
table_name VARCHAR2(30) :=
'my_table'; id NUMBER := 1;
BEGIN
DBMS_OUTPUT.put_line(get_value(table_name,
Table to test:
DECLARE
query_text VARCHAR2(1000) := 'insert into my_table(id, column_value) values
DECLARE
query_text VARCHAR2(1000) := 'update my_table set column_value = :P_VAL where
id = :P_ID'; id NUMBER := 2;
127
EXECUTE IMMEDIATE query_text USING
BEGIN
EXECUTE IMMEDIATE 'create table my_table (id number, column_value
varchar2(100))'; END;
DECLARE
query_text VARCHAR2(1000) := 'begin :P_OUT := cos(:P_IN);
NUMBER; BEGIN
128
Credits
Thank you greatly to all the people from Stack Overflow Documentation who helped provide this content,
more changes can be sent to [email protected] for new content to be published or updated
129
Nogueira Jr Chapter 15
Pancho Chapter 5
phonetic_man Chapter 36
Pirate X Chapter 28
ppeterka Chapter 18
Pranav Shah Chapters 9, 18 and 26
Prashant Mishra Chapters 2 and 41
Robin James Chapter 9
Roman Chapter 6
Sanjay Radadiya Chapters 13 and 38
Skynet Chapter 3
Slava Babin Chapters 5 and 8
smshafiqulislam Chapter 27
SriniV Chapters 9, 11, 15 and 26
SSD Chapter 35
Steven Feuerstein Chapter 1
StewS2 Chapter 29
TechEnthusiast Chapter 38
Tenzin Chapters 2 and 29
Thunder Chapter 11
tonirush Chapters 6, 7, 13 and 33
Tony Andrews Chapter 30
trincot Chapter 13
user272735 Chapters 2 and 43
user3216906 Chapter 17
Vahid Chapter 39
Vidya Thotangare Chapter 40
William Robertson Chapter 4
Zohar Elkayam Chapter 3
zygimantus Chapter 31
130
You may also like