This section provides two examples, one each of SQL and PDL usage. These can be used as quick references to the context of every SQL and PDL example throughout the WAF Developer Guide. The PDL usage is first in Example D-1, with the SQL usage second in the Example D-2.
model tutorial;
object type Publication {
BigDecimal id = publications.publication_id INTEGER;
String name = publications.name VARCHAR(400);
object key (id);
}
object type Magazine extends Publication {
// we need to specify the size of the String attribute so we know
// whether it is actually a String or if it is really a Clob
String issueNumber = magazines.issue_number VARCHAR(30);
// notice that because it extends Publication, there is not an
// explicitly "object key" declaration. Rather, there is
// a "reference key" declaration and "id" is not defined
// as one of the attributes
reference key (magazines.magazine_id);
}
object type Article {
BigDecimal id = articles.title INTEGER;
String title = articles.title VARCHAR(30);
object key (articles.article_id);
}
// this is an "association block" associating "articles" and "magazines"
association {
// note that the Attribute Type is an Object Type (Article)
// and not a standard Java Type. Also notice the order of the
// join path and see the note below.
Article[0..n] articles = join magazines.magazine_id
to magazine_article_map.magazine_id,
join magazine_article_map.article_id
to articles.article_id;
Magazine[0..n] magazines = join articles.article_id
to magazine_article_map.article_id,
join magazine_article_map.magazine_id
to magazines.magazine_id;
// the next line is the Link Attribute
BigDecimal pageNumber = magazine_article_map.page_number INTEGER;
}
object type Paragraph {
BigDecimal id = paragraphs.paragraph_id INTEGER;
String text = paragraphs.text CLOB;
object key (paragraphs.paragraph_id);
}
association {
Article[1..1] articles = join paragraphs.article_id
to articles.article_id;
// notice the composite keyword indicates that if the article does
// not exist then the paragraph also does not exist
composite Paragraph[0..n] paragraphs = join articles.article_id
to paragraphs.article_id;
}
object type screenName {
BigDecimal id = screen_names.name_id INTEGER;
String screenName = screen_names.screen_name VARCHAR(700);
Blob screenIcon = screen_names.screen_icon BLOB;
object key (id);
}
object type Author {
BigInteger[1..1] id = authors.author_id INTEGER;
String[1..1] firstName = author.first_name VARCHAR(700);
String[1..1] lastName = author.last_name VARCHAR(700);
Blob[0..1] portrait = authors.portrait BLOB;
// notice the use of a join path to allow the events for the
// Role Reference to be automatically created.
ScreenName[0..1] screenName =
join authors.screen_name_id to screen_names.name_id;
object key (id);
}
query paragraphMagazines {
BigDecimal magazineID;
BigDecimal paragraphID;
Integer issueNumber;
String text;
do {
select m.magazine_id, p.paragraph_id, issue_number, text
from magazines m, a, magazine_article_map ma, paragraphs p
where ma.magazine_id = m.magazine_id
and p.article_id = ma.article_id
} map {
magazineID = m.magazine_id;
paragraphID = p.paragraph_id;
issueNumber = m.issue_number;
text = p.text;
}
}
query MagazineToAuthorMapping {
// the next two lines are declaring that objects will be returned
Magazine magazine;
Author author;
options {
WRAP_QUERIES = false;
}
do {
select publications.name, issue_number, publication_id,
authors.first_name, authors.last_name, author_id
from magazines, publications, articles, authors,
magazine_article_map, article_author_map
where publications.publication_id =
magazines.magazine_id
and magazine_article_map.magazine_id =
magazines.magazine_id
and magazine_article_map.article_id =
article_author_map.article_id
and article_author_map.author_id = authors.author_id
} map {
// here we map the attributes of the objects
// to columns returned by the query.
magazine.name = publications.name;
magazine.issueNumber = magazines.issue_number;
magazine.id = publications.publication_id;
author.authorID = authors.author_id;
author.firstName = authors.first_name;
author.lastName = authors.last_name;
}
}
query MagazineWithMaxID {
BigDecimal magazineID;
do {
select max(magazine_id) as magazine_id from magazines
} map {
magazineID = magazines.magazine_id;
}
}
data operation createMagazine {
do {
insert into magazine_article_map (magazine_id, article_id)
select :magazineID, article_id from articles where not exists
(select 1 from magazine_article_map
where magazine_article_map.article_id = articles.article_id)
}
}
data operation DataOperationWithPLSQLAndArgs {
// the "call" keyword after the "do" indicates that the following
// is actually a piece of PL/SQL. The system then uses a
// java.sql.CallableStatement to execute it instead of only a
// java.sql.PreparedStatement.
do call {
myPLSQLProc(:title)
}
}
data operation DataOperationProcWithInOut {
do call {
DataOperationProcWithInOut(:newID, :copiedID)
} map {
newID : INTEGER;
copiedID : INTEGER;
}
}
query DataOperationWithPLSQLAndArgsAndReturnInPDL {
do call {
:title = DataQueryPLSQLFunction(:articleID)
} map {
title : VARCHAR(700);
articleID : Integer;
}
}
query myDataQuery {
BigDecimal articleID;
options {
WRAP_QUERIES = false;
}
do {
select max(article_id) from articles
} map {
articleID = articles.article_id;
}
}
query UsersGroups {
String firstName;
String lastName;
String groupName;
do{
select *
from users, groups, membership
where users.user_id = membership.member_id
and membership.group_id = groups.group_id
} map {
firstName=users.first_name;
lastName=users.last_name;
groupName=groups.group_name;
}
}
query retrieveArticlesBasedOnAuthor {
BigDecimal authorID;
do {
select article_id
from authors, author_article_map
where authors.author_id = author_article_map.author_id
and lower(last_name) like :lastName || '%'
} map {
authorID = authors.author_id;
}
}
query retrieveSelectedArticles {
BigDecimal articleID;
String title;
do {
select article_id, title from articles
} map {
articleID = articles.article_id;
title = articles.title;
}
}
query CategoryFamily {
Integer level;
BigDecimal categoryID;
String name;
String description;
Boolean isEnabled;
do {
select l, c.category_id, c.name, c.description, c.enabled_p
from (select level l, related_category_id
from (select related_category_id, category_id
from cat_category_category_map
where relation_type = :relationType)
connect by prior related_category_id = category_id
start with category_id = :categoryID) m,
cat_categories c
where c.category_id = m.related_category_id
} map {
level = m.l;
categoryID = c.category_id;
name = c.name;
description = c.description;
isEnabled = c.enabled_p;
}
} |
Example D-1. Usage Reference for PDL
create table publications (
publication_id integer
constraint publications_pub_id_nn
not null
constraint publications_pub_id_pk
primary key,
name varchar(400)
constraint publications_pub_id_nn
not null
);
create table magazines (
magazine_id integer
constraint magazines_magazine_id_fk
references publications
constraint magazines_magazine_id_pk
primary key,
issue_number varchar(30)
);
create table articles (
article_id integer
constraint articles_article_id_pk
primary key
constraint articles_article_id_nn
not null
title varchar(700)
constraint articles_title
);
create table magazine_article_map (
magazine_id integer
constraint mag_article_map_mag_id_nn
not null
constraint mag_article_map_mag_id_fk
references magazines,
article_id integer
constraint mag_article_map_article_id_fk
references articles
constraint mag_article_map_article_id_nn
not null,
page_number integer
);
create table paragraphs (
paragraph_id integer
constraint paragraphs_paragraph_id_pk
primary key
constraint paragraphs_paragraph_id_nn
not null,
text clob,
article_id integer
constraint paragraphs_article_id_fk
references articles
constraint paragraphs_article_id_nn
not null
);
create table authors (
author_id integer
constraint authors_author_id_nn
not null
constraint authors_author_id_pk
primary key,
last_name varchar(700)
constraint authors_name_nn
not null,
first_name varchar(700)
constraint authors_name_nn
not null,
portrait blob,
screen_name_id integer references screen_names
);
create table screen_names (
name_id integer primary key,
screen_name varchar(700) not null,
screen_icon blob
);
create or replace function myPLSQLProc(v_priority in integer)
as
begin
insert into magazines (magazine_id, title)
select nvl(max(magazine_id), 0) + 1, :title from magazine_id;
end;
/
show errors
create or replace procedure DataOperationProcWithInOut(
v_new_id IN Integer,
v_copied_id OUT Integer)
as
begin
select max(article_id) into v_copied_id from articles;
insert into articles (article_id, title)
select v_new_id, title from articles
where article_id = v_copied_id;
insert into article_author_map (article_id, author_id)
select v_new_id, author_id from article_author_map
where article_id = v_copied_id;
end;
/
show errors
create or replace function
DataQueryPLSQLFunction(v_article_id in integer)
return number
is
v_title varchar(700);
begin
select title into v_title from articles
where article_id = v_article_id;
return v_title;
end;
/
show errors |
Example D-2. Usage Reference for SQL