0% found this document useful (0 votes)
5 views

PPT_ch06_2

Chapter 6 of 'Database Principles' covers advanced SQL topics including JOIN operations, subqueries, and SQL functions for data manipulation. It explains various types of joins, such as inner, outer, and cross joins, as well as how to create views, triggers, and stored procedures. Additionally, the chapter discusses relational set operators like UNION and INTERSECT, and provides insights into using SQL functions for date, string, and numeric data processing.

Uploaded by

jdc110977
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
5 views

PPT_ch06_2

Chapter 6 of 'Database Principles' covers advanced SQL topics including JOIN operations, subqueries, and SQL functions for data manipulation. It explains various types of joins, such as inner, outer, and cross joins, as well as how to create views, triggers, and stored procedures. Additionally, the chapter discusses relational set operators like UNION and INTERSECT, and provides insights into using SQL functions for date, string, and numeric data processing.

Uploaded by

jdc110977
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
You are on page 1/ 52

Database Principles:

Fundamentals of Design,
Implementation, and Management
Tenth Edition

Chapter 6
Procedural Language SQL and
Advanced SQL
Objectives

• In this chapter, you will learn:


– How to use the advanced SQL JOIN operator
syntax
– About the different types of subqueries and
correlated queries
– How to use SQL functions to manipulate dates,
strings, and other data
– About the relational set operators UNION,
UNION ALL, INTERSECT, and MINUS

2
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
Objectives (cont’d.)
– How to create and use views and updatable
views
– How to create and use triggers and stored
procedures
– How to create embedded SQL

3
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
SQL Join Operators

• Join operation merges rows from two tables


and returns the rows with one of the following:
– Have common values in common columns
• Natural join
– Meet a given join condition
• Equality or inequality
– Have common values in common columns or
have no matching values
• Outer join
• Inner join: only returns rows meeting criteria
4
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
Cross Join

• Performs relational product of two tables


– Also called Cartesian product
• Syntax:
SELECT column-list FROM table1 CROSS JOIN
table2
• Perform a cross join that yields specified
attributes

5
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
Natural Join

• Returns all rows with matching values in the


matching columns
– Eliminates duplicate columns
• Used when tables share one or more common
attributes with common names
• Syntax:
SELECT column-list FROM table1 NATURAL
JOIN table2

6
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
JOIN USING Clause

• Returns only rows with matching values in the


column indicated in the USING clause
• Syntax:
SELECT column-list FROM table1 JOIN table2
USING (common-column)
• JOIN USING operand does not require table
qualifiers
–Oracle returns error if table name is specified

7
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
JOIN ON Clause

• Used when tables have no common attributes


• Returns only rows that meet the join condition
– Typically includes equality comparison
expression of two columns
• Syntax:
SELECT column-list FROM table1 JOIN table2
ON join-condition

8
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
Outer Joins

• Returns rows matching the join condition


• Also returns rows with unmatched attribute
values for tables to be joined
• Three types
– Left
– Right
– Full
• Left and right designate order in which tables
are processed
9
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
Outer Joins (cont’d.)

• Left outer join


– Returns rows matching the join condition
– Returns rows in left side table with unmatched
values
– Syntax: SELECT column-list FROM table1 LEFT
[OUTER] JOIN table2 ON join-condition
• Right outer join
– Returns rows matching join condition
– Returns rows in right side table with unmatched
values
10
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
Outer Joins (cont’d.)

• Full outer join


– Returns rows matching join condition
– Returns all rows with unmatched values in either
side table
– Syntax:
SELECT column-list
FROM table1 FULL [OUTER] JOIN table2
ON join-condition

11
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
12
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
Subqueries and Correlated Queries
• Often necessary to process data based on other
processed data
• Subquery is a query inside a query, normally
inside parentheses
• First query is the outer query
– Inside query is the inner query
• Inner query is executed first
• Output of inner query is used as input for outer
query
• Sometimes referred to as a nested query
13
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
WHERE Subqueries

• Most common type uses inner SELECT


subquery on right side of WHERE comparison
– Requires a subquery that returns only one single
value
• Value generated by subquery must be of
comparable data type
• Can be used in combination with joins

14
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
IN Subqueries

• Used when comparing a single attribute to a list


of values

15
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
HAVING Subqueries

• HAVING clause restricts the output of a


GROUP BY query
– Applies conditional criterion to the grouped rows

16
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
Multirow Subquery Operators:
ANY and ALL
• Allows comparison of single value with a list of
values using inequality comparison
• “Greater than ALL” equivalent to “greater than
the highest in list”
• “Less than ALL” equivalent to “less than lowest”
• Using equal to ANY operator equivalent to IN
operator

17
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
FROM Subqueries

• Specifies the tables from which the data will be


drawn
• Can use SELECT subquery in the FROM
clause
– View name can be used anywhere a table is
expected

18
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
Attribute List Subqueries

• SELECT statement uses attribute list to indicate


columns to project resulting set
– Columns can be attributes of base tables
– Result of aggregate function
• Attribute list can also include subquery
expression: inline subquery
– Must return one single value
• Cannot use an alias in the attribute list

19
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
Correlated Subqueries

• Subquery that executes once for each row in


the outer query
• Correlated because inner query is related to the
outer query
– Inner query references column of outer
subquery
• Can also be used with the EXISTS special
operator

20
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
SQL Functions
• Generating information from data often requires
many data manipulations
• SQL functions are similar to functions in
programming languages
• Functions always use numerical, date, or string
value
• Value may be part of a command or attribute in
a table
• Function may appear anywhere in an SQL
statement
21
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
Date and Time Functions

• All SQL-standard DBMSs support date and


time functions
• Date functions take one parameter and return a
value
• Date/time data types are implemented
differently by different DBMS vendors
• ANSI SQL standard defines date data types,
but not how data types are stored

22
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
Numeric Functions

• Grouped in different ways


– Algebraic, trigonometric, logarithmic, etc.
• Do not confuse with aggregate functions
– Aggregate functions operate over sets
– Numeric functions operate over single row
• Numeric functions take one numeric parameter
and return one value

23
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
24
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
String Functions

• String manipulations are the most used


functions in programming
• String manipulation function examples:
– Concatenation
– Printing in uppercase
– Finding length of an attribute

25
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
Conversion Functions

• Take a value of given data type and convert it to


the equivalent value in another data type
• Oracle conversion functions:
– TO_CHAR: takes a date value, converts to
character string
– TO_DATE: takes character string representing a
date, converts it to actual date in Oracle format
• SQL Server uses CAST and CONVERT
functions

26
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
Relational Set Operators

• UNION
• INTERSECT
• MINUS
• Work properly if relations are union-compatible
– Names of relation attributes must be the same
and their data types must be identical

27
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
UNION
• Combines rows from two or more queries without
including duplicate rows
– Example:
SELECT CUS_LNAME, CUS_FNAME,
CUS_INITIAL, CUS_AREACODE,
FROM CUSTOMER
UNION
SELECT CUS_LNAME, CUS_FNAME,
CUS_INITIAL, CUS_AREACODE,
FROM CUSTOMER_2
• Can be used to unite more than two queries
28
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
UNION ALL
• Produces a relation that retains duplicate rows
– Example query:
SELECT CUS_LNAME, CUS_FNAME,
CUS_INITIAL, CUS_AREACODE,
FROM CUSTOMER
UNION ALL
SELECT CUS_LNAME, CUS_FNAME,
CUS_INITIAL, CUS_AREACODE,
FROM CUSTOMER_2;
• Can be used to unite more than two queries

29
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
INTERSECT
• Combines rows from two queries, returning only
the rows that appear in both sets
• Syntax: query INTERSECT query
– Example query:
SELECT CUS_LNAME, CUS_FNAME,
CUS_INITIAL, CUS_AREACODE,
FROM CUSTOMER
INTERSECT
SELECT CUS_LNAME, CUS_FNAME,
CUS_INITIAL, CUS_AREACODE,
FROM CUSTOMER_2
Database Systems, 10th Edition 30
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
31
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
MINUS
• Combines rows from two queries
– Returns only the rows that appear in the first set but
not in the second
• Syntax: query MINUS query
– Example:
SELECT CUS_LNAME, CUS_FNAME,
CUS_INITIAL, CUS_AREACODE, FROM
CUSTOMER
MINUS
SELECT CUS_LNAME, CUS_FNAME,
CUS_INITIAL, CUS_AREACODE, FROM
CUSTOMER_2

32
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
Syntax Alternatives
• IN and NOT IN subqueries can be used in place of
INTERSECT
• Example:
SELECT CUS_CODE FROM CUSTOMER
WHERE CUS_AREACODE = ‘615’ AND
CUS_CODE IN (SELECT
DISTINCT CUS_CODE
FROM
INVOICE);

33
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
Virtual Tables: Creating a View

• View
– Virtual table based on a SELECT query
• Base tables
• Tables on which the view is based
• CREATE VIEW viewname AS SELECT query
• Relational view special characteristics

34
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
Updatable Views

• Batch update routine pools multiple


transactions into a single batch
– Update master table field in a single operation
• Updatable view is a view that can be used to
update attributes in the base tables
• Not all views are updatable
– GROUP BY expressions or aggregate functions
cannot be used
– Cannot use set operators
– Most restrictions are based on use of JOINs
35
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
Oracle Sequences

• MS Access AutoNumber data type fills a


column with unique numeric values
• Oracle sequences
– Independent object in the database
– Named, used anywhere a value expected
– Not tied to a table or column
– Generate numeric values that can be assigned
to any column in any table
– Created and deleted at any time

36
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
37
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
Procedural SQL

• SQL does not support conditional execution


• Isolate critical code
– All applications access shared code
– Better maintenance and logic control
• Persistent stored module (PSM) is a block of
code containing:
– Standard SQL statements
– Procedural extensions
– Stored and executed at the DBMS server
38
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
Procedural SQL (cont’d.)

• Procedural SQL (PL/SQL) enables you to:


– Store procedural code and SQL statements in
database
– Merge SQL and traditional programming
constructs
• Procedural code executed by DBMS when
invoked by end user
– Anonymous PL/SQL blocks and triggers
– Stored procedures and PL/SQL functions

39
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
40
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
Triggers
• Procedural SQL code automatically invoked by
RDBMS on data manipulation event
• Trigger definition:
– Triggering timing: BEFORE or AFTER
– Triggering event: INSERT, UPDATE, DELETE
– Triggering level:
• Statement-level trigger
• Row-level trigger
– Triggering action
• DROP TRIGGER trigger_name
41
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
Stored Procedures
• Named collection of procedural and SQL
statements
• Advantages
– Substantially reduce network traffic and increase
performance
• No transmission of individual SQL statements over
network
– Reduce code duplication by means of code
isolation and code sharing
• Minimize chance of errors and cost of application
development and maintenance
42
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
PL/SQL Processing with Cursors

• Cursor: special construct in procedural SQL to


hold data rows returned by SQL query
• Implicit cursor: automatically created when SQL
returns only one value
• Explicit cursor: holds the output of an SQL
statement that may return two or more rows
• Cursor-style processor retrieves data from
cursor one row at a time
– Current row is copied to PL/SQL variables

43
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
PL/SQL Stored Functions

• Named group of procedural and SQL


statements that returns a value
• Syntax:
CREATE FUNCTION function_name(argument
IN data-type, …) RETURN data- type [IS]
BEGIN
PL/SQL statements;

RETURN (value or expression);
END;
44
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
Embedded SQL

• Key differences between SQL and procedural


languages:
– Run-time mismatch
• SQL is executed one instruction at a time
• Host language typically runs at client side in its
own memory space
– Processing mismatch
• Host language processes one data element at a
time
– Data type mismatch
45
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
Embedded SQL (cont’d.)

• Embedded SQL framework defines:


– Standard syntax to identify embedded SQL code
within host language
– Standard syntax to identify host variables
– Communication area exchanges status and
error information between SQL and host
language

46
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
47
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
Embedded SQL (cont’d.)

• Static SQL
– Embedded SQL in which programmer uses
predefined SQL statements and parameters
• End users of programs are limited to actions that
were specified in application programs
– SQL statements will not change while
application is running

48
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
Embedded SQL (cont’d.)

• Dynamic SQL
– SQL statement is not known in advance, but
instead is generated at run time
– Program can generate SQL statements at run-
time that are required to respond to ad hoc
queries
– Attribute list and condition are not known until
end user specifies them
– Tends to be much slower than static SQL
– Requires more computer resources
49
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
Summary
• Operations that join tables are classified as inner
joins and outer joins
• Natural join returns all rows with matching values
in the matching columns
– Eliminates duplicate columns
• Subqueries and correlated queries process data
based on other processed data
• Most subqueries are executed in serial fashion
• SQL functions are used to extract or transform
data
50
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
Summary (cont’d.)

• Relational set operators combine output of two


queries to generate new relation
• Oracle sequences may be used to generate
values to be assigned to a record
• PL/SQL can be used to create triggers, stored
procedures, and PL/SQL functions
• A stored procedure is a named collection of
SQL statements

51
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.
Summary (cont’d.)

• When SQL statements return more than one


value inside the PL/SQL code, cursor is needed
• Embedded SQL uses SQL statements within an
application programming language

52
© 2013 Cengage Learning. All Rights Reserved. This edition is intended for use outside of the U.S. only, with content that may be different from the U.S. Edition.
May not be scanned, copied, duplicated, or posted to a publicly accessible website, in whole or in part.

You might also like

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy