Question

Storing XML into an Oracle Database

Asked by: Bware

Hi can anyone help

I need to find out how to store XML pages into Oracle 8i, I haven't got a clue and need assistance.  Also can anyone give me the location of material that deals with the subject.  

Please help!!!  I need help badly!!!!

This Question has been solved and asker verified All Experts Exchange premium technology solutions are available to subscription members.

Subscribe now for full access to Experts Exchange and get

Instant Access to this Solution

  • Plus...
  • 30 Day FREE access, no risk, no obligation
  • Collaborate with the world's top tech experts
  • Unlimited access to our exclusive solution database
  • Never be left without tech help again

Subscribe Now

Asked On
2000-11-20 at 09:02:46ID11920658
Tags

how

,

oracle

Topics

Oracle Database

,

Extensible HTML (XHTML)

Participating Experts
3
Points
30
Comments
12

Trusted by hundreds of thousands everyday for fast, accurate and reliable tech support.

  • "The time we save is the biggest benefit of Experts Exchange to Warner Bros. What could take multiple guys 2 hours or more each to find is accessed in around 15 minutes on Experts Exchange." Mike Kapnisakis, Warner Bros.
  • "Our team likes having a resource that is more secure than just using Google and most experts using this service really know their stuff. It's nice to look here first versus using Google." Dayna Sellner, Lockheed Martin
  • "Anytime that I've been stumped with a problem, 9 out of 10 times Experts Exchange has either the accepted solution or an open discussion of the potential solution to the problem." Kenny Red, eBay Inc.

See what Experts Exchange can do for you.

Got a question?

We've got the answer.

Experts Exchange has been collecting answers to technology questions since 1996…3 million and counting! If you have a question, chances are we already have your answer.

Screenshot of Experts Exchange Knowledgebase

Need individual assistance?

Our experts are ready to help.

If you can't find the exact answer you're looking for, ask our exclusive community of 50,000 experts. You’ll get a personalized answer from a trusted professional.

Screenshot of Experts Exchange Knowledgebase

Want to learn from the best?

Read articles from industry experts.

Thousands of free tech tips, tricks, how-to’s and tutorials are available in our peer reviewed articles section. See for yourself how smart our experts are, no login required.

Screenshot of an Article

Working on a long term project?

Store your work and research.

Save solutions to your questions, answers you’ve discovered through searching plus helpful articles in your personal knowledgebase for easy future access.

Screenshot of Experts Exchange Knowledgebase

Access the answers to your technology questions today.

Subscribe Now

30-day free trial. Register in 60 seconds.

What Makes Experts Exchange Unique?

Members of the expert community talk about why the experience at Experts Exchange is different than what you will find anywhere else.

Trusted by the world's most respected brands.

image of each brand's logo

Faithfully serving IT professionals since 1996.

Experts Exchange Logo

Try it out and discover for yourself.

Subscribe Now

30-day free trial. Register in 60 seconds.

Related Solutions

  1. Oracle & XML
    Hi, Experts. I am new in Oracle server, so I will start with stupid questions. 1) What is the latest release version of an Oracle Server? 2) I need to connect to an Oracle server Pubs database by using an ADO 2.6 . Please, paste some working code to connect( connection strin...
  2. xml in oracle
    Oracle does have a JVM embedded within itself which supports xml among other java features. I would like to extract data from a group of tables or all tables while screening out records based on rowid, where condition etc. The thus generated xml file will be sent and imported...
  3. Oracle & XML
    I need to generate a fairly complex XML file (with lists and nested to up 3-4 levels) and have currently done so using my own PL/SQL code with CURSORS etc. I have also seen Oracle XML-SQL utility which would appear to do the same thing, although it looks like it can only han...
  4. Connect xml with Oracle
    how can I connect XML with Oracle?
  5. Oracle and XML.........
    Does oracle 9i supports XML generation? From this example: http://www.grandpoohbah.net/Sandeepan/IOUG2001XDB.htm i have got some idea about generating XML doc using SQL query . Could please help me to generate some sample XML docs using simple SQL quries just to know how it ...

Free Tech Articles

  1. WARNING: 5 Reasons why you should NEVER fix a computer for free.
    It is in our nature to love the puzzle. We are obsessed. The lot of us. We love puzzles. We love the challenge. We thrive on finding the answer. We hate disarray. It bothers us deep in our soul. W...
  2. SCCM OSD Basic troubleshooting
    SCCM 2007 OSD is a fantastic way to deploy operating systems, however, like most things SCCM issues can sometimes be difficult to resolve due to the sheer volume of logs to sift through and the dispe...
  3. Migrate Small Business Server 2003 to Exchange 2010 and Windows 2008 R2
    This guide is intended to provide step by step instructions on how to migrate from Small Business Server 2003 to Windows 2008 R2 with Exchange 2010. For this migration to work you will need the fo...
  4. Create a Win7 Gadget
    This article shows you how to create a simple "Gadget" -- a sort of mini-application supported by Windows 7 and Vista. Gadgets can be dropped anywhere on the desktop to provide instant information, ...
  5. Outlook continually prompting for username and password
    There have been a lot of questions recently regarding Outlook prompting for a username and password whilst using Exchange 2007. There are a few reasons why this would happen and I will try to cover t...
  6. Backup Exchange 2010 Information Store using Windows Backup
    There seems to be quite a lot of confusion around the ability to backup Exchange 2010 using the built in Windows Backup feature. This stems from the omission of this feature prior to Exchange 2007 s...

Cloud Class Webinars

  1. Avoiding Bugs in Microsoft Access
    Alison Balter takes and in-depth look at avoiding bugs in Access. In this webinar you will learn about using the immediate window to debug your applications, invoking the debugger, using breakpoints to troubleshoot, stepping through code, setting the next statement to execute, ...
  2. Top 10 Best New Features in Visio 2010
    Scott Helmers gives live demonstrations of the top 10 new features in Visio 2010. This webinar will teach you how to create compelling diagrams by adding shapes to the page with a single click, linking the shapes in a diagram to data in Excel (or SQL Server, or SharePoint), ...
  3. IT Consultant Business Secrets Revealed
    Michael Munger, Experts Exchange tech pro and IT consultant, pulls back the curtain on his very successful businesses and answers question on every IT consultant and business owner should know about. He shares secrets on what he did to solve the 5 most common problems in IT, ...
  4. Disaster Recovery and Business Continuity
    Quest CTO, Mike Billon, gives an overview of the steps involved in building a dunamic disaster recovery plan. Through case studies and an examination of software/hardware tooles for monitoring and testing, you'll gain a better understandin of where you are, where you want ...
  5. Organize Your Visio Diagrams with Containers and Lists
    Scott Helmers uses cross functional flowcharts, wireframe diagrams, data graphic legends and seating charts to teach you: how to ustilize all three new structured diagram components in Visio 2010, the best practices for organizeing shapes in previous version of Visio, how to organize ...
  6. How to Us Objects, Properties, Events and Methods in Microsoft Access
    Alison Dalter gives an in-depbth look at objects, properties, events and methods in Microsoft Access. In this webinar you will learn about using the object browser, referring to objects, working with properties and methods, working with object variables, understanding the ...

Join the Community

Give a Little. Get a Lot.

Join the community of experts here and help other tech pros by answering question in your area of expertise. You can earn FREE access to all Experts Exchange's premium features and resources.

Join the Community

Answers

 

by: merithPosted on 2000-11-20 at 09:25:33ID: 5456899

Save it as a lob?

You could treat an xml file as anyother piece of data. When you create the column for the xml, set the type as LOB, BLOB, CLOB.. i believe any will work, but if your looking for efficiency, i suggest looking up the maximum value and constraints on each data type.

 

by: BwarePosted on 2000-11-20 at 09:30:38ID: 5456959

OK do you know where I could find information on this subject at all?  Then I could try and understand it

any help would be gratefully excepted!!!!!!

 

by: merithPosted on 2000-11-20 at 09:48:52ID: 5457346

 

by: BwarePosted on 2000-11-20 at 10:14:14ID: 5457900

I was thinking of information about how to store xml pages into oracle

 

by: merithPosted on 2000-11-20 at 10:29:16ID: 5458219

 

by: merithPosted on 2000-11-20 at 10:36:23ID: 5458299

2
Basic Elements of Oracle SQL
Once the whole is divided, the parts need names.

Lao Tsu, Tao Te Ching: Thirty-Two

This chapter contains reference information on the basic elements of Oracle SQL. These elements are simplest building blocks of SQL statements. Therefore, before using the statements described in Chapter 7, "SQL Statements", you should familiarize yourself with the concepts covered in this chapter, as well as in Chapter 3, "Operators", Chapter 4, "Functions", Chapter 5, "Expressions, Conditions, and Queries", and Chapter 6, "About SQL Statements":

Literals

Text

Integer

Number

Datatypes

Format Models

Nulls

Pseudocolumns

Comments

Database Objects

Schema Object Names and Qualifiers

Referring to Schema Objects and Parts

Literals
The terms literal and constant value are synonymous and refer to a fixed data value. For example, 'JACK', 'BLUE ISLAND', and '101' are all character literals; 5001 is a numeric literal. Note that character literals are enclosed in single quotation marks, which enable Oracle to distinguish them from schema object names.

Many SQL statements and functions require you to specify character and numeric literal values. You can also specify literals as part of expressions and conditions. You can specify character literals with the 'text' notation, national character literals with the N'text' notation, and numeric literals with the integer or number notation, depending on the context of the literal. The syntactic forms of these notations appear in the sections that follow.

Text
Text specifies a text or character literal. You must use this notation to specify values whenever 'text' or char appear in expressions, conditions, SQL functions, and SQL statements in other parts of this reference.

The syntax of text is as follows:

text::=


 
where

N  
 specifies representation of the literal using the national character set. Text entered using this notation is translated into the national character set by Oracle when used.  
 
c  
 is any member of the user's character set, except a single quotation mark (').  
 
' '  
 are two single quotation marks that begin and end text literals. To represent one single quotation mark within a literal, enter two single quotation marks.  
 
 


A text literal must be enclosed in single quotation marks. This reference uses the terms text literal and character literal interchangeably.

Text literals have properties of both the CHAR and VARCHAR2 datatypes:

Within expressions and conditions, Oracle treats text literals as though they have the datatype CHAR by comparing them using blank-padded comparison semantics. See "Blank-Padded Comparison Semantics".

A text literal can have a maximum length of 4000 bytes.

Here are some valid text literals:

'Hello'
'ORACLE.dbs'
'Jackie''s raincoat'
'09-MAR-98'
N'nchar literal'


For more information, see the syntax description of expr in "Expressions".

Integer
You must use the integer notation to specify an integer whenever integer appears in expressions, conditions, SQL functions, and SQL statements described in other parts of this reference.

The syntax of integer is as follows:

integer::=


 
where

digit  
 is one of 0, 1, 2, 3, 4, 5, 6, 7, 8, 9.  
 
 


An integer can store a maximum of 38 digits of precision.

Here are some valid integers:

7
+255


For more information, see the syntax description of expr in "Expressions".

Number
You must use the number notation to specify values whenever number appears in expressions, conditions, SQL functions, and SQL statements in other parts of this reference.

The syntax of number is as follows:

number::=


 
where

+, -  
 indicates a positive or negative value. If you omit the sign, a positive value is the default.  
 
digit  
 is one of 0, 1, 2, 3, 4, 5, 6, 7, 8 or 9.  
 
e, E  
 indicates that the number is specified in scientific notation. The digits after the E specify the exponent. The exponent can range from -130 to 125.  
 
 


A number can store a maximum of 38 digits of precision.

If you have established a decimal character other than a period (.) with the initialization parameter NLS_NUMERIC_CHARACTERS, you must specify numeric literals with 'text' notation. In such cases, Oracle automatically converts the text literal to a numeric value.

For example, if the NLS_NUMERIC_CHARACTERS parameter specifies a decimal character of comma, specify the number 5.123 as follows:

'5,123'


For more information on this parameter, see "ALTER SESSION" and Oracle8i Reference.

Here are some valid representations of number:

25
+6.34
0.5
25e-03
-1

For more information, see the syntax description of expr in "Expressions".

Datatypes
Each literal or column value manipulated by Oracle has a datatype. A value's datatype associates a fixed set of properties with the value. These properties cause Oracle to treat values of one datatype differently from values of another. For example, you can add values of NUMBER datatype, but not values of RAW datatype.

When you create a table or cluster, you must specify a datatype for each of its columns. When you create a procedure or stored function, you must specify a datatype for each of its arguments. These datatypes define the domain of values that each column can contain or each argument can have. For example, DATE columns cannot accept the value February 29 (except for a leap year) or the values 2 or 'SHOE'. Each value subsequently placed in a column assumes the column's datatype. For example, if you insert '01-JAN-98' into a DATE column, Oracle treats the '01-JAN-98' character string as a DATE value after verifying that it translates to a valid date.

Oracle provides a number of built-in datatypes as well as several categories for user-defined types, as shown in Figure 2-1.

Figure 2-1 Oracle Type Categories

 
The syntax of the Oracle built-in datatypes appears in the next diagram. Table 2-1 summarizes Oracle built-in datatypes. The rest of this section describes these datatypes as well as the various kinds of user-defined types.


--------------------------------------------------------------------------------
Note:
The Oracle precompilers recognize other datatypes in embedded SQL programs. These datatypes are called external datatypes and are associated with host variables. Do not confuse built-in and user-defined datatypes with external datatypes. For information on external datatypes, including how Oracle converts between them and built-in or user-defined datatypes, see Pro*COBOL Precompiler Programmer's Guide, Pro*C/C++ Precompiler Programmer's Guide, and SQL*Module for Ada Programmer's Guide.  

--------------------------------------------------------------------------------
 
 


built-in datatypes:


 
The ANSI-supported datatypes appear in the figure that follows. Table 2-2 shows the mapping of ANSI-supported datatypes to Oracle build-in datatypes.

ANSI-supported datatypes:


 
Table 2-1 Built-In Datatype Summary
Codea  Built-In Datatype  Description  
1  
 VARCHAR2(size)  
 Variable-length character string having maximum length size bytes. Maximum size is 4000, and minimum is 1. You must specify size for VARCHAR2.  
 
1  
 NVARCHAR2(size)  
 Variable-length character string having maximum length size characters or bytes, depending on the choice of national character set. Maximum size is determined by the number of bytes required to store each character, with an upper limit of 4000 bytes. You must specify size for NVARCHAR2.  
 
2  
 NUMBER(p,s)  
 Number having precision p and scale s. The precision p can range from 1 to 38. The scale s can range from -84 to 127.  
 
8  
 LONG  
 Character data of variable length up to 2 gigabytes, or 231 -1 bytes.  
 
12  
 DATE  
 Valid date range from January 1, 4712 BC to December 31, 9999 AD.  
 
23  
 RAW(size)  
 Raw binary data of length size bytes. Maximum size is 2000 bytes. You must specify size for a RAW value.  
 
24  
 LONG RAW  
 Raw binary data of variable length up to 2 gigabytes.  
 
69  
 ROWID  
 Hexadecimal string representing the unique address of a row in its table. This datatype is primarily for values returned by the ROWID pseudocolumn.  
 
208  
 UROWID [(size)]  
 Hexadecimal string representing the logical address of a row of an index-organized table. The optional size is the size of a column of type UROWID. The maximum size and default is 4000 bytes.  
 
96  
 CHAR(size)  
 Fixed-length character data of length size bytes. Maximum size is 2000 bytes. Default and minimum size is 1 byte.  
 
96  
 NCHAR(size)  
 Fixed-length character data of length size characters or bytes, depending on the choice of national character set. Maximum size is determined by the number of bytes required to store each character, with an upper limit of 2000 bytes. Default and minimum size is 1 character or 1 byte, depending on the character set.  
 
112  
 CLOB  
 A character large object containing single-byte characters. Both fixed-width and variable-width character sets are supported, both using the CHAR database character set. Maximum size is 4 gigabytes.  
 
112  
 NCLOB  
 A character large object containing multibyte characters. Both fixed-width and variable-width character sets are supported, both using the NCHAR database character set. Maximum size is 4 gigabytes. Stores national character set data.  
 
113  
 BLOB  
 A binary large object. Maximum size is 4 gigabytes.  
 
114  
 BFILE  
 Contains a locator to a large binary file stored outside the database. Enables byte stream I/O access to external LOBs residing on the database server. Maximum size is 4 gigabytes.  
 
a The codes listed for the datatypes are used internally by Oracle. The datatype code of a column or object attribute is returned when you use the DUMP function.
 
 

Character Datatypes
Character datatypes store character (alphanumeric) data, which are words and free-form text, in the database character set or national character set. They are less restrictive than other datatypes and consequently have fewer properties. For example, character columns can store all alphanumeric values, but NUMBER columns can store only numeric values.

Character data is stored in strings with byte values corresponding to one of the character sets, such as 7-bit ASCII or EBCDIC Code Page 500, specified when the database was created. Oracle supports both single-byte and multibyte character sets.

These datatypes are used for character data:

CHAR Datatype

NCHAR Datatype

NVARCHAR2 Datatype

VARCHAR2 Datatype

CHAR Datatype
The CHAR datatype specifies a fixed-length character string. When you create a table with a CHAR column, you supply the column length in bytes. Oracle subsequently ensures that all values stored in that column have this length. If you insert a value that is shorter than the column length, Oracle blank-pads the value to column length. If you try to insert a value that is too long for the column, Oracle returns an error.

The default length for a CHAR column is 1 character and the maximum allowed is 2000 characters. A zero-length string can be inserted into a CHAR column, but the column is blank-padded to 1 character when used in comparisons. For information on comparison semantics, see "Datatype Comparison Rules".

NCHAR Datatype
The NCHAR datatype specifies a fixed-length national character set character string. When you create a table with an NCHAR column, you define the column length either in characters or in bytes. You define the national character set when you create your database.

If the national character set of the database is fixed width, such as JA16EUCFIXED, then you declare the NCHAR column size as the number of characters desired for the string length. If the national character set is variable width, such as JA16SJIS, you declare the column size in bytes. The following statement creates a table with one NCHAR column that can store strings up to 30 characters in length using JA16EUCFIXED as the national character set:

CREATE TABLE tab1 (col1 NCHAR(30));


The column's maximum length is determined by the national character set definition. Width specifications of character datatype NCHAR refer to the number of characters if the national character set is fixed width and refer to the number of bytes if the national character set is variable width. The maximum column size allowed is 2000 bytes. For fixed-width, multibyte character sets, the maximum length of a column allowed is the number of characters that fit into no more than 2000 bytes.

If you insert a value that is shorter than the column length, Oracle blank-pads the value to column length. You cannot insert a CHAR value into an NCHAR column, nor can you insert an NCHAR value into a CHAR column.

The following example compares the COL1 column of TAB1 with national character set string NCHAR literal:

SELECT * FROM tab1 WHERE col1 = N'NCHAR literal';

NVARCHAR2 Datatype
The NVARCHAR2 datatype specifies a variable-length national character set character string. When you create a table with an NVARCHAR2 column, you supply the maximum number of characters or bytes it can hold. Oracle subsequently stores each value in the column exactly as you specify it, provided the value does not exceed the column's maximum length.

The column's maximum length is determined by the national character set definition. Width specifications of character datatype NVARCHAR2 refer to the number of characters if the national character set is fixed width and refer to the number of bytes if the national character set is variable width. The maximum column size allowed is 4000 bytes. For fixed-width, multibyte character sets, the maximum length of a column allowed is the number of characters that fit into no more than 4000 bytes.

The following statement creates a table with one NVARCHAR2 column of 2000 characters in length (stored as 4000 bytes, because each character takes two bytes) using JA16EUCFIXED as the national character set:

CREATE TABLE tab1 (col1 NVARCHAR2(2000));

VARCHAR2 Datatype
The VARCHAR2 datatype specifies a variable-length character string. When you create a VARCHAR2 column, you supply the maximum number of bytes of data that it can hold. Oracle subsequently stores each value in the column exactly as you specify it, provided the value does not exceed the column's maximum length. If you try to insert a value that exceeds the specified length, Oracle returns an error.

You must specify a maximum length for a VARCHAR2 column. This maximum must be at least 1 byte, although the actual length of the string stored is permitted to be zero. The maximum length of VARCHAR2 data is 4000 bytes. Oracle compares VARCHAR2 values using nonpadded comparison semantics. For information on comparison semantics, see "Datatype Comparison Rules".

VARCHAR Datatype
The VARCHAR datatype is currently synonymous with the VARCHAR2 datatype. Oracle recommends that you use VARCHAR2 rather than VARCHAR. In the future, VARCHAR might be defined as a separate datatype used for variable-length character strings compared with different comparison semantics.

NUMBER Datatype
The NUMBER datatype stores zero, positive, and negative fixed and floating-point numbers with magnitudes between 1.0 x 10-130 and 9.9...9 x 10125 (38 nines followed by 88 zeroes) with 38 digits of precision. If you specify an arithmetic expression whose value has a magnitude greater than or equal to 1.0 x 10126, Oracle returns an error.

Specify a fixed-point number using the following form:

NUMBER(p,s)


where:

s  
 is the scale, or the number of digits to the right of the decimal point. The scale can range from -84 to 127.  
 
 


Specify an integer using the following form:

NUMBER(p)  
 is a fixed-point number with precision p and scale 0. This is equivalent to NUMBER(p,0).  
 
 


Specify a floating-point number using the following form:

NUMBER  
 is a floating-point number with decimal precision 38. Note that a scale value is not applicable for floating-point numbers. (See "Floating-Point Numbers" for more information.)  
 
 


Scale and Precision
Specify the scale and precision of a fixed-point number column for extra integrity checking on input. Specifying scale and precision does not force all values to a fixed length. If a value exceeds the precision, Oracle returns an error. If a value exceeds the scale, Oracle rounds it.

The following examples show how Oracle stores data using different precisions and scales.

7456123.89  
 NUMBER  
 7456123.89  
 
7456123.89  
 NUMBER(9)  
 7456124  
 
7456123.89  
 NUMBER(9,2)  
 7456123.89  
 
7456123.89  
 NUMBER(9,1)  
 7456123.9  
 
7456123.89  
 NUMBER(6)  
 exceeds precision  
 
7456123.89  
 NUMBER(7,-2)  
 7456100  
 
7456123.89  
 NUMBER(-7,2)  
 exceeds precision  
 
 


Negative Scale
If the scale is negative, the actual data is rounded to the specified number of places to the left of the decimal point. For example, a specification of (10,-2) means to round to hundreds.

Scale Greater than Precision
You can specify a scale that is greater than precision, although it is uncommon. In this case, the precision specifies the maximum number of digits to the right of the decimal point. As with all number datatypes, if the value exceeds the precision, Oracle returns an error message. If the value exceeds the scale, Oracle rounds the value. For example, a column defined as NUMBER(4,5) requires a zero for the first digit after the decimal point and rounds all values past the fifth digit after the decimal point. The following examples show the effects of a scale greater than precision:

Actual Data   Specified As   Stored As  
..01234  
 NUMBER(4,5)  
 .01234  
 
..00012  
 NUMBER(4,5)  
 .00012  
 
..000127  
 NUMBER(4,5)  
 .00013  
 
..0000012  
 NUMBER(2,7)  
 .0000012  
 
..00000123  
 NUMBER(2,7)  
 .0000012  
 
 


Floating-Point Numbers
Oracle allows you to specify floating-point numbers, which can have a decimal point anywhere from the first to the last digit or can have no decimal point at all. A scale value is not applicable to floating-point numbers, because the number of digits that can appear after the decimal point is not restricted.

You can specify floating-point numbers with the form discussed in "NUMBER Datatype". Oracle also supports the ANSI datatype FLOAT. You can specify this datatype using one of these syntactic forms:

FLOAT  
 specifies a floating-point number with decimal precision 38, or binary precision 126.  
 
FLOAT(b)  
 specifies a floating-point number with binary precision b. The precision b can range from 1 to 126. To convert from binary to decimal precision, multiply b by 0.30103. To convert from decimal to binary precision, multiply the decimal precision by 3.32193. The maximum of 126 digits of binary precision is roughly equivalent to 38 digits of decimal precision.  
 
 


LONG Datatype
LONG columns store variable-length character strings containing up to 2 gigabytes, or 231-1 bytes. LONG columns have many of the characteristics of VARCHAR2 columns. You can use LONG columns to store long text strings. The length of LONG values may be limited by the memory available on your computer.


--------------------------------------------------------------------------------
Note:
Oracle Corporation strongly recommends that you convert LONG columns to LOB columns. LOB columns are subject to far fewer restrictions than LONG columns. For more information, see "TO_LOB".  

--------------------------------------------------------------------------------
 
 


You can reference LONG columns in SQL statements in these places:

SELECT lists

SET clauses of UPDATE statements

VALUES clauses of INSERT statements

The use of LONG values is subject to some restrictions:

A table cannot contain more than one LONG column.

You cannot create an object type with a LONG attribute.

LONG columns cannot appear in integrity constraints (except for NULL and NOT NULL constraints).

LONG columns cannot be indexed.

A stored function cannot return a LONG value.

Within a single SQL statement, all LONG columns, updated tables, and locked tables must be located on the same database.

LONG columns cannot appear in certain parts of SQL statements:

WHERE clauses, GROUP BY clauses, ORDER BY clauses, or CONNECT BY clauses or with the DISTINCT operator in SELECT statements

The UNIQUE operator of a SELECT statement

The column list of a CREATE CLUSTER statement

The CLUSTER clause of a CREATE MATERIALIZED VIEW statement

SQL functions (such as SUBSTR or INSTR)

Expressions or conditions

SELECT lists of queries containing GROUP BY clauses

SELECT lists of subqueries or queries combined by set operators

SELECT lists of CREATE TABLE ... AS SELECT statements

SELECT lists in subqueries in INSERT statements

Triggers can use the LONG datatype in the following manner:

A SQL statement within a trigger can insert data into a LONG column.

If data from a LONG column can be converted to a constrained datatype (such as CHAR and VARCHAR2), a LONG column can be referenced in a SQL statement within a trigger.

Variables in triggers cannot be declared using the LONG datatype.

:NEW and :OLD cannot be used with LONG columns.

You can use the Oracle Call Interface functions to retrieve a portion of a LONG value from the database. See Oracle Call Interface Programmer's Guide.

DATE Datatype
The DATE datatype stores date and time information. Although date and time information can be represented in both CHAR and NUMBER datatypes, the DATE datatype has special associated properties. For each DATE value, Oracle stores the following information: century, year, month, day, hour, minute, and second.

To specify a date value, you must convert a character or numeric value to a date value with the TO_DATE function. Oracle automatically converts character values that are in the default date format into date values when they are used in date expressions. The default date format is specified by the initialization parameter NLS_DATE_FORMAT and is a string such as 'DD-MON-YY'. This example date format includes a two-digit number for the day of the month, an abbreviation of the month name, and the last two digits of the year.

If you specify a date value without a time component, the default time is 12:00:00 AM (midnight). If you specify a time value without a date, the default date is the first day of the current month.

The date function SYSDATE returns the current date and time. For information on the SYSDATE and TO_DATE functions and the default date format, see "Date Format Models" and Chapter 4, "Functions".

Date Arithmetic
You can add and subtract number constants as well as other dates from dates. Oracle interprets number constants in arithmetic date expressions as numbers of days. For example, SYSDATE + 1 is tomorrow. SYSDATE - 7 is one week ago. SYSDATE + (10/1440) is ten minutes from now. Subtracting the HIREDATE column of the EMP table from SYSDATE returns the number of days since each employee was hired. You cannot multiply or divide DATE values.

Oracle provides functions for many common date operations. For example, the ADD_MONTHS function lets you add or subtract months from a date. The MONTHS_BETWEEN function returns the number of months between two dates. The fractional portion of the result represents that portion of a 31-day month. For more information on date functions, see "Date Functions".

Because each date contains a time component, most results of date operations include a fraction. This fraction means a portion of one day. For example, 1.5 days is 36 hours.

Using Julian Dates
A Julian date is the number of days since January 1, 4712 BC. Julian dates allow continuous dating from a common reference. You can use the date format model "J" with date functions TO_DATE and TO_CHAR to convert between Oracle DATE values and their Julian equivalents.

Example
This statement returns the Julian equivalent of January 1, 1997:

SELECT TO_CHAR(TO_DATE('01-01-1997', 'MM-DD-YYYY'),'J')
    FROM DUAL;

TO_CHAR
--------
2450450


For a description of the DUAL table, see "Selecting from the DUAL Table".

RAW and LONG RAW Datatypes
The RAW and LONG RAW datatypes store data that is not to be interpreted (not explicitly converted when moving data between different systems) by Oracle. These datatypes are intended for binary data or byte strings. For example, you can use LONG RAW to store graphics, sound, documents, or arrays of binary data, for which the interpretation is dependent on the use.




--------------------------------------------------------------------------------
Note:
Oracle Corporation strongly recommends that you convert LONG RAW columns to binary LOB (BLOB) columns. LOB columns are subject to far fewer restrictions than LONG columns. For more information, see "TO_LOB".  

--------------------------------------------------------------------------------
 
 


RAW is a variable-length datatype like VARCHAR2, except that Net8 (which connects user sessions to the instance) and the Import and Export utilities do not perform character conversion when transmitting RAW or LONG RAW data. In contrast, Net8 and Import/Export automatically convert CHAR, VARCHAR2, and LONG data from the database character set to the user session character set (which you can set with the NLS_LANGUAGE parameter of the ALTER SESSION statement), if the two character sets are different.

When Oracle automatically converts RAW or LONG RAW data to and from CHAR data, the binary data is represented in hexadecimal form, with one hexadecimal character representing every four bits of RAW data. For example, one byte of RAW data with bits 11001011 is displayed and entered as 'CB'.

Large Object (LOB) Datatypes
The built-in LOB datatypes BLOB, CLOB, and NCLOB (stored internally), and the BFILE (stored externally), can store large and unstructured data such as text, image, video, and spatial data up to 4 gigabytes in size.

When creating a table, you can optionally specify different tablespace and storage characteristics for LOB columns or LOB object attributes from those specified for the table.

LOB columns contain LOB locators that can refer to out-of-line or in-line LOB values. Selecting a LOB from a table actually returns the LOB's locator and not the entire LOB value. The DBMS_LOB package and Oracle Call Interface (OCI) operations on LOBs are performed through these locators. For more information about these interfaces and LOBs, see Oracle8i Supplied Packages Reference and Oracle Call Interface Programmer's Guide. For information on creating temporary LOBs, see Oracle8i Application Developer's Guide - Large Objects (LOBs).

LOBs are similar to LONG and LONG RAW types, but differ in the following ways:

LOBs can be attributes of a user-defined datatype (object).

The LOB locator is stored in the table column, either with or without the actual LOB value. BLOB, NCLOB, and CLOB values can be stored in separate tablespaces. BFILE data is stored in an external file on the server.

When you access a LOB column, the locator is returned.

A LOB can be up to 4 gigabytes in size. BFILE maximum size is operating system dependent, but cannot exceed 4 gigabytes.

LOBs permit efficient, random, piece-wise access to and manipulation of data.

You can define more than one LOB column in a table.

With the exception of NCLOB, you can define one or more LOB attributes in an object.

You can declare LOB bind variables.

You can select LOB columns and LOB attributes.

You can insert a new row or update an existing row that contains one or more LOB columns and/or an object with one or more LOB attributes. (You can set the internal LOB value to NULL, empty, or replace the entire LOB with data. You can set the BFILE to NULL or make it point to a different file.)

You can update a LOB row/column intersection or a LOB attribute with another LOB row/column intersection or LOB attribute.

You can delete a row containing a LOB column or LOB attribute and thereby also delete the LOB value. Note that for BFILEs, the actual operating system file is not deleted.

For more information, please see the discussion of LOB restrictions in Oracle8i Application Developer's Guide - Large Objects (LOBs). For more information on converting LONG columns to LOB columns, see "TO_LOB".

To access and populate rows of an internal LOB column (a LOB column stored in the database), use the INSERT statement first to initialize the internal LOB value to empty. Once the row is inserted, you can select the empty LOB and populate it using the DBMS_LOB package or the OCI.

The following example creates a table with LOB columns:

CREATE TABLE  person_table (name CHAR(40),
                            resume  CLOB,
                            picture BLOB)
  LOB (resume) STORE AS
               ( TABLESPACE resumes
                  STORAGE (INITIAL 5M NEXT 5M) );

BFILE Datatype
The BFILE datatype enables access to binary file LOBs that are stored in file systems outside the Oracle database. A BFILE column or attribute stores a BFILE locator, which serves as a pointer to a binary file on the server's file system. The locator maintains the directory alias and the filename. See "CREATE DIRECTORY".

Binary file LOBs do not participate in transactions and are not recoverable. Rather, the underlying operating system provides file integrity and durability. The maximum file size supported is 4 gigabytes.

The database administrator must ensure that the file exists and that Oracle processes have operating system read permissions on the file.

The BFILE datatype allows read-only support of large binary files. You cannot modify or replicate such a file. Oracle provides APIs to access file data. The primary interfaces that you use to access file data are the DBMS_LOB package and the OCI. For more information about LOBs, see Oracle8i Application Developer's Guide - Large Objects (LOBs) and Oracle Call Interface Programmer's Guide.

BLOB Datatype
The BLOB datatype stores unstructured binary large objects. BLOBs can be thought of as bitstreams with no character set semantics. BLOBs can store up to 4 gigabytes of binary data.

BLOBs have full transactional support. Changes made through SQL, the DBMS_LOB package, or the OCI participate fully in the transaction. BLOB value manipulations can be committed and rolled back. Note, however, that you cannot save a BLOB locator in a PL/SQL or OCI variable in one transaction and then use it in another transaction or session.

CLOB Datatype
The CLOB datatype stores single-byte character data. Both fixed-width and variable-width character sets are supported, and both use the CHAR database character set. CLOBs can store up to 4 gigabytes of character data.

CLOBs have full transactional support. Changes made through SQL, the DBMS_LOB package, or the OCI participate fully in the transaction. CLOB value manipulations can be committed and rolled back. Note, however, that you cannot save a CLOB locator in a PL/SQL or OCI variable in one transaction and then use it in another transaction or session.

NCLOB Datatype
The NCLOB datatype stores multibyte national character set character (NCHAR) data. Both fixed-width and variable-width character sets are supported. NCLOBs can store up to 4 gigabytes of character text data.

NCLOBs have full transactional support. Changes made through SQL, the DBMS_LOB package, or the OCI participate fully in the transaction. NCLOB value manipulations can be committed and rolled back. Note, however, that you cannot save an NCLOB locator in a PL/SQL or OCI variable in one transaction and then use it in another transaction or session.

ROWID Datatype
Each row in the database has an address. You can examine a row's address by querying the pseudocolumn ROWID. Values of this pseudocolumn are hexadecimal strings representing the address of each row. These strings have the datatype ROWID. For more information on the ROWID pseudocolumn, see "Pseudocolumns". You can also create tables and clusters that contain actual columns having the ROWID datatype. Oracle does not guarantee that the values of such columns are valid rowids.

Restricted Rowids
Beginning with Oracle8, Oracle SQL incorporated an extended format for rowids to efficiently support partitioned tables and indexes and tablespace-relative data block addresses (DBAs) without ambiguity.

Character values representing rowids in Oracle7 and earlier releases are called restricted rowids. Their format is as follows:

block.row.file


where:

block  
 is a hexadecimal string identifying the data block of the datafile containing the row. The length of this string depends on your operating system.  
 
row  
 is a four-digit hexadecimal string identifying the row in the data block. The first row of the block has a digit of 0.  
 
file  
 is a hexadecimal string identifying the database file containing the row. The first datafile has the number 1. The length of this string depends on your operating system.  
 
 


Extended Rowids
The extended ROWID datatype stored in a user column includes the data in the restricted rowid plus a data object number. The data object number is an identification number assigned to every database segment. You can retrieve the data object number from data dictionary views USER_OBJECTS, DBA_OBJECTS, and ALL_OBJECTS. Objects that share the same segment (clustered tables in the same cluster, for example) have the same object number.

Extended rowids are not available directly. You can use a supplied package, DBMS_ROWID, to interpret extended rowid contents. The package functions extract and provide information that would be available directly from a restricted rowid, as well as information specific to extended rowids. For information on the functions available with the DBMS_ROWID package and how to use them, see Oracle8i Supplied Packages Reference.

Compatibility and Migration
The restricted form of a rowid is still supported in Oracle8i for backward compatibility, but all tables return rowids in the extended format. For information regarding compatibility and migration issues, see Oracle8i Migration.

UROWID Datatype
Each row in a database has an address (as discussed in "ROWID Datatype"). However, the rows of some tables have addresses that are not physical or permanent, or were not generated by Oracle. For example, the row addresses of index-organized tables are stored in index leaves, which can move. Rowids of foreign tables (such as DB2 tables accessed through a gateway) are not standard Oracle rowids.

Oracle uses "universal rowids" (urowids) to store the addresses of index-organized and foreign tables. Index-organized tables have logical urowids and foreign tables have foreign urowids. Both types of urowid are stored in the ROWID pseudocolumn (as are the physical rowids of heap-organized tables).

Oracle creates logical rowids based on a table's primary key. The logical rowids do not change as long as the primary key does not change. The ROWID pseudocolumn of an index-organized table has a datatype of UROWID. You can access this pseudocolumn as you would the ROWID pseudocolumn of a heap-organized (that is, using the SELECT ROWID statement). If you wish to store the rowids of an index-organized table, you can define a column of type UROWID for the table and retrieve the value of the ROWID pseudocolumn into that column.


--------------------------------------------------------------------------------
Note:
Heap-organized tables have physical rowids. Oracle Corporation does not recommend that you specify a column of datatype UROWID for a heap-organized table.  

--------------------------------------------------------------------------------
 
 


For more information on the UROWID datatype and how Oracle generates and manipulates universal rowids, see Oracle8i Concepts and Oracle8i Tuning.

ANSI, DB2, and SQL/DS Datatypes
SQL statements that create tables and clusters can also use ANSI datatypes and datatypes from IBM's products SQL/DS and DB2. Oracle recognizes the ANSI or IBM datatype name and records it as the name of the datatype of the column, and then stores the column's data in an Oracle datatype based on the conversions shown in Table 2-2 and Table 2-3.

Table 2-2 ANSI Datatypes Converted to Oracle Datatypes
ANSI SQL Datatype   Oracle Datatype  
CHARACTER(n)

CHAR(n)  
 CHAR(n)  
 
CHARACTER VARYING(n)

CHAR VARYING(n)  
 VARCHAR(n)  
 
NATIONAL CHARACTER(n)

NATIONAL CHAR(n)

NCHAR(n)  
 NCHAR(n)  
 
NATIONAL CHARACTER VARYING(n)

NATIONAL CHAR VARYING(n)

NCHAR VARYING(n)  
 NVARCHAR2(n)  
 
NUMERIC(p,s)

DECIMAL(p,s)a  
 NUMBER(p,s)  
 
INTEGER

INT

SMALLINT  
 NUMBER(38)  
 
FLOAT(b)b

DOUBLE PRECISIONc

REALd  
 NUMBER  
 
aThe NUMERIC and DECIMAL datatypes can specify only fixed-point numbers. For these datatypes, s defaults to 0.
bThe FLOAT datatype is a floating-point number with a binary precision b. The default precision for this datatype is 126 binary, or 38 decimal.
cThe DOUBLE PRECISION datatype is a floating-point number with binary precision 126.
dThe REAL datatype is a floating-point number with a binary precision of 63, or 18 decimal.
 
 

Table 2-3 SQL/DS and DB2 Datatypes Converted to Oracle Datatypes
SQL/DS or DB2 Datatype   Oracle Datatype  
CHARACTER(n)  
 CHAR(n)  
 
VARCHAR(n)  
 VARCHAR(n)  
 
LONG VARCHAR(n)  
 LONG  
 
DECIMAL(p,s)a  
 NUMBER(p,s)  
 
INTEGER

SMALLINT  
 NUMBER(38)  
 
FLOAT(b)b  
 NUMBER  
 
aThe DECIMAL datatype can specify only fixed-point numbers. For this datatype, s defaults to 0.
bThe FLOAT datatype is a floating-point number with a binary precision b. This default precision for this datatype is 126 binary, or 38 decimal.
 
 

Do not define columns with these SQL/DS and DB2 datatypes, because they have no corresponding Oracle datatype:

GRAPHIC

LONG VARGRAPHIC

VARGRAPHIC

TIME

TIMESTAMP

Note that data of type TIME and TIMESTAMP can also be expressed as Oracle DATE data.

User-Defined Type Categories
User-defined datatypes use Oracle built-in datatypes and other user-defined datatypes as the building blocks of types that model the structure and behavior of data in applications. For information about Oracle built-in datatypes, see Oracle8i Concepts. For information about creating user-defined types, see "CREATE TYPE" and the "CREATE TYPE BODY". For information about using user-defined types, see Oracle8i Application Developer's Guide - Fundamentals.

The sections that follow describe the various categories of user-defined types.

Object Types
Object types are abstractions of the real-world entities, such as purchase orders, that application programs deal with. An object type is a schema object with three kinds of components:

A name, which identifies the object type uniquely within that schema.

Attributes, which are built-in types or other user-defined types. Attributes model the structure of the real-world entity.

Methods, which are functions or procedures written in PL/SQL and stored in the database, or written in a language like C or Java and stored externally. Methods implement operations the application can perform on the real-world entity.

REFs
An object identifier (OID) uniquely identifies an object and enables you to reference the object from other objects or from relational tables. A datatype category called REF represents such references. A REF is a container for an object identifier. REFs are pointers to objects.

When a REF value points to a nonexistent object, the REF is said to be "dangling". A dangling REF is different from a null REF. To determine whether a REF is dangling or not, use the predicate IS [NOT] DANGLING. For example, given table DEPT with column MGR whose type is a REF to type EMP_T:

SELECT t.mgr.name
   FROM dept t
   WHERE t.mgr IS NOT DANGLING;

Varrays
An array is an ordered set of data elements. All elements of a given array are of the same datatype. Each element has an index, which is a number corresponding to the element's position in the array.

The number of elements in an array is the size of the array. Oracle arrays are of variable size, which is why they are called varrays. You must specify a maximum size when you declare the array.

When you declare a varray, it does not allocate space. It defines a type, which you can use as:

The datatype of a column of a relational table

An object type attribute

A PL/SQL variable, parameter, or function return type

Oracle normally stores an array object either in line (that is, as part of the row data) or out of line (in a LOB), depending on its size. However, if you specify separate storage characteristics for a varray, Oracle will store it out of line, regardless of its size (see the varray_storage_clause of "CREATE TABLE").

Nested Tables
A nested table type models an unordered set of elements. The elements may be built-in types or user-defined types. You can view a nested table as a single-column table or, if the nested table is an object type, as a multicolumn table, with a column for each attribute of the object type.

A nested table definition does not allocate space. It defines a type, which you can use to declare:

Columns of a relational table

Object type attributes

PL/SQL variables, parameters, and function return values

When a nested table appears as the type of a column in a relational table or as an attribute of the underlying object type of an object table, Oracle stores all of the nested table data in a single table, which it associates with the enclosing relational or object table.

Datatype Comparison Rules
This section describes how Oracle compares values of each datatype.

Number Values
A larger value is considered greater than a smaller one. All negative numbers are less than zero and all positive numbers. Thus, -1 is less than 100; -100 is less than -1.

Date Values
A later date is considered greater than an earlier one. For example, the date equivalent of '29-MAR-1997' is less than that of '05-JAN-1998' and '05-JAN-1998 1:35pm' is greater than '05-JAN-1998 10:09am'.

Character String Values
Character values are compared using one of these comparison rules:

blank-padded comparison semantics

nonpadded comparison semantics

The following sections explain these comparison semantics. The results of comparing two character values using different comparison semantics may vary. The table below shows the results of comparing five pairs of character values using each comparison semantic. Usually, the results of blank-padded and nonpadded comparisons are the same. The last comparison in the table illustrates the differences between the blank-padded and nonpadded comparison semantics.

Blank-Padded   Nonpadded  
'ab' > 'aa'  
 'ab' > 'aa'  
 
'ab' > 'a '  
 'ab' > 'a '  
 
'ab' > 'a'  
 'ab' > 'a'  
 
'ab' = 'ab'  
 'ab' = 'ab'  
 
'a ' = 'a'  
 'a ' > 'a'  
 
 


Blank-Padded Comparison Semantics
If the two values have different lengths, Oracle first adds blanks to the end of the shorter one so their lengths are equal. Oracle then compares the values character by character up to the first character that differs. The value with the greater character in the first differing position is considered greater. If two values have no differing characters, then they are considered equal. This rule means that two values are equal if they differ only in the number of trailing blanks. Oracle uses blank-padded comparison semantics only when both values in the comparison are either expressions of datatype CHAR, NCHAR, text literals, or values returned by the USER function.

Nonpadded Comparison Semantics
Oracle compares two values character by character up to the first character that differs. The value with the greater character in that position is considered greater. If two values of different length are identical up to the end of the shorter one, the longer value is considered greater. If two values of equal length have no differing characters, then the values are considered equal. Oracle uses nonpadded comparison semantics whenever one or both values in the comparison have the datatype VARCHAR2 or NVARCHAR2.

Single Characters
Oracle compares single characters according to their numeric values in the database character set. One character is greater than another if it has a greater numeric value than the other in the character set. Oracle considers blanks to be less than any character, which is true in most character sets.

These are some common character sets:

7-bit ASCII (American Standard Code for Information Interchange)

EBCDIC Code (Extended Binary Coded Decimal Interchange Code) Page 500

ISO 8859/1 (International Standards Organization)

JEUC Japan Extended UNIX

Portions of the ASCII and EBCDIC character sets appear in Table 2-4 and Table 2-5. Note that uppercase and lowercase letters are not equivalent. Also, note that the numeric values for the characters of a character set may not match the linguistic sequence for a particular language.

Table 2-4 ASCII Character Set
Symbol
 Decimal value
 Symbol
 Decimal value
 
blank  
 32  
 ;  
 59  
 
!  
 33  
 <  
 60  
 
"  
 34  
 =  
 61  
 
#  
 35  
 >  
 62  
 
$  
 36  
 ?  
 63  
 
%  
 37  
 @  
 64  
 
&  
 38  
 A-Z  
 65-90  
 
'  
 39  
 [  
 91  
 
(  
 40  
 \  
 92  
 
)  
 41  
 ]  
 93  
 
*  
 42  
 ^^  
 94  
 
+  
 43  
 _  
 95  
 
,  
 44  
 `  
 96  
 
-  
 45  
 a-z  
 97-122  
 
..  
 46  
 {  
 123  
 
/  
 47  
 |  
 124  
 
0-9  
 48-57  
 }  
 125  
 
:  
 58  
 ~  
 126  
 
 

Table 2-5 EBCDIC Character Set
Symbol
 Decimal value
 Symbol
 Decimal value
 
blank  
 64  
 %  
 108  
 
"  
 74  
 _  
 109  
 
..  
 75  
 >  
 110  
 
<  
 76  
 ?  
 111  
 
(  
 77  
 :  
 122  
 
+  
 78  
 #  
 123  
 
|  
 79  
 @  
 124  
 
&  
 80  
 '  
 125  
 
!  
 90  
 =  
 126  
 
$  
 91  
 "  
 127  
 
*  
 92  
 a-i  
 129-137  
 
)  
 93  
 j-r  
 145-153  
 
;  
 94  
 s-z  
 162-169  
 
  
 95  
 A-I  
 193-201  
 
-  
 96  
 J-R  
 209-217  
 
/  
 97  
 S-Z  
 226-233  
 
 

Object Values
Object values are compared using one of two comparison functions: MAP and ORDER. Both functions compare object type instances, but they are quite different from one another. These functions must be specified as part of the object type.

For a description of MAP and ORDER methods and the values they return, see "CREATE TYPE". See also Oracle8i Application Developer's Guide - Fundamentals for more information.

Varrays and Nested Tables
You cannot compare varrays and nested tables in Oracle8i.

Data Conversion
Generally an expression cannot contain values of different datatypes. For example, an expression cannot multiply 5 by 10 and then add 'JAMES'. However, Oracle supports both implicit and explicit conversion of values from one datatype to another.

Implicit Data Conversion
Oracle automatically converts a value from one datatype to another when such a conversion makes sense. Oracle performs conversions in these cases:

When an INSERT or UPDATE statement assigns a value of one datatype to a column of another, Oracle converts the value to the datatype of the column.

When you use a SQL function or operator with an argument with a datatype other than the one it accepts, Oracle converts the argument to the accepted datatype.

When you use a comparison operator on values of different datatypes, Oracle converts one of the expressions to the datatype of the other.

Example 1
The text literal '10' has datatype CHAR. Oracle implicitly converts it to the NUMBER datatype if it appears in a numeric expression as in the following statement:

SELECT sal + '10'
    FROM emp;

Example 2
When a condition compares a character value and a NUMBER value, Oracle implicitly converts the character value to a NUMBER value, rather than converting the NUMBER value to a character value. In the following statement, Oracle implicitly converts '7936' to 7936:

SELECT ename
    FROM emp
    WHERE empno = '7936';

Example 3
In the following statement, Oracle implicitly converts '12-MAR-1993' to a DATE value using the default date format 'DD-MON-YYYY':

SELECT ename
    FROM emp
    WHERE hiredate = '12-MAR-1993';

Example 4
In the following statement, Oracle implicitly converts the text literal 'AAAAZ8AABAAABvlAAA' to a rowid value:

SELECT ename
    FROM emp
    WHERE ROWID = 'AAAAZ8AABAAABvlAAA';

Explicit Data Conversion
You can also explicitly specify datatype conversions using SQL conversion functions. Table 2-6 shows SQL functions that explicitly convert a value from one datatype to another.

Table 2-6 SQL Functions for Datatype Conversion
TO: FROM:  CHAR   NUMBER   DATE   RAW   ROWID   LONG/ LONG RAW   LOB  
CHAR   --  
 TO_NUMBER  
 TO_DATE  
 HEXTORAW  
 CHARTOROWID  
 
 
 
NUMBER  
TO_CHAR  
 --  
 TO_DATE

(number,'J')  
 
 
 
 
 
DATE  
TO_CHAR  
 TO_CHAR

(date,'J')  
 --  
 
 
 
 
 
RAW   RAWTOHEX  
 
 
 --  
 
 
 
 
ROWID   ROWIDTOCHAR  
 
 
 
 --  
 
 
 
LONG / LONG RAW    
 
 
 
 
 --  
 TO_LOB  
 
LOB    
 
 
 
 
 
 --  
 
 

For information on these functions, see "Conversion Functions".


--------------------------------------------------------------------------------
Note:
You cannot specify LONG and LONG RAW values in cases in which Oracle can perform implicit datatype conversion. For example, LONG and LONG RAW values cannot appear in expressions with functions or operators. For information on the limitations on LONG and LONG RAW datatypes, see "LONG Datatype".  

--------------------------------------------------------------------------------
 
 


Implicit vs. Explicit Data Conversion
Oracle recommends that you specify explicit conversions rather than rely on implicit or automatic conversions for these reasons:

SQL statements are easier to understand when you use explicit datatype conversion functions.

Automatic datatype conversion can have a negative impact on performance, especially if the datatype of a column value is converted to that of a constant rather than the other way around.

Implicit conversion depends on the context in which it occurs and may not work the same way in every case.

Algorithms for implicit conversion are subject to change across software releases and among Oracle products. Behavior of explicit conversions is more predictable.

Format Models
A format model is a character literal that describes the format of DATE or NUMBER data stored in a character string. You can use a format model as an argument of the TO_CHAR and TO_DATE functions:

To specify the format for Oracle to use to return a value from the database

To specify the format for a value you have specified for Oracle to store in the database

See "TO_CHAR (date conversion)", "TO_CHAR (number conversion)", and "TO_DATE". Note that a format model does not change the internal representation of the value in the database.

This section describes how to use:

Number format models

Date format models

Format model modifiers

Changing the Return Format
You can use a format model to specify the format for Oracle to use to return values from the database to you.

Example 1
The following statement selects the commission values of the employees in Department 30 and uses the TO_CHAR function to convert these commissions into character values with the format specified by the number format model '$9,990.99':

SELECT ename employee, TO_CHAR(comm, '$9,990.99') commission
   FROM emp
   WHERE deptno = 30;
 
EMPLOYEE   COMMISSION
---------- ----------
ALLEN         $300.00
WARD          $500.00
MARTIN      $1,400.00
BLAKE
TURNER          $0.00
JAMES


Because of this format model, Oracle returns commissions with leading dollar signs, commas every three digits, and two decimal places. Note that TO_CHAR returns null for all employees with null in the COMM column.

Example 2
The following statement selects the date on which each employee from Department 20 was hired and uses the TO_CHAR function to convert these dates to character strings with the format specified by the date format model 'fmMonth DD, YYYY':

 SELECT ename, TO_CHAR(Hiredate,'fmMonth DD, YYYY') hiredate
    FROM emp
    WHERE deptno = 20;
 
ENAME      HIREDATE
---------- ------------------
SMITH      December 17, 1980
JONES      April 2, 1981
SCOTT      April 19, 1987
ADAMS      May 23, 1987
FORD       December 3, 1981
LEWIS      October 23, 1997


With this format model, Oracle returns the hire dates (as specified by "fm" and discussed in "Format Model Modifiers") without blank padding, two digits for the day, and the century included in the year.

Supplying the Correct Format
You can use format models to specify the format of a value that you are converting from one datatype to another datatype required for a column. When you insert or update a column value, the datatype of the value that you specify must correspond to the column's datatype. For example, a value that you insert into a DATE column must be a value of the DATE datatype or a character string in the default date format (Oracle implicitly converts character strings in the default date format to the DATE datatype). If the value is in another format, you must use the TO_DATE function to convert the value to the DATE datatype. You must also use a format model to specify the format of the character string.

Example
The following statement updates BAKER's hire date using the TO_DATE function with the format mask 'YYYY MM DD' to convert the character string '1998 05 20' to a DATE value:

UPDATE emp
  SET hiredate = TO_DATE('1998 05 20','YYYY MM DD')
  WHERE ename = 'BLAKE';

Number Format Models
You can use number format models:

In the TO_CHAR function to translate a value of NUMBER datatype to VARCHAR2 datatype

In the TO_NUMBER function to translate a value of CHAR or VARCHAR2 datatype to NUMBER datatype

All number format models cause the number to be rounded to the specified number of significant digits. If a value has more significant digits to the left of the decimal place than are specified in the format, pound signs (#) replace the value. If a positive value is extremely large and cannot be represented in the specified format, then the infinity sign (~) replaces the value. Likewise, if a negative value is extremely small and cannot be represented by the specified format, then the negative infinity sign replaces the value (-~). This event typically occurs when you are using TO_CHAR() with a restrictive number format string, causing a rounding operation.

Number Format Elements
A number format model is composed of one or more number format elements. Table 2-7 lists the elements of a number format model. Examples are shown in Table 2-8.

Negative return values automatically contain a leading negative sign and positive values automatically contain a leading space unless the format model contains the MI, S, or PR format element.

Table 2-7 Number Format Elements
Element  Example  Description  
, (comma)  
 9,999  
 Returns a comma in the specified position. You can specify multiple commas in a number format model.

Restrictions:

A comma element cannot begin a number format model.

A comma cannot appear to the right of a decimal character or period in a number format model.

 
.. (period)  
 99.99  
 Returns a decimal point, which is a period (.) in the specified position.

Restriction: You can specify only one period in a number format model.  
 
$  
 $9999  
 Returns value with a leading dollar sign.  
 
0  
 0999

9990  
 Returns leading zeros.

Returns trailing zeros.  
 
9  
 9999  
 Returns value with the specified number of digits with a leading space if positive or with a leading minus if negative.

Leading zeros are blank, except for a zero value, which returns a zero for the integer part of the fixed-point number.  
 
B  
 B9999  
 Returns blanks for the integer part of a fixed-point number when the integer part is zero (regardless of "0"s in the format model).  
 
C  
 C999  
 Returns in the specified position the ISO currency symbol (the current value of the NLS_ISO_CURRENCY parameter).  
 
D  
 99D99  
 Returns in the specified position the decimal character, which is the current value of the NLS_NUMERIC_CHARACTER parameter. The default is a period (.).

Restriction: You can specify only one decimal character in a number format model.  
 
EEEE  
 9.9EEEE  
 Returns a value using in scientific notation.  
 
FM  
 FM90.9  
 Returns a value with no leading or trailing blanks.  
 
G  
 9G999  
 Returns in the specified position the group separator (the current value of the NLS_NUMERIC_CHARACTER parameter). You can specify multiple group separators in a number format model.

Restriction: A group separator cannot appear to the right of a decimal character or period in a number format model.  
 
L  
 L999  
 Returns in the specified position the local currency symbol (the current value of the NLS_CURRENCY parameter).  
 
MI  
 9999MI  
 Returns negative value with a trailing minus sign (-).

Returns positive value with a trailing blank.

Restriction: The MI format element can appear only in the last position of a number format model.  
 
PR  
 9999PR  
 Returns negative value in <angle brackets>.

Returns positive value with a leading and trailing blank.

Restriction: The PR format element can appear only in the last position of a number format model.  
 
RN

rn  
 RN

rn  
 Returns a value as Roman numerals in uppercase.

Returns a value as Roman numerals in lowercase.

Value can be an integer between 1 and 3999.  
 
S  
 S9999


9999S  
 Returns negative value with a leading minus sign (-).

Returns positive value with a leading plus sign (+).

Returns negative value with a trailing minus sign (-).

Returns positive value with a trailing plus sign (+).

Restriction: The S format element can appear only in the first or last position of a number format model.  
 
TM  
 TM  
 "Text minimum". Returns (in decimal output) the smallest number of characters possible. This element is case-insensitive.

The default is TM9, which returns the number in fixed notation unless the output exceeds 64 characters. If output exceeds 64 characters, Oracle automatically returns the number in scientific notation.

Restrictions:

You cannot precede this element with any other element.

You can follow this element only with 9 or E (only one) or e (only one).

 
U  
 U9999  
 Returns in the specified position the "Euro" (or other) dual currency symbol (the current value of the NLS_DUAL_CURRENCY parameter).  
 
V  
 999V99  
 Returns a value multiplied by 10n (and if necessary, round it up), where n is the number of 9's after the "V".  
 
X  
 XXXX

xxxx  
 Returns the hexadecimal value of the specified number of digits. If the specified number is not an integer, Oracle rounds it to an integer.

Restrictions:

This element accepts only positive values or 0. Negative values return an error.

You can precede this element only with 0 (which returns leading zeroes) or FM. Any other elements return an error. If you specify neither 0 nor FM with X, the return always has 1 leading blank.

 
 

The values of some formats are determined by the value of initialization parameters. For such formats, you can specify the characters returned by these format elements implicitly using the initialization parameter NLS_TERRITORY. For information on these parameters, see Oracle8i Reference and Oracle8i National Language Support Guide.

You can change the default date format for your session with the ALTER SESSION statement. For information on changing the settings of these parameters, see "ALTER SESSION".

Example
Table 2-8 shows the results of the following query for different values of number and 'fmt':

SELECT TO_CHAR(number, 'fmt')
  FROM DUAL;

Table 2-8 Results of Example Number Conversions
number  'fmt'  Result  
-1234567890  
 9999999999S  
 '1234567890-'  
 
0  
 99.99  
 ' .00'  
 
+0.1  
 99.99  
 ' 0.10'  
 
-0.2  
 99.99  
 ' -.20'  
 
0  
 90.99  
 ' 0.00'  
 
+0.1  
 90.99  
 ' 0.10'  
 
-0.2  
 90.99  
 ' -0.20'  
 
0  
 9999  
 ' 0'  
 
1  
 9999  
 ' 1'  
 
0  
 B9999  
 ' '  
 
1  
 B9999  
 ' 1'  
 
0  
 B90.99  
 ' '  
 
+123.456  
 999.999  
 ' 123.456'  
 
-123.456  
 999.999  
 '-123.456'  
 
+123.456  
 FM999.009  
 '123.456'  
 
+123.456  
 9.9EEEE  
 ' 1.2E+02'  
 
+1E+123  
 9.9EEEE  
 ' 1.0E+123'  
 
+123.456  
 FM9.9EEEE  
 '1.23E+02'  
 
+123.45  
 FM999.009  
 '123.45'  
 
+123.0  
 FM999.009  
 '123.00'  
 
+123.45  
 L999.99  
 ' $123.45'  
 
+123.45  
 FML99.99  
 '$123.45'  
 
+1234567890  
 9999999999S  
 '1234567890+'  
 
 

Date Format Models
You can use date format models:

In the TO_CHAR function to translate a DATE value that is in a format other than the default date format

In the TO_DATE function to translate a character value that is in a format other than the default date format

Default Date Format
The default date format is specified either explicitly with the initialization parameter NLS_DATE_FORMAT or implicitly with the initialization parameter NLS_TERRITORY. For information on these parameters, see Oracle8i Reference.

You can change the default date format for your session with the ALTER SESSION statement. For information, see "ALTER SESSION".

Maximum Length
The total length of a date format model cannot exceed 22 characters.

Date Format Elements
A date format model is composed of one or more date format elements as listed in Table 2-9.

For input format models, format items cannot appear twice, and format items that represent similar information cannot be combined. For example, you cannot use 'SYYYY' and 'BC' in the same format string.

Some of the date format elements cannot be used in the TO_DATE function, as noted in Table 2-9.

Capitalization of Date Format Elements
Capitalization in a spelled-out word, abbreviation, or Roman numeral follows capitalization in the corresponding format element. For example, the date format model 'DAY' produces capitalized words like 'MONDAY'; 'Day' produces 'Monday'; and 'day' produces 'monday'.

Punctuation and Character Literals in Date Format Models
You can also include these characters in a date format model:

punctuation such as hyphens, slashes, commas, periods, and colons

character literals, enclosed in double quotation marks

These characters appear in the return value in the same location as they appear in the format model.

Table 2-9 Date Format Elements
Element
 Specify in TO_DATE?
 Meaning
 
-
/
,
..
;
:
'text'

  Yes  
 Punctuation and quoted text is reproduced in the result.  
 
AD
A.D.

  Yes  
 AD indicator with or without periods.  
 
AM
A.M.

  Yes  
 Meridian indicator with or without periods.  
 
BC
B.C.

  Yes  
 BC indicator with or without periods.  
 
CC
SCC

  No  
 One greater than the first two digits of a four-digit year; "S" prefixes BC dates with "-". For example, '20' from '1900'.  
 
D

  Yes  
 Day of week (1-7).  
 
DAY

  Yes  
 Name of day, padded with blanks to length of 9 characters.  
 
DD

  Yes  
 Day of month (1-31).  
 
DDD

  Yes  
 Day of year (1-366).  
 
DY

  Yes  
 Abbreviated name of day.  
 
E

  Yes  
 Abbreviated era name (Japanese Imperial, ROC Official, and Thai Buddha calendars).  
 
EE

  Yes  
 Full era name (Japanese Imperial, ROC Official, and Thai Buddha calendars).  
 
HH

  Yes  
 Hour of day (1-12).  
 
HH12

  Yes  
 Hour of day (1-12).  
 
HH24

  Yes  
 Hour of day (0-23).  
 
IW

  No  
 Week of year (1-52 or 1-53) based on the ISO standard.  
 
IYY
IY
I

  No  
 Last 3, 2, or 1 digit(s) of ISO year.  
 
IYYY

  No  
 4-digit year based on the ISO standard.  
 
J

  Yes  
 Julian day; the number of days since January 1, 4712 BC. Number specified with 'J' must be integers.  
 
MI

  Yes  
 Minute (0-59).  
 
MM

  Yes  
 Two-digit numeric abbreviation of month (01-12; JAN = 01)  
 
MON

  Yes  
 Abbreviated name of month.  
 
MONTH

  Yes  
 Name of month, padded with blanks to length of 9 characters.  
 
PM
P.M.

  No  
 Meridian indicator with or without periods.  
 
Q

  No  
 Quarter of year (1, 2, 3, 4; JAN-MAR = 1)  
 
RM

  Yes  
 Roman numeral month (I-XII; JAN = I).  
 
RR

  Yes  
 Given a year with 2 digits:

Returns a year in the next century if the year is <50 and the last 2 digits of the current year are >=50.

Returns a year in the preceding century if the year is >=50 and the last 2 digits of the current year are <50.

 
RRRR

  Yes  
 Round year. Accepts either 4-digit or 2-digit input. If 2-digit, provides the same return as RR. If you don't want this functionality, enter the 4-digit year.  
 
SS

  Yes  
 Second (0-59).  
 
SSSSS

  Yes  
 Seconds past midnight (0-86399).  
 
WW

  No  
 Week of year (1-53) where week 1 starts on the first day of the year and continues to the seventh day of the year.  
 
W

  No  
 Week of month (1-5) where week 1 starts on the first day of the month and ends on the seventh.  
 
Y,YYY

  Yes  
 Year with comma in this position.  
 
YEAR
SYEAR

  No  
 Year, spelled out. "S" prefixes BC dates with "-".  
 
YYYY
SYYYY

  Yes  
 4-digit year. "S" prefixes BC dates with "-".  
 
YYY
YY
Y

  Yes  
 Last 3, 2, or 1 digit(s) of year.  
 
 

Oracle returns an error if an alphanumeric character is found in the date string where punctuation character is found in the format string. For example:

TO_CHAR (TO_DATE('0297','MM/YY'), 'MM/YY')


returns an error.

Date Format Elements and National Language Support
The functionality of some date format elements depends on the country and language in which you are using Oracle. For example, these date format elements return spelled values:

MONTH

MON

DAY

DY

BC or AD or B.C. or A.D.

AM or PM or A.M or P.M.

The language in which these values are returned is specified either explicitly with the initialization parameter NLS_DATE_LANGUAGE or implicitly with the initialization parameter NLS_LANGUAGE. The values returned by the YEAR and SYEAR date format elements are always in English.

The date format element D returns the number of the day of the week (1-7). The day of the week that is numbered 1 is specified implicitly by the initialization parameter NLS_TERRITORY.

For information on national language support initialization parameters, see Oracle8i Reference and Oracle8i National Language Support Guide.

ISO Standard Date Format Elements
Oracle calculates the values returned by the date format elements IYYY, IYY, IY, I, and IW according to the ISO standard. For information on the differences between these values and those returned by the date format elements YYYY, YYY, YY, Y, and WW, see the discussion of national language support in Oracle8i National Language Support Guide.

The RR Date Format Element
The RR date format element is similar to the YY date format element, but it provides additional flexibility for storing date values in other centuries. The RR date format element allows you to store 21st century dates in the 20th century by specifying only the last two digits of the year. It will also allow you to store 20th century dates in the 21st century in the same way if necessary.

If you use the TO_DATE function with the YY date format element, the date value returned is always in the current century. If you use the RR date format element instead, the century of the return value varies according to the specified two-digit year and the last two digits of the current year. Table 2-10 summarizes the behavior of the RR date format element.

Table 2-10 The RR Date Element Format
  If the specified two-digit year is  
 
 
 0 - 49  
 50 - 99  
 
If the last two digits of the current year are:  
 0-49  
 The return date is in the current century.  
 The return date is in the preceding century.  
 
50-99  
 The return date is in the next century.  
 The return date is in the current century.  
 
 

The following examples demonstrate the behavior of the RR date format element.

Example 1
Assume these queries are issued between 1950 and 1999:

SELECT TO_CHAR(TO_DATE('27-OCT-98', 'DD-MON-RR') ,'YYYY') "Year"
     FROM DUAL;

Year
----
1998

SELECT TO_CHAR(TO_DATE('27-OCT-17', 'DD-MON-RR') ,'YYYY') "Year";
     FROM DUAL;

Year
----
2017

Example 2
Assume these queries are issued between 2000 and 2049:

SELECT TO_CHAR(TO_DATE('27-OCT-98', 'DD-MON-RR') ,'YYYY') "Year";
  FROM DUAL;

Year
----
1998

SELECT TO_CHAR(TO_DATE('27-OCT-17', 'DD-MON-RR') ,'YYYY') "Year";
     FROM DUAL;

Year
----
2017


Note that the queries return the same values regardless of whether they are issued before or after the year 2000. The RR date format element allows you to write SQL statements that will return the same values after the turn of the century.

Date Format Element Suffixes
Table 2-11 lists suffixes that can be added to date format elements:

Table 2-11 Date Format Element Suffixes
Suffix  Meaning  Example Element  Example Value  
TH  
 Ordinal Number  
 DDTH  
 4TH  
 
SP  
 Spelled Number  
 DDSP  
 FOUR  
 
SPTH or THSP  
 Spelled, ordinal number  
 DDSPTH  
 FOURTH  
 
Restrictions:

When you add one of these suffixes to a date format element, the return value is always in English.

Date suffixes are valid only on output. You cannot use them to insert a date into the database.

 
 

Format Model Modifiers
The FM and FX modifiers, used in format models in the TO_CHAR function, control blank padding and exact format checking.

A modifier can appear in a format model more than once. In such a case, each subsequent occurrence toggles the effects of the modifier. Its effects are enabled for the portion of the model following its first occurrence, and then disabled for the portion following its second, and then reenabled for the portion following its third, and so on.

FM
"Fill mode". This modifier suppresses blank padding in the return value of the TO_CHAR function:

In a date format element of a TO_CHAR function, this modifier suppresses blanks in subsequent character elements (such as MONTH) and suppresses leading zeroes for subsequent number elements (such as MI) in a date format model. Without FM, the result of a character element is always right padded with blanks to a fixed length, and leading zeroes are always returned for a number element. With FM, because there is no blank padding, the length of the return value may vary.

In a number format element of a TO_CHAR function, this modifier suppresses blanks added to the left of the number, so that the result is left-justified in the output buffer. Without FM, the result is always right-justified in the buffer, resulting in blank-padding to the left of the number.

FX
"Format exact". This modifier specifies exact matching for the character argument and date format model of a TO_DATE function:

Punctuation and quoted text in the character argument must exactly match (except for case) the corresponding parts of the format model.

The character argument cannot have extra blanks. Without FX, Oracle ignores extra blanks.

Numeric data in the character argument must have the same number of digits as the corresponding element in the format model. Without FX, numbers in the character argument can omit leading zeroes.

When FX is enabled, you can disable this check for leading zeroes by using the FM modifier as well.

If any portion of the character argument violates any of these conditions, Oracle returns an error message.

Example 1
The following statement uses a date format model to return a character expression:

SELECT TO_CHAR(SYSDATE, 'fmDDTH')||' of '||TO_CHAR
   (SYSDATE, 'Month')||', '||TO_CHAR(SYSDATE, 'YYYY') "Ides"
    FROM DUAL;

Ides
------------------
3RD of April, 1998


Note that the statement above also uses the FM modifier. If FM is omitted, the month is blank-padded to nine characters:

SELECT TO_CHAR(SYSDATE, 'DDTH')||' of '||
   TO_CHAR(Month, YYYY') "Ides"
   FROM DUAL;

Ides
-----------------------
03RD of April    , 1998

Example 2
The following statement places a single quotation mark in the return value by using a date format model that includes two consecutive single quotation marks:

SELECT TO_CHAR(SYSDATE, 'fmDay')||'''s Special') "Menu"
     FROM DUAL;

Menu
-----------------
Tuesday's Special


Two consecutive single quotation marks can be used for the same purpose within a character literal in a format model.

Example 3
Table 2-12 shows whether the following statement meets the matching conditions for different values of char and 'fmt' using FX:

UPDATE table
  SET date_column = TO_DATE(char, 'fmt');

Table 2-12 Matching Character Data and Format Models with the FX Format Model Modifier
char
 'fmt'
 Match or Error?
 
'15/ JAN /1998'  
 'DD-MON-YYYY'  
 Match  
 
' 15! JAN % /1998'  
 'DD-MON-YYYY'  
 Error  
 
'15/JAN/1998'  
 'FXDD-MON-YYYY'  
 Error  
 
'15-JAN-1998'  
 'FXDD-MON-YYYY'  
 Match  
 
'1-JAN-1998'  
 'FXDD-MON-YYYY'  
 Error  
 
'01-JAN-1998'  
 'FXDD-MON-YYYY'  
 Match  
 
'1-JAN-1998'  
 'FXFMDD-MON-YYYY'  
 Match  
 
 

String-to-Date Conversion Rules
The following additional formatting rules apply when converting string values to date values (unless you have used the FX or FXFM modifiers in the format model to control exact format checking):

You can omit punctuation included in the format string from the date string if all the digits of the numerical format elements, including leading zeros, are specified. In other words, specify 02 and not 2 for two-digit format elements such as MM, DD, and YY.

You can omit time fields found at the end of a format string from the date string.

If a match fails between a date format element and the corresponding characters in the date string, Oracle attempts alternative format elements, as shown in Table 2-13.

Table 2-13 Oracle Format Matching
Original Format Element  Additional Format Elements to Try in Place of the Original  
'MM'

  'MON' and 'MONTH'

 
'MON  
 'MONTH'  
 
'MONTH'  
 'MON'  
 
'YY'  
 'YYYY'  
 
'RR'  
 'RRRR'  
 
 

Nulls
If a column in a row has no value, then the column is said to be null, or to contain a null. Nulls can appear in columns of any datatype that are not restricted by NOT NULL or PRIMARY KEY integrity constraints. Use a null when the actual value is not known or when a value would not be meaningful.

Do not use null to represent a value of zero, because they are not equivalent. (Oracle currently treats a character value with a length of zero as null. However, this may not continue to be true in future releases, and Oracle recommends that you do not treat empty strings the same as NULLs.) Any arithmetic expression containing a null always evaluates to null. For example, null added to 10 is null. In fact, all operators (except concatenation) return null when given a null operand.

Nulls in SQL Functions
All scalar functions (except NVL and TRANSLATE) return null when given a null argument. You can use the NVL function to return a value when a null occurs. For example, the expression NVL(COMM,0) returns 0 if COMM is null or the value of COMM if it is not null.

Most aggregate functions ignore nulls. For example, consider a query that averages the five values 1000, null, null, null, and 2000. Such a query ignores the nulls and calculates the average to be (1000+2000)/2 = 1500.

Nulls with Comparison Operators
To test for nulls, use only the comparison operators IS NULL and IS NOT NULL. If you use any other operator with nulls and the result depends on the value of the null, the result is UNKNOWN. Because null represents a lack of data, a null cannot be equal or unequal to any value or to another null. However, Oracle considers two nulls to be equal when evaluating a DECODE expression. For syntax and additional information, see "DECODE Expressions".

Oracle also considers two nulls to be equal if they appear in compound keys. That is, Oracle considers identical two compound keys containing nulls if all the non-null components of the keys are equal.

Nulls in Conditions
A condition that evaluates to UNKNOWN acts almost like FALSE. For example, a SELECT statement with a condition in the WHERE clause that evaluates to UNKNOWN returns no rows. However, a condition evaluating to UNKNOWN differs from FALSE in that further operations on an UNKNOWN condition evaluation will evaluate to UNKNOWN. Thus, NOT FALSE evaluates to TRUE, but NOT UNKNOWN evaluates to UNKNOWN.

Table 2-14 shows examples of various evaluations involving nulls in conditions. If the conditions evaluating to UNKNOWN were used in a WHERE clause of a SELECT statement, then no rows would be returned for that query.

Table 2-14 Conditions Containing Nulls
If A is:  Condition  Evaluates to:  
10  
 a IS NULL  
 FALSE  
 
10  
 a IS NOT NULL  
 TRUE  
 
NULL  
 a IS NULL  
 TRUE  
 
NULL  
 a IS NOT NULL  
 FALSE  
 
10  
 a = NULL  
 UNKNOWN  
 
10  
 a != NULL  
 UNKNOWN  
 
NULL  
 a = NULL  
 UNKNOWN  
 
NULL  
 a != NULL  
 UNKNOWN  
 
NULL  
 a = 10  
 UNKNOWN  
 
NULL  
 a != 10  
 UNKNOWN  
 
 

For the truth tables showing the results of logical expressions containing nulls, see Table 3-6, as well as Table 3-7 and Table 3-8.

Pseudocolumns
A pseudocolumn behaves like a table column, but is not actually stored in the table. You can select from pseudocolumns, but you cannot insert, update, or delete their values. This section describes these pseudocolumns:

CURRVAL and NEXTVAL

LEVEL

ROWID

ROWNUM

CURRVAL and NEXTVAL
A sequence is a schema object that can generate unique sequential values. These values are often used for primary and unique keys. You can refer to sequence values in SQL statements with these pseudocolumns:

CURRVAL  
 returns the current value of a sequence.  
 
NEXTVAL  
 increments the sequence and returns the next value.  
 
 


You must qualify CURRVAL and NEXTVAL with the name of the sequence:

sequence.CURRVAL
sequence.NEXTVAL


To refer to the current or next value of a sequence in the schema of another user, you must have been granted either SELECT object privilege on the sequence or SELECT ANY SEQUENCE system privilege, and you must qualify the sequence with the schema containing it:

schema.sequence.CURRVAL
schema.sequence.NEXTVAL


To refer to the value of a sequence on a remote database, you must qualify the sequence with a complete or partial name of a database link:

schema.sequence.CURRVAL@dblink
schema.sequence.NEXTVAL@dblink


For more information on referring to database links, see "Referring to Objects in Remote Databases".

Where to Use Sequence Values
You can use CURRVAL and NEXTVAL in:

The SELECT list of a SELECT statement that is not contained in a subquery, snapshot, or view

The SELECT list of a subquery in an INSERT statement

The VALUES clause of an INSERT statement

The SET clause of an UPDATE statement

You cannot use CURRVAL and NEXTVAL:

A subquery in a DELETE, SELECT, or UPDATE statement

A view's query or snapshot's query

A SELECT statement with the DISTINCT operator

A SELECT statement with a GROUP BY clause or ORDER BY clause

A SELECT statement that is combined with another SELECT statement with the UNION, INTERSECT, or MINUS set operator

The WHERE clause of a SELECT statement

DEFAULT value of a column in a CREATE TABLE or ALTER TABLE statement

The condition of a CHECK constraint

Also, within a single SQL statement that uses CURVAL or NEXTVAL, all referenced LONG columns, updated tables, and locked tables must be located on the same database.

How to Use Sequence Values
When you create a sequence, you can define its initial value and the increment between its values. The first reference to NEXTVAL returns the sequence's initial value. Subsequent references to NEXTVAL increment the sequence value by the defined increment and return the new value. Any reference to CURRVAL always returns the sequence's current value, which is the value returned by the last reference to NEXTVAL. Note that before you use CURRVAL for a sequence in your session, you must first initialize the sequence with NEXTVAL.

Within a single SQL statement, Oracle will increment the sequence only once. If a statement contains more than one reference to NEXTVAL for a sequence, Oracle increments the sequence once and returns the same value for all occurrences of NEXTVAL. If a statement contains references to both CURRVAL and NEXTVAL, Oracle increments the sequence and returns the same value for both CURRVAL and NEXTVAL regardless of their order within the statement.

A sequence can be accessed by many users concurrently with no waiting or locking. For information on sequences, see "CREATE SEQUENCE".

Example 1
This example selects the current value of the employee sequence:

SELECT empseq.currval
    FROM DUAL;

Example 2
This example increments the employee sequence and uses its value for a new employee inserted into the employee table:

INSERT INTO emp
    VALUES (empseq.nextval, 'LEWIS', 'CLERK',
             7902, SYSDATE, 1200, NULL, 20);

Example 3
This example adds a new order with the next order number to the master order table. It then adds suborders with this number to the detail order table:

INSERT INTO master_order(orderno, customer, orderdate)
    VALUES (orderseq.nextval, 'Al''s Auto Shop', SYSDATE);

INSERT INTO detail_order (orderno, part, quantity)
    VALUES (orderseq.currval, 'SPARKPLUG', 4);

INSERT INTO detail_order (orderno, part, quantity)
    VALUES (orderseq.currval, 'FUEL PUMP', 1);

INSERT INTO detail_order (orderno, part, quantity)
    VALUES (orderseq.currval, 'TAILPIPE', 2);


LEVEL
For each row returned by a hierarchical query, the LEVEL pseudocolumn returns 1 for a root node, 2 for a child of a root, and so on. A root node is the highest node within an inverted tree. A child node is any nonroot node. A parent node is any node that has children. A leaf node is any node without children. Figure 2-2 shows the nodes of an inverted tree with their LEVEL values.

Figure 2-2 Hierarchical Tree

 
To define a hierarchical relationship in a query, you must use the START WITH and CONNECT BY clauses. For more information on using the LEVEL pseudocolumn, see "SELECT and Subqueries".

ROWID
For each row in the database, the ROWID pseudocolumn returns a row's address. Oracle8i rowid values contain information necessary to locate a row:

the data object number of the object

which data block in the datafile

which row in the data block (first row is 0)

which datafile (first file is 1). The file number is relative to the tablespace.

Usually, a rowid value uniquely identifies a row in the database. However, rows in different tables that are stored together in the same cluster can have the same rowid.

Values of the ROWID pseudocolumn have the datatype ROWID or UROWID. For more information, see "ROWID Datatype" and "UROWID Datatype".

Rowid values have several important uses:

They are the fastest way to access a single row.

They can show you how a table's rows are stored.

They are unique identifiers for rows in a table.

You should not use ROWID as a table's primary key. If you delete and reinsert a row with the Import and Export utilities, for example, its rowid may change. If you delete a row, Oracle may reassign its rowid to a new row inserted later.

Although you can use the ROWID pseudocolumn in the SELECT and WHERE clause of a query, these pseudocolumn values are not actually stored in the database. You cannot insert, update, or delete a value of the ROWID pseudocolumn.

Example
This statement selects the address of all rows that contain data for employees in department 20:

SELECT ROWID, ename  
   FROM emp
   WHERE deptno = 20;
 
ROWID              ENAME
------------------ ----------
AAAAqYAABAAAEPvAAA SMITH
AAAAqYAABAAAEPvAAD JONES
AAAAqYAABAAAEPvAAH SCOTT
AAAAqYAABAAAEPvAAK ADAMS
AAAAqYAABAAAEPvAAM FORD

ROWNUM
For each row returned by a query, the ROWNUM pseudocolumn returns a number indicating the order in which Oracle selects the row from a table or set of joined rows. The first row selected has a ROWNUM of 1, the second has 2, and so on.

You can use ROWNUM to limit the number of rows returned by a query, as in this example:

SELECT * FROM emp WHERE ROWNUM < 10;


If an ORDER BY clause follows ROWNUM in the same subquery, the rows will be reordered by the ORDER BY clause. The results can vary depending on the way the rows are accessed. For example, if the ORDER BY clause causes Oracle to use an index to access the data, Oracle may retrieve the rows in a different order than without the index. Therefore, the following statement will not have the same effect as the preceding example:

SELECT * FROM emp WHERE ROWNUM < 11 ORDER BY empno;

If you embed the ORDER BY clause in a subquery and place the ROWNUM condition in the top-level query, you can force the ROWNUM condition to be applied after the ordering of the rows. For example, the following query returns the 10 smallest employee numbers. This is sometimes referred to as a "top-N query":

SELECT * FROM
   (SELECT empno FROM emp ORDER BY empno)
   WHERE ROWNUM < 11;


In the preceding example, the ROWNUM values are those of the top-level SELECT statement, so they are generated after the rows have already been ordered by EMPNO in the subquery. For more information about top-N queries, see Oracle8i Application Developer's Guide - Fundamentals.

Conditions testing for ROWNUM values greater than a positive integer are always false. For example, this query returns no rows:

SELECT * FROM emp
    WHERE ROWNUM > 1;


The first row fetched is assigned a ROWNUM of 1 and makes the condition false. The second row to be fetched is now the first row and is also assigned a ROWNUM of 1 and makes the condition false. All rows subsequently fail to satisfy the condition, so no rows are returned.

You can also use ROWNUM to assign unique values to each row of a table, as in this example:

UPDATE tabx
    SET col1 = ROWNUM;


--------------------------------------------------------------------------------
Note:
Using ROWNUM in a query can affect view optimization. For more information, see Oracle8i Concepts.  

--------------------------------------------------------------------------------
 
 


Comments
You can associate comments with SQL statements and schema objects.

Comments Within SQL Statements
Comments within SQL statements do not affect the statement execution, but they may make your application easier for you to read and maintain. You may want to include a comment in a statement that describes the statement's purpose within your application.

A comment can appear between any keywords, parameters, or punctuation marks in a statement. You can include a comment in a statement using either of these means:

Begin the comment with a slash and an asterisk (/*). Proceed with the text of the comment. This text can span multiple lines. End the comment with an asterisk and a slash (*/). The opening and terminating characters need not be separated from the text by a space or a line break.

Begin the comment with -- (two hyphens). Proceed with the text of the comment. This text cannot extend to a new line. End the comment with a line break.

A SQL statement can contain multiple comments of both styles. The text of a comment can contain any printable characters in your database character set.


--------------------------------------------------------------------------------
Note:
You cannot use these styles of comments between SQL statements in a SQL script. Use the SQL*Plus REMARK command for this purpose. For information on these statements, see SQL*Plus User's Guide and Reference.  

--------------------------------------------------------------------------------
 
 


Example
These statements contain many comments:

SELECT ename, sal + NVL(comm, 0), job, loc
/* Select all employees whose compensation is
greater than that of Jones.*/
  FROM emp, dept
       /*The DEPT table is used to get the department name.*/
  WHERE emp.deptno = dept.deptno
    AND sal + NVL(comm,0) >   /* Subquery:       */
   (SELECT sal + NLV(comm,0)
                              /* total compensation is sal + comm */
      FROM emp
      WHERE ename = 'JONES');

SELECT ename,                    -- select the name
    sal + NVL(comm, 0),          -- total compensation
    job,                         -- job
    loc                          -- and city containing the office
  FROM emp,                      -- of all employees
       dept
  WHERE emp.deptno = dept.deptno
    AND sal + NVL(comm, 0) >     -- whose compensation
                                 -- is greater than
      (SELECT sal + NVL(comm,0)  -- the compensation
    FROM emp
    WHERE ename = 'JONES');       -- of Jones.


Comments on Schema Objects
You can associate a comment with a table, view, snapshot, or column using the COMMENT command described in Chapter 7, "SQL Statements". Comments associated with schema objects are stored in the data dictionary.

Hints
You can use comments in a SQL statement to pass instructions, or hints, to the Oracle optimizer. The optimizer uses these hints as suggestions for choosing an execution plan for the statement.

A statement block can have only one comment containing hints, and that comment must follow the SELECT, UPDATE, INSERT, or DELETE keyword. The syntax below shows hints contained in both styles of comments that Oracle supports within a statement block.

{DELETE|INSERT|SELECT|UPDATE} /*+ hint [text] [hint[text]]... */


or

{DELETE|INSERT|SELECT|UPDATE} --+ hint [text] [hint[text]]...


where

DELETE

INSERT

SELECT

UPDATE  
 is a DELETE, INSERT, SELECT, or UPDATE keyword that begins a statement block. Comments containing hints can appear only after these keywords.  
 
+  
 is a plus sign that causes Oracle to interpret the comment as a list of hints. The plus sign must follow immediately after the comment delimiter (no space is permitted).  
 
hint  
 is one of the hints discussed in this section and in Oracle8i Tuning. The space between the plus sign and the hint is optional. If the comment contains multiple hints, separate the hints by at least one space.  
 
text  
 is other commenting text that can be interspersed with the hints.  
 
 


Table 2-15 lists hint syntax and descriptions. For more information on hints, see Oracle8i Tuning and Oracle8i Concepts.

Table 2-15 Hint Syntax and Descriptions
Hint Syntax  Description  
Optimization Approaches and Goals    
 
/*+ ALL_ROWS */  
 Explicitly chooses the cost-based approach to optimize a statement block with a goal of best throughput (that is, minimum total resource consumption).  
 
/*+ CHOOSE */  
 Causes the optimizer to choose between the rule-based approach and the cost-based approach for a SQL statement based on the presence of statistics for the tables accessed by the statement.  
 
/*+ FIRST_ROWS */  
 Explicitly chooses the cost-based approach to optimize a statement block with a goal of best response time (minimum resource usage to return first row).  
 
/*+ RULE */  
 Explicitly chooses rule-based optimization for a statement block.  
 
Access Methods    
/*+ AND_EQUAL(table index) */  
 Explicitly chooses an execution plan that uses an access path that merges the scans on several single-column indexes.  
 
/*+ CLUSTER(table) */  
 Explicitly chooses a cluster scan to access the specified table.  
 
/*+ FULL(table) */  
 Explicitly chooses a full table scan for the specified table.  
 
/*+ HASH(table) */  
 Explicitly chooses a hash scan to access the specified table.  
 
/*+ HASH_AJ(table) */  
 Transforms a NOT IN subquery into a hash anti-join to access the specified table.  
 
/*+ HASH_SJ(table) */  
 Transforms a NOT IN subquery into a hash semi-join to access the specified table.  
 
/*+ INDEX(table index) */  
 Explicitly chooses an index scan for the specified table.  
 
/*+ INDEX_ASC(table index) */  
 Explicitly chooses an ascending-range index scan for the specified table.  
 
/*+ INDEX_COMBINE(table index) */  
 If no indexes are given as arguments for the INDEX_COMBINE hint, the optimizer uses whatever Boolean combination of bitmap indexes has the best cost estimate. If particular indexes are given as arguments, the optimizer tries to use some Boolean combination of those particular bitmap indexes.  
 
/*+ INDEX_DESC(table index) */  
 Explicitly chooses a descending-range index scan for the specified table.  
 
/*+ INDEX_FFS(table index) */  
 Causes a fast full index scan to be performed rather than a full table scan.  
 
/*+ MERGE_AJ(table) */  
 Transforms a NOT IN subquery into a merge anti-join to access the specified table.  
 
/*+ MERGE_SJ(table) */  
 Transforms a correlated EXISTS subquery into a merge semi-join to access the specified table.  
 
/*+ NO_EXPAND */  
 Prevents the optimizer from considering OR expansion for queries having OR or IN conditions in the WHERE clause.  
 
/*+ NO_INDEX(table index) */  
 Instructs the optimizer not to consider a scan on the specified index or indexes. If no indexes are specified, the optimizer does not consider a scan on any index defined on the table.  
 
/*+ NOREWRITE */  
 Disables query rewrite for the query block, overriding a TRUE setting of the QUERY_REWRITE_ENABLED parameter.  
 
/*+ ORDERED_PREDICATES */  
 Forces the optimizer to preserve the order of predicate evaluation (except predicates used in index keys), as specified in the WHERE clause of SELECT statements.  
 
/*+ REWRITE (view [,...]) */  
 Enforces query rewrite. If you specify a view list and the list contains an eligible materialized view, Oracle will use that view regardless of the cost. No views outside of the list are considered. If you do not specify a view list, Oracle will search for an eligible materialized view and always use it regardless of the cost.  
 
/*+ ROWID(table) */  
 Explicitly chooses a table scan by rowid for the specified table.  
 
/*+ USE_CONCAT */  
 Forces combined OR conditions in the WHERE clause of a query to be transformed into a compound query using the UNION ALL set operator.  
 
Join Orders    
 
/*+ ORDERED */  
 Causes Oracle to join tables in the order in which they appear in the FROM clause.  
 
/*+ STAR */  
 Forces the large table to be joined last using a nested-loops join on the index.  
 
Join Operations    
 
/*+ DRIVING_SITE(table) */  
 Forces query execution to be done at a different site from that selected by Oracle.  
 
/*+ USE_HASH(table) */  
 Causes Oracle to join each specified table with another row source with a hash join.  
 
/*+ USE_MERGE(table) */  
 Causes Oracle to join each specified table with another row source with a sort-merge join.  
 
/*+ USE_NL(table) */  
 Causes Oracle to join each specified table to another row source with a nested-loops join using the specified table as the inner table.  
 
Parallel Execution    
 
Note: Oracle ignores parallel hints on a temporary table. For more information on temporary tables, see "CREATE TABLE" and Oracle8i Concepts.

 
/*+ APPEND */

/*+ NOAPPEND */  
 Specifies that data is simply appended (or not) to a table; existing free space is not used. Use these hints only following the INSERT keyword.  
 
/*+ NOPARALLEL(table) */  
 Disables parallel scanning of a table, even if the table was created with a PARALLEL clause.

Restriction: You cannot parallelize a query involving a nested table.  
 
/*+ PARALLEL(table)

/*+ PARALLEL(table, integer) */  
 Lets you specify parallel execution of DML and queries on the table; integer specifies the desired degree of parallelism, which is the number of parallel threads that can be used for the operation. Each parallel thread may use one or two parallel execution servers. If you do not specify integer, Oracle computes a value using the PARALLEL_THREADS_PER_CPU parameter. If no parallel hint is specified, Oracle uses the existing degree of parallelism for the table.

DELETE, INSERT, and UPDATE operations are considered for parallelization only if the session is in a PARALLEL DML enabled mode. (Use ALTER SESSION ENABLE PARALLEL DML to enter this mode.)  
 
/*+ PARALLEL_INDEX  
 Allows you to parallelize fast full index scans for partitioned and nonpartitioned indexes that have the PARALLEL attribute.  
 
/*+ PQ_DISTRIBUTE

(table, outer_distribution, inner_distribution) */  
 Specifies how rows of joined tables should be distributed between producer and consumer query servers. The four possible distribution methods are NONE, HASH, BROADCAST, and PARTITION. However, only a subset of the combinations of outer and inner distributions are valid. For the permitted combinations of distributions for the outer and inner join tables, see Oracle8i Tuning.  
 
/*+ NOPARALLEL_INDEX */  
 Overrides a PARALLEL attribute setting on an index.  
 
Other Hints    
 
/*+ CACHE */  
 Specifies that the blocks retrieved for the table in the hint are placed at the most recently used end of the LRU list in the buffer cache when a full table scan is performed.  
 
/*+ NOCACHE */  
 Specifies that the blocks retrieved for this table are placed at the least recently used end of the LRU list in the buffer cache when a full table scan is performed.  
 
/*+ MERGE(table) */  
 Causes Oracle to evaluate complex views or subqueries before the surrounding query.  
 
/*+ NO_MERGE(table) */  
 Causes Oracle not to merge mergeable views.  
 
/*+ PUSH_JOIN_PRED(table) */  
 Causes the optimizer to evaluate, on a cost basis, whether to push individual join predicates into the view.  
 
/*+ NO_PUSH_JOIN_PRED(table) */  
 Prevents pushing of a join predicate into the view.  
 
/*+ PUSH_SUBQ */  
 Causes nonmerged subqueries to be evaluated at the earliest possible place in the execution plan.  
 
/*+ STAR_TRANSFORMATION */  
 Makes the optimizer use the best plan in which the transformation has been used.  
 
 

Database Objects
Oracle recognizes objects that are associated with a particular schema and objects that are not associated with a particular schema, as described in the sections that follow.

Schema Objects
A schema is a collection of logical structures of data, or schema objects. A schema is owned by a database user and has the same name as that user. Each user owns a single schema. Schema objects can be created and manipulated with SQL and include the following types of objects:

clusters

database links

database triggers

dimensions

external procedure libraries

index-organized tables

indexes

indextypes

materialized views / snapshots

materialized view logs / snapshot logs

object tables

object types

object views

operators

packages

sequences

stored functions

stored procedures

synonyms

tables

views

Nonschema Objects
Other types of objects are also stored in the database and can be created and manipulated with SQL but are not contained in a schema:

contexts

directories

profiles

roles

rollback segments

tablespaces

users

In this reference, each type of object is briefly defined in Chapter 7, "SQL Statements", in the section describing the statement that creates the database object. These statements begin with the keyword CREATE. For example, for the definition of a cluster, see "CREATE CLUSTER". For an overview of database objects, see Oracle8i Concepts.

You must provide names for most types of schema objects when you create them. These names must follow the rules listed in the following sections.

Parts of Schema Objects
Some schema objects are made up of parts that you can or must name, such as:

columns in a table or view

index and table partitions and subpartitions

integrity constraints on a table

packaged procedures, packaged stored functions, and other objects stored within a package

Partitioned Tables and Indexes
Tables and indexes can be partitioned. When partitioned, these schema objects consist of a number of parts called partitions, all of which have the same logical attributes. For example, all partitions in a table share the same column and constraint definitions, and all partitions in an index share the same index columns.

When you partition a table or index using the range method, you specify a maximum value for the partitioning key column(s) for each partition. When you partition a table or index using the hash method, you instruct Oracle to distribute the rows of the table into partitions based on a system-defined hash function on the partitioning key column(s). When you partition a table or index using the composite-partitioning method, you specify ranges for the partitions, and Oracle distributes the rows in each partition into one or more hash subpartitions based on a hash function. Each subpartition of a table or index partitioned using the composite method has the same logical attributes.

Partition-Extended and Subpartition-Extended Table Names
Partition-extended and subpartition-extended table names let you perform some partition-level and subpartition-level operations, such as deleting all rows from a partition or subpartition, on only one partition or subpartition. Without extended table names, such operations would require that you specify a predicate (WHERE clause). For range-partitioned tables, trying to phrase a partition-level operation with a predicate can be cumbersome, especially when the range partitioning key uses more than one column. For hash partitions and subpartitions, using a predicate is more difficult still, because these partitions and subpartitions are based on a system-defined hash function.

Partition-extended table names let you use partitions as if they were tables. An advantage of this method, which is most useful for range-partitioned tables, is that you can build partition-level access control mechanisms by granting (or revoking) privileges on these views to (or from) other users or roles.To use a partition as a table, create a view by selecting data from a single partition, and then use the view as a table.

You can specify partition-extended or subpartition-extended table names for the following DML statements:

DELETE

INSERT

LOCK TABLE

SELECT

UPDATE


--------------------------------------------------------------------------------
Note:
For application portability and ANSI syntax compliance, Oracle strongly recommends that you use views to insulate applications from this Oracle proprietary extension.  

--------------------------------------------------------------------------------
 
 


Syntax
The basic syntax for using partition-extended and subpartition-extended table names is:


 
Restrictions
Currently, the use of partition-extended and subpartition-extended table names has the following restrictions:

No remote tables: A partition-extended or subpartition-extended table name cannot contain a database link (dblink) or a synonym that translates to a table with a dblink. To use remote partitions and subpartitions, create a view at the remote site that uses the extended table name syntax and then refer to the remote view.

No direct PL/SQL support: A SQL statement using the extended table name syntax cannot be used in a PL/SQL block, although it can be used through dynamic SQL by using the DBMS_SQL package. To refer to a partition or subpartition within a PL/SQL block, use views that in turn use the extended table name syntax.

No synonyms: A partition or subpartition extension must be specified with a base table. You cannot use synonyms, views, or any other objects.

Example
In the following statement, SALES is a partitioned table with partition JAN97. You can create a view of the single partition JAN97, and then use it as if it were a table. This example deletes rows from the partition.

CREATE VIEW sales_jan97 AS
     SELECT * FROM sales PARTITION (jan97);
DELETE FROM sales_jan97 WHERE amount < 0;

Schema Object Names and Qualifiers
This section provides:

rules for naming schema objects and schema object location qualifiers

guidelines for naming schema objects and qualifiers

Schema Object Naming Rules
The following rules apply when naming schema objects:

Names must be from 1 to 30 characters long with these exceptions:

Names of databases are limited to 8 characters.

Names of database links can be as long as 128 characters.

Names cannot contain quotation marks.

Names are not case sensitive.

A name must begin with an alphabetic character from your database character set unless surrounded by double quotation marks.

Names can contain only alphanumeric characters from your database character set and the underscore (_), dollar sign ($), and pound sign (#). Oracle strongly discourages you from using $ and #. Names of database links can also contain periods (.) and "at" signs (@).

If your database character set contains multibyte characters, Oracle recommends that each name for a user or a role contain at least one single-byte character.


--------------------------------------------------------------------------------
Note:
You cannot use special characters from European or Asian character sets in a database name, global database name, or database link names. For example, characters with an umlaut are not allowed.  

--------------------------------------------------------------------------------
 
 


A name cannot be an Oracle reserved word. Appendix C, "Oracle Reserved Words", lists all Oracle reserved words.

Depending on the Oracle product you plan to use to access a database object, names might be further restricted by other product-specific reserved words. For a list of a product's reserved words, see the manual for the specific product, such as PL/SQL User's Guide and Reference.

Do not use the word DUAL as a name for an object or part. DUAL is the name of a dummy table.

The Oracle SQL language contains other words that have special meanings. These words include datatypes (see "Datatypes"), function names (see "SQL Functions"), and keywords (the uppercase words in SQL statements, such as DIMENSION, SEGMENT, ALLOCATE, DISABLE, and so forth). These words are not reserved. However, Oracle uses them internally. Therefore, if you use these words as names for objects and object parts, your SQL statements may be more difficult to read and may lead to unpredictable results.

In particular, do not use words beginning with "SYS_" as schema object names, and do not use the names of SQL built-in functions for the names of schema objects or user-defined functions.

Within a namespace, no two objects can have the same name.

Figure 2-3 shows the namespaces for schema objects. Each box is a namespace. Tables and views are in the same namespace. Therefore, a table and a view in the same schema cannot have the same name. However, tables and indexes are in different namespaces. Therefore, a table and an index in the same schema can have the same name.

Each schema in the database has its own namespaces for the objects it contains. This means, for example, that two tables in different schemas are in different namespaces and can have the same name.

Figure 2-3 Namespaces for Schema Objects

 
Figure 2-4 shows the namespaces for nonschema objects. Because the objects in these namespaces are not contained in schemas, these namespaces span the entire database.

Figure 2-4 Namespaces for Nonschema Objects

 
Columns in the same table or view cannot have the same name. However, columns in different tables or views can have the same name.

Procedures or functions contained in the same package can have the same name, provided that their arguments are not of the same number and datatypes. Creating multiple procedures or functions with the same name in the same package with different arguments is called overloading the procedure or function.

A name can be enclosed in double quotation marks. Such names can contain any combination of characters, including spaces, ignoring rules 3 through 7 in this list. This exception is allowed for portability, but Oracle recommends that you do not break rules 3 through 7.

If you give a schema object a name enclosed in double quotation marks, you must use double quotation marks whenever you refer to the object.

Enclosing a name in double quotes allows it to:

Contain spaces

Be case sensitive

Begin with a character other than an alphabetic character, such as a numeric character

Contain characters other than alphanumeric characters and _, $, and #

Be a reserved word

By enclosing names in double quotation marks, you can give the following names to different objects in the same namespace:

emp
"emp"
"Emp"
"EMP "


Note that Oracle interprets the following names the same, so they cannot be used for different objects in the same namespace:

emp
EMP
"EMP"


If you give a user or password a quoted name, the name cannot contain lowercase letters.

Database link names cannot be quoted.

Schema Object Naming Examples
The following examples are valid schema object names:

ename
horse
scott.hiredate
"EVEN THIS & THAT!"
a_very_long_and_valid_name


Although column aliases, table aliases, usernames, and passwords are not objects or parts of objects, they must also follow these naming rules with these exceptions:

Column aliases and table aliases exist only for the execution of a single SQL statement and are not stored in the database, so rule 12 does not apply to them.

Passwords do not have namespaces, so rule 9 does not apply to them.

Do not use quotation marks to make usernames and passwords case sensitive. For additional rules for naming users and passwords, see "CREATE USER".

Schema Object Naming Guidelines
Here are several helpful guidelines for naming objects and their parts:

Use full, descriptive, pronounceable names (or well-known abbreviations).

Use consistent naming rules.

Use the same name to describe the same entity or attribute across tables.

When naming objects, balance the objective of keeping names short and easy to use with the objective of making names as descriptive as possible. When in doubt, choose the more descriptive name, because the objects in the database may be used by many people over a period of time. Your counterpart ten years from now may have difficulty understanding a database with a name like PMDD instead of PAYMENT_DUE_DATE.

Using consistent naming rules helps users understand the part that each table plays in your application. One such rule might be to begin the names of all tables belonging to the FINANCE application with FIN_.

Use the same names to describe the same things across tables. For example, the department number columns of the sample EMP and DEPT tables are both named DEPTNO.

Referring to Schema Objects and Parts
This section tells you how to refer to schema objects and their parts in the context of a SQL statement. This section shows you:

the general syntax for referring to an object

how Oracle resolves a reference to an object

how to refer to objects in schemas other than your own

how to refer to objects in remote databases

The following diagram shows the general syntax for referring to an object or a part:


 
where:

object  
 is the name of the object.  
 
schema  
 is the schema containing the object. The schema qualifier allows you to refer to an object in a schema other than your own. You must be granted privileges to refer to objects in other schemas. If you omit schema, Oracle assumes that you are referring to an object in your own schema.  
 
 
 Only schema objects can be qualified with schema. Schema objects are shown in Figure 2-3. Nonschema objects, shown in Figure 2-4, cannot be qualified with schema because they are not schema objects. (An exception is public synonyms, which can optionally be qualified with "PUBLIC". The quotation marks are required.)  
 
part  
 is a part of the object. This identifier allows you to refer to a part of a schema object, such as a column or a partition of a table. Not all types of objects have parts.  
 
dblink  
 applies only when you are using Oracle's distributed functionality. This is the name of the database containing the object. The dblink qualifier lets you refer to an object in a database other than your local database. If you omit dblink, Oracle assumes that you are referring to an object in your local database. Not all SQL statements allow you to access objects on remote databases.  
 
 


You can include spaces around the periods separating the components of the reference to the object, but it is conventional to omit them.

How Oracle Resolves Schema Object References
When you refer to an object in a SQL statement, Oracle considers the context of the SQL statement and locates the object in the appropriate namespace. After locating the object, Oracle performs the statement's operation on the object. If the named object cannot be found in the appropriate namespace, Oracle returns an error.

The following example illustrates how Oracle resolves references to objects within SQL statements. Consider this statement that adds a row of data to a table identified by the name DEPT:

INSERT INTO dept
   VALUES (50, 'SUPPORT', 'PARIS');


Based on the context of the statement, Oracle determines that DEPT can be:

a table in your own schema

a view in your own schema

a private synonym for a table or view

a public synonym

Oracle always attempts to resolve an object reference within the namespaces in your own schema before considering namespaces outside your schema. In this example, Oracle attempts to resolve the name DEPT as follows:

First, Oracle attempts to locate the object in the namespace in your own schema containing tables, views, and private synonyms. If the object is a private synonym, Oracle locates the object for which the synonym stands. This object could be in your own schema, another schema, or on another database. The object could also be another synonym, in which case Oracle locates the object for which this synonym stands.

If the object is in the namespace, Oracle attempts to perform the statement on the object. In this example, Oracle attempts to add the row of data to DEPT. If the object is not of the correct type for the statement, Oracle returns an error. In this example, DEPT must be a table, view, or a private synonym resolving to a table or view. If DEPT is a sequence, Oracle returns an error.

If the object is not in any namespace searched in thus far, Oracle searches the namespace containing public synonyms (see Figure 2-4). If the object is in that namespace, Oracle attempts to perform the statement on it. If the object is not of the correct type for the statement, Oracle returns an error. In this example, if DEPT is a public synonym for a sequence, Oracle returns an error.

Referring to Objects in Other Schemas
To refer to objects in schemas other than your own, prefix the object name with the schema name:

schema.object


For example, this statement drops the EMP table in the schema SCOTT:

DROP TABLE scott.emp

Referring to Objects in Remote Databases
To refer to objects in databases other than your local database, follow the object name with the name of the database link to that database. A database link is a schema object that causes Oracle to connect to a remote database to access an object there. This section tells you:

How to create database links

How to use database links in your SQL statements

Creating Database Links
You create a database link with the CREATE DATABASE LINK statement described in Chapter 7, "SQL Statements". The statement allows you to specify this information about the database link:

The name of the database link

The database connect string to access the remote database

The username and password to connect to the remote database

Oracle stores this information in the data dictionary.

Database Link Names
When you create a database link, you must specify its name. Database link names are different from names of other types of objects. They can be as long as 128 bytes and can contain periods (.) and the "at" sign (@).

The name that you give to a database link must correspond to the name of the database to which the database link refers and the location of that database in the hierarchy of database names. The following syntax diagram shows the form of the name of a database link:

dblink::=


 
where:

database  
 should specify name portion of the global name of the remote database to which the database link connects. This global name is stored in the data dictionary of the remote database; you can see this name in the GLOBAL_NAME view.  
 
domain  
 should specify the domain portion of the global name of the remote database to which the database link connects. If you omit domain from the name of a database link, Oracle qualifies the database link name with the domain of your local database as it currently exists in the data dictionary.  
 
connect_descriptor  
 allows you to further qualify a database link. Using connect descriptors, you can create multiple database links to the same database. For example, you can use connect descriptors to create multiple database links to different instances of the Oracle Parallel Server that access the same database.  
 
 


The combination database.domain is sometimes called the "service name". For more information, see Net8 Administrator's Guide.

Username and Password
Oracle uses the username and password to connect to the remote database. The username and password for a database link are optional.

Database Connect String
The database connect string is the specification used by Net8 to access the remote database. For information on writing database connect strings, see the Net8 documentation for your specific network protocol. The database string for a database link is optional.

Referring to Database Links
Database links are available only if you are using Oracle's distributed functionality. When you issue a SQL statement that contains a database link, you can specify the database link name in one of these forms:

complete  
 is the complete database link name as stored in the data dictionary, including the database, domain, and optional connect_descriptor components.  
 
partial  
 is the database and optional connect_descriptor components, but not the domain component.  
 
 


Oracle performs these tasks before connecting to the remote database:

If the database link name specified in the statement is partial, Oracle expands the name to contain the domain of the local database as found in the global database name stored in the data dictionary. (You can see the current global database name in the GLOBAL_NAME data dictionary view.)

Oracle first searches for a private database link in your own schema with the same name as the database link in the statement. Then, if necessary, it searches for a public database link with the same name.

Oracle always determines the username and password from the first matching database link (either private or public). If the first matching database link has an associated username and password, Oracle uses it. If it does not have an associated username and password, Oracle uses your current username and password.

If the first matching database link has an associated database string, Oracle uses it. If not, Oracle searches for the next matching (public) database link. If no matching database link is found, or if no matching link has an associated database string, Oracle returns an error.

Oracle uses the database string to access the remote database. After accessing the remote database, if the value of the GLOBAL_NAMES parameter is TRUE, Oracle verifies that the database.domain portion of the database link name matches the complete global name of the remote database. If this condition is true, Oracle proceeds with the connection, using the username and password chosen in Step 2. If not, Oracle returns an error.

If the connection using the database string, username, and password is successful, Oracle attempts to access the specified object on the remote database using the rules for resolving object references and referring to objects in other schemas discussed earlier in this section.

You can disable the requirement that the database.domain portion of the database link name must match the complete global name of the remote database by setting to FALSE the initialization parameter GLOBAL_NAMES or the GLOBAL_NAMES parameter of the ALTER SYSTEM or ALTER SESSION statement.

For more information on remote name resolution, see Oracle8i Distributed Database Systems.

Referencing Object Type Attributes and Methods
To reference object type attributes or methods in a SQL statement, you must fully qualify the reference with a table alias. Consider the following example:

CREATE TYPE person AS OBJECT
   (ssno VARCHAR(20),
    name VARCHAR (10));

CREATE TABLE emptab (pinfo person);


In a SQL statement, reference to the SSNO attribute must be fully qualified using a table alias, as illustrated below:

SELECT e.pinfo.ssno FROM emptab e;

UPDATE emptab e SET e.pinfo.ssno = '510129980'
   WHERE e.pinfo.name = 'Mike';


To reference an object type's member method that does not accept arguments, you must provide "empty" parentheses. For example, assume that AGE is a method in the person type that does not take arguments. In order to call this method in a SQL statement, you must provide empty parentheses as shows in this example:

SELECT e.pinfo.age() FROM emptab e
   WHERE e.pinfo.name = 'Mike';


For more information, see the sections on user-defined datatypes in Oracle8i Concepts.

 

by: deva_kumarPosted on 2000-11-21 at 04:39:23ID: 5473888

There are three ways to store XML into Oracle 8i

1) With the help of XML Parser (with XSLT)

2) iFS

3) XML SQL Utility

That depends on which version of oracle you are using.

If you just want to store the XML (with out parsing, and structuring) then CLOB is the way.

You can refer at:
technet.oracle.com/tech/xml
www.oracle.com/xml

- Deva

 

by: BwarePosted on 2000-11-21 at 06:25:19ID: 5475619

Thanks deva

what about saving as BLOB or LOB is this not something that I could do?

Mark

 

by: merithPosted on 2000-11-21 at 07:05:09ID: 5476981

BLOB is just as a Binary Large Object..

It all depends what it is and how YOU want to save the data

 

by: deva_kumarPosted on 2000-11-21 at 23:21:03ID: 5496245

Hello Bware,

Hope you got some idea about Using XML, Parsers in Oracle.

Whether you want to use them depends on your requirement.

If you want just to store XML documents, then use CLOB.  Since XML documents are plain Text documents CLOB is enough.  The DBMS_LOB package will give you details about the possible operations with LOBs.  If you want to know more about LOBs, http://otn.oracle.com/docs/products/oracle8i/doc_library/817_doc/appdev.817/a76940/toc.htm

If you want to store and process the XML document using Oracle, then as i told earlier, you have to use Oracle XML Parser, and XML SQL utility. Check this link for related information http://otn.oracle.com/docs/products/oracle8i/doc_library/817_doc/appdev.817/a86030/toc.htm


Deva

 

by: merithPosted on 2000-11-22 at 00:06:10ID: 5496781

was unaware of the XML Parser.. thnk you for that information

 

by: HelicopterPosted on 2001-09-02 at 13:48:04ID: 6449214

Jesus Christ what is the point of pasting pages and pages out of an online manual? I come here for pointers to answers not to have to wade through tons of irrelevant crap.

20120131-EE-VQP-002

3 Ways to Join

30-Day Free Trial

The Experts

98% positive feedback on 31,087 answers since March 2000. angeliii is a Microsoft Most Valuable Professional for his work with MS SQL Server & Develoment.

He has also proven his knowledge of Visual Basic Programming, PHP Scripting and Oracle Databases.

The Experts

97% positive feedback on 10,752 answers since July 2000. lrmoore has more than 18 years experience in the networking industry.

The six-time Mircosoft MVPs specialties include firewalls, virtual private networking, and network management.

Testimonials

"...and excellent source for support... Kind of like having your very own IT dept." Electriciansnet

Testimonials

"I was apprehensive at signing up at first. However... it has already made my life as an IT administrator much easier." JaCrews

Testimonials

"WOW! You guys have great, active, and knowledgeable people on here." moore50

Business Clients

Business Clients

In the Press

"If you’ve got a question... Experts Exchange can supply an answer.”

In the Press

"...an invaluable aid for both IT professionals and those who require tech support."

In the Press

"where IT professionals provide quick answers on just about any topic"

Business Account Plans

Loading Advertisement...