Minimize
Blogger List

Johannes Ahrends
Toad and Oracle

Ben Boise
Toad SC Discussions

Kevin Dalton
Benchmark Factory

Steven Feuerstein
PL/SQL Obsession

Devin Gallagher
Toad SC discussions

Stuart Hodgins
JProbe Discussions

  Henrik "Mauritz" Johnson
Toad Tips & Tricks on the "other" Toads
  Mark Kurtz
Toad SC discussions
  Michael Lumbard
Toad SC discussions
Daniel Norwood
Toad for Data Analysts,
Toad Extension for Visual Studio
Debbie Peabody
Toad for Data Analysts
Gary Piper
Toad Reports Manager
John Pocknell
Toad for Oracle, JProbe
Kuljit Sangha
Toad SC discussions
Bert Scalzo Indicates Oracle ACE status
Toad for Oracle, Data Modeling, Benchmarking
Jeff Smith
Toad product family
Richard To
SQL Optimization
Jim Wankowski
DB2 - LUW and z/OS
John Weathington
  Toad Data Modeler Opens in a new window
Data Modeling
 
  Real Automated Code Testing for Oracle
Quest Code Tester blog
 
Minimize
Blog Tags
toad for oracle (122)
oracle (62)
plsql (46)
sql optimization (37)
toad for data analysts (28)
code tester (19)
toad for ibm db2 (13)
automation (11)
batch optimizer (10)
virtualization (10)
schema browser (9)
toad for sql server (9)
data grid (8)
sql (8)
sql editor (8)
toad data modeler (8)
benchmark factory (7)
excel (7)
query builder (7)
report manager (7)
toad extension (7)
visual studio (7)
11g (6)
configuration (6)
freeware (6)
health check (6)
vmware (6)
connect (5)
dba module (5)
er diagrammer (5)
F4 (5)
linux (5)
refactoring (5)
spotlight (5)
unicode (5)
compare (4)
debugger (4)
export (4)
formatter (4)
make code (4)
rman (4)
strip code (4)
benchmark (3)
bfscript (3)
bulk collect (3)
code templates (3)
code xpert (3)
database browser (3)
db2 (3)
notebook (3)
oem (3)
RAC (3)
session browser (3)
speed (3)
sql optimizer (3)
toad for mysql (3)
tpc-c (3)
9.7 (2)
alert log (2)
app designer (2)
awr (2)
code insight (2)
code snippets (2)
collection (2)
compare and sync (2)
compliance (2)
data generator (2)
data warehouse (2)
database explorer (2)
database monitor (2)
explain (2)
forall (2)
ftp (2)
group execute (2)
handbook (2)
installation (2)
job scheduler (2)
multi-task (2)
nested table (2)
os command (2)
profiler (2)
recovery (2)
release history (2)
save as (2)
schema compare (2)
sql recall (2)
stats pack (2)
subversion (2)
team coding (2)
trace file browser (2)
while loop (2)
10g (1)
64 bit (1)
7zip (1)
action (1)
addm (1)
alter (1)
ansi join (1)
array (1)
ccleaner (1)
code coverage (1)
code road map (1)
CRON (1)
cursor for loop (1)
data browser (1)
data subset (1)
database probe (1)
dbms_flashback (1)
dbms_profiler (1)
ddl (1)
feuerstein (1)
filezilla (1)
flash drive (1)
flow control (1)
for loop (1)
group policy manager (1)
hints (1)
import (1)
index (1)
inheritance (1)
invoker rights (1)
ipad (1)
java (1)
latency (1)
log switch (1)
logical model (1)
ltrim (1)
master-detail browser (1)
monitor (1)
multi-select (1)
naming standards (1)
network (1)
object explorer (1)
OEBS (1)
package (1)
parser (1)
partitioning (1)
performance (1)
pragma (1)
project manager (1)
RAT (1)
revo (1)
REXEC (1)
schema report (1)
script manager (1)
search (1)
set operator (1)
sga (1)
slow (1)
sonarsource (1)
source control (1)
space projection (1)
sql monitor (1)
sql navigator (1)
sql script (1)
sql tracker (1)
sql*plus (1)
standards (1)
statistics (1)
stored procedure (1)
string parser (1)
sub-model (1)
sub-type (1)
synch (1)
synchback (1)
TELNET (1)
toad (1)
trace (1)
unit test (1)
unix (1)
usb (1)
utility (1)
v10 (1)
v9.5 (1)
version control (1)
waits (1)
workload replay (1)
workspace (1)
xml (1)
 
WELCOME, GUEST
 
 

Blogs
Toad and Database Commentaries

Toad World blogs are a mix of insightful how-tos from Quest experts as well as their commentary on experiences with new database technologies.  Have some views of your own to share?  Post your comments!  Note:  Comments are restricted to registered Toad World users.

Do you have a topic that you'd like discussed?  We'd love to hear from you.  Send us your idea for a blog topic.


Oct 12

Written by: StevenFeuersteinTW
Monday, October 12, 2009 7:28 AM  RssIcon

A little known, but very handy feature of PL/SQL is the ability to apply set operators, like union, intersect and minus, to nested tables. I can, for example, find all the elements common to two lists of strings with nothing more than the following use of MULTISET INTERSECT:
DECLARE
   TYPE
nested_type IS TABLE OF NUMBER;
   nt1           nested_type := nested_type (1, 2, 3, 4, 5);
   nt2           nested_type := nested_type (-1, -77, 3, 2, 1);
   comment_set   nested_type;
BEGIN
   comment_set := nt1 MULTISET INTERSECT nt2;
END;

I had always believed that this feature was only supported for nested tables of scalars, such as strings, numbers and dates.

A recent email from a developer forced me to confront the fact that I surely do not know everything there is to know about PL/SQL.   This developer was using MULTISET UNION with nested tables of records and found that it worked just fine. Wow!
 
Further investigation revealed that MULTISET operations (along with equality checks) can even be used with multi-level collections, as in:
CREATE OR REPLACE TYPE numbers_t IS TABLE OF NUMBER
/
CREATE OR REPLACE TYPE num_numbers_t IS TABLE OF numbers_t
/
DECLARE
   n1   num_numbers_t :=
         num_numbers_t (numbers_t (1), numbers_t (2));
   n2   num_numbers_t :=
         num_numbers_t (numbers_t (1), numbers_t (2));
   n3   num_numbers_t;
BEGIN
   IF n1 = n2
   THEN
      DBMS_OUTPUT.put_line ('=');
   END IF;
   n3 := n1 MULTISET UNION n2;
   n3 := n1 MULTISET INTERSECT n2;
   n3 := n1 MULTISET EXCEPT n2;
END;
/
I have not yet completed my investigations to identify the limits of this feature, but there are clearly some limits. For example, this same developer found that an attempt to use MULTSET EXCEPT (a.k.a., "minus") raised this error:
PLS-00306: wrong number or types of arguments in call to 'MULTISET_EXCEPT_ALL'
So hopefully this news has opened your eyes a little bit wider about what is possible in PL/SQL. Look for opportunities to apply MULTISET in your programs. It can replace an awful lot of lines of code.
 
My Best of Oracle PL/SQL presentation includes a section on MULTISET, with a few more details.
 
The Oracle documentation also contains information about MULTISET.
 

Search Blog Entries