Comparison operators cannot be used to place restrictions on character-based attributes.

This chapter explains these aspects of the PL/SQL language:

  • Character Sets

  • Lexical Units

  • Declarations

  • References to Identifiers

  • Scope and Visibility of Identifiers

  • Assigning Values to Variables

  • Expressions

  • Error-Reporting Functions

  • SQL Functions in PL/SQL Expressions

  • Pragmas

  • Conditional Compilation

Character Sets

Any character data to be processed by PL/SQL or stored in a database must be represented as a sequence of bytes. The byte representation of a single character is called a character code. A set of character codes is called a character set.

Every Oracle database supports a database character set and a national character set. PL/SQL also supports these character sets. This document explains how PL/SQL uses the database character set and national character set.

Topics

  • Database Character Set

  • National Character Set

Database Character Set

PL/SQL uses the database character set to represent:

  • Stored source text of PL/SQL units

    For information about PL/SQL units, see "PL/SQL Units and Compilation Parameters".

  • Character values of data types CHAR, VARCHAR2, CLOB, and LONG

    For information about these data types, see "SQL Data Types".

The database character set can be either single-byte, mapping each supported character to one particular byte, or multibyte-varying-width, mapping each supported character to a sequence of one, two, three, or four bytes. The maximum number of bytes in a character code depends on the particular character set.

Every database character set includes these basic characters:

  • Latin letters: A through Z and a through z

  • Decimal digits: 0 through 9

  • Punctuation characters in Table 2-1

  • Whitespace characters: space, tab, new line, and carriage return

PL/SQL source text that uses only the basic characters can be stored and compiled in any database. PL/SQL source text that uses nonbasic characters can be stored and compiled only in databases whose database character sets support those nonbasic characters.

Table 2-1 Punctuation Characters in Every Database Character Set

SymbolName

[

Left parenthesis

]

Right parenthesis

Right angle bracket

+

Plus sign

-

Hyphen or minus sign

*

Asterisk

/

Slash

=

Equal sign

,

Comma

;

Semicolon

:

Colon

.

Period

!

Exclamation point

?

Question mark

'

Apostrophe or single quotation mark

"

Quotation mark or double quotation mark

@

At sign

%

Percent sign

#

Number sign

$

Dollar sign

_

Underscore

|

Vertical bar


National Character Set

PL/SQL uses the national character set to represent character values of data types NCHAR, NVARCHAR2 and NCLOB. For information about these data types, see "SQL Data Types".

Lexical Units

The lexical units of PL/SQL are its smallest individual components—delimiters, identifiers, literals, and comments.

Topics

  • Delimiters

  • Identifiers

  • Literals

  • Comments

  • Whitespace Characters Between Lexical Units

Delimiters

A delimiter is a character, or character combination, that has a special meaning in PL/SQL. Do not embed any others characters [including whitespace characters] inside a delimiter.

Table 2-2 summarizes the PL/SQL delimiters.

Table 2-2 PL/SQL Delimiters

DelimiterMeaning

+

Addition operator

:=

Assignment operator

=>

Association operator

%

Attribute indicator

'

Character string delimiter

.

Component indicator

||

Concatenation operator

/

Division operator

**

Exponentiation operator

[

Expression or list delimiter [begin]

]

Expression or list delimiter [end]

:

Host variable indicator

,

Item separator

Label delimiter [end]

/*

Multiline comment delimiter [begin]

*/

Multiline comment delimiter [end]

*

Multiplication operator

"

Quoted identifier delimiter

..

Range operator

=

Relational operator [equal]

Relational operator [not equal]

!=

Relational operator [not equal]

~=

Relational operator [not equal]

^=

Relational operator [not equal]

Relational operator [greater than]

=

Relational operator [greater than or equal]

@

Remote access indicator

--

Single-line comment indicator

;

Statement terminator

-

Subtraction or negation operator


Identifiers

Identifiers name PL/SQL elements, which include:

  • Constants

  • Cursors

  • Exceptions

  • Keywords

  • Labels

  • Packages

  • Reserved words

  • Subprograms

  • Types

  • Variables

Every character in an identifier, alphabetic or not, is significant. For example, the identifiers lastname and last_name are different.

You must separate adjacent identifiers by one or more whitespace characters or a punctuation character.

Except as explained in "Quoted User-Defined Identifiers", PL/SQL is case-insensitive for identifiers. For example, the identifiers lastname, LastName, and LASTNAME are the same.

Topics

  • Reserved Words and Keywords

  • Predefined Identifiers

  • User-Defined Identifiers

Reserved Words and Keywords

Reserved words and keywords are identifiers that have special meaning in PL/SQL.

You cannot use reserved words as ordinary user-defined identifiers. You can use them as quoted user-defined identifiers, but it is not recommended. For more information, see "Quoted User-Defined Identifiers".

You can use keywords as ordinary user-defined identifiers, but it is not recommended.

For lists of PL/SQL reserved words and keywords, see Table D-1 and Table D-2, respectively.

Predefined Identifiers

Predefined identifiers are declared in the predefined package STANDARD. An example of a predefined identifier is the exception INVALID_NUMBER.

For a list of predefined identifiers, connect to Oracle Database as a user who has the DBA role and use this query:

SELECT TYPE_NAME FROM ALL_TYPES WHERE PREDEFINED='YES';

You can use predefined identifiers as user-defined identifiers, but it is not recommended. Your local declaration overrides the global declaration [see "Scope and Visibility of Identifiers"].

User-Defined Identifiers

A user-defined identifier is:

  • Composed of characters from the database character set

  • Either ordinary or quoted

Tip:

Make user-defined identifiers meaningful. For example, the meaning of cost_per_thousand is obvious, but the meaning of cpt is not.

Ordinary User-Defined Identifiers

An ordinary user-defined identifier:

  • Begins with a letter

  • Can include letters, digits, and these symbols:

    • Dollar sign [$]

    • Number sign [#]

    • Underscore [_]

  • Is not a reserved word [listed in Table D-1].

The database character set defines which characters are classified as letters and digits. The representation of the identifier in the database character set cannot exceed 30 bytes.

Examples of acceptable ordinary user-defined identifiers:

X
t2
phone#
credit_limit
LastName
oracle$number
money$$$tree
SN##
try_again_

Examples of unacceptable ordinary user-defined identifiers:

mine&yours
debit-amount
on/off
user id

Quoted User-Defined Identifiers

A quoted user-defined identifier is enclosed in double quotation marks. Between the double quotation marks, any characters from the database character set are allowed except double quotation marks, new line characters, and null characters. For example, these identifiers are acceptable:

"X+Y"
"last name"
"on/off switch"
"employee[s]"
"*** header info ***"

The representation of the quoted identifier in the database character set cannot exceed 30 bytes [excluding the double quotation marks].

A quoted user-defined identifier is case-sensitive, with one exception: If a quoted user-defined identifier, without its enclosing double quotation marks, is a valid ordinary user-defined identifier, then the double quotation marks are optional in references to the identifier, and if you omit them, then the identifier is case-insensitive.

In Example 2-1, the quoted user-defined identifier "HELLO", without its enclosing double quotation marks, is a valid ordinary user-defined identifier. Therefore, the reference Hello is valid.

Example 2-1 Valid Case-Insensitive Reference to Quoted User-Defined Identifier

DECLARE
  "HELLO" varchar2[10] := 'hello';
BEGIN
  DBMS_Output.Put_Line[Hello];
END;
/

Result:

hello

In Example 2-2, the reference "Hello" is invalid, because the double quotation marks make the identifier case-sensitive.

Example 2-2 Invalid Case-Insensitive Reference to Quoted User-Defined Identifier

DECLARE
  "HELLO" varchar2[10] := 'hello';
BEGIN
  DBMS_Output.Put_Line["Hello"];
END;
/

Result:

  DBMS_Output.Put_Line["Hello"];
                        *
ERROR at line 4:
ORA-06550: line 4, column 25:
PLS-00201: identifier 'Hello' must be declared
ORA-06550: line 4, column 3:
PL/SQL: Statement ignored

It is not recommended, but you can use a reserved word as a quoted user-defined identifier. Because a reserved word is not a valid ordinary user-defined identifier, you must always enclose the identifier in double quotation marks, and it is always case-sensitive.

Example 2-3 declares quoted user-defined identifiers "BEGIN", "Begin", and "begin". Although BEGIN, Begin, and begin represent the same reserved word, "BEGIN", "Begin", and "begin" represent different identifiers.

Example 2-3 Reserved Word as Quoted User-Defined Identifier

DECLARE
  "BEGIN" varchar2[15] := 'UPPERCASE';
  "Begin" varchar2[15] := 'Initial Capital';
  "begin" varchar2[15] := 'lowercase';
BEGIN
  DBMS_Output.Put_Line["BEGIN"];
  DBMS_Output.Put_Line["Begin"];
  DBMS_Output.Put_Line["begin"];
END;
/

Result:

UPPERCASE
Initial Capital
lowercase
 
PL/SQL procedure successfully completed.

Example 2-4 references a quoted user-defined identifier that is a reserved word, neglecting to enclose it in double quotation marks.

Example 2-4 Neglecting Double Quotation Marks

DECLARE
  "HELLO" varchar2[10] := 'hello';  -- HELLO is not a reserved word
  "BEGIN" varchar2[10] := 'begin';  -- BEGIN is a reserved word
BEGIN
  DBMS_Output.Put_Line[Hello];      -- Double quotation marks are optional
  DBMS_Output.Put_Line[BEGIN];      -- Double quotation marks are required
end;
/

Result:

  DBMS_Output.Put_Line[BEGIN];      -- Double quotation marks are required
                       *
ERROR at line 6:
ORA-06550: line 6, column 24:
PLS-00103: Encountered the symbol "BEGIN" when expecting one of the following:
[ ] - + case mod new not null 
 
table continue avg count current exists max min prior sql
stddev sum variance execute multiset the both leading
trailing forall merge year month day hour minute second
timezone_hour timezone_minute timezone_region timezone_abbr
time timestamp interval date
y THEN max:=x;ELSE max:=y;END IF;  -- correct but hard to read
  
  -- Easier to read:
  
  IF x > y THEN
    max:=x;
  ELSE
    max:=y;
  END IF;
END;
/

Declarations

A declaration allocates storage space for a value of a specified data type, and names the storage location so that you can reference it. You must declare objects before you can reference them. Declarations can appear in the declarative part of any block, subprogram, or package.

Topics

For information about declaring objects other than variables and constants, see the syntax of declare_section in "Block".

Variable Declarations

A variable declaration always specifies the name and data type of the variable. For most data types, a variable declaration can also specify an initial value.

The variable name must be a valid user-defined identifier [see "User-Defined Identifiers"].

The data type can be any PL/SQL data type. The PL/SQL data types include the SQL data types. A data type is either scalar [without internal components] or composite [with internal components].

Example 2-9 declares several variables with scalar data types.

Example 2-9 Scalar Variable Declarations

DECLARE
  part_number       NUMBER[6];     -- SQL data type
  part_name         VARCHAR2[20];  -- SQL data type
  in_stock          BOOLEAN;       -- PL/SQL-only data type
  part_price        NUMBER[6,2];   -- SQL data type
  part_description  VARCHAR2[50];  -- SQL data type
BEGIN
  NULL;
END;
/

See Also:

Constant Declarations

The information in "Variable Declarations" also applies to constant declarations, but a constant declaration has two more requirements: the keyword CONSTANT and the initial value of the constant. [The initial value of a constant is its permanent value.]

Example 2-10 declares three constants with scalar data types.

Example 2-10 Constant Declarations

DECLARE
  credit_limit     CONSTANT REAL    := 5000.00;  -- SQL data type
  max_days_in_year CONSTANT INTEGER := 366;      -- SQL data type
  urban_legend     CONSTANT BOOLEAN := FALSE;    -- PL/SQL-only data type
BEGIN
  NULL;
END;
/

Initial Values of Variables and Constants

In a variable declaration, the initial value is optional unless you specify the NOT NULL constraint [for details, see "NOT NULL Constraint"]. In a constant declaration, the initial value is required.

If the declaration is in a block or subprogram, the initial value is assigned to the variable or constant every time control passes to the block or subprogram. If the declaration is in a package specification, the initial value is assigned to the variable or constant for each session [whether the variable or constant is public or private].

To specify the initial value, use either the assignment operator [:=] or the keyword DEFAULT, followed by an expression. The expression can include previously declared constants and previously initialized variables.

Example 2-11 assigns initial values to the constant and variables that it declares. The initial value of area depends on the previously declared constant pi and the previously initialized variable radius.

Example 2-11 Variable and Constant Declarations with Initial Values

DECLARE
  hours_worked    INTEGER := 40;
  employee_count  INTEGER := 0;

  pi     CONSTANT REAL := 3.14159;
  radius          REAL := 1;
  area            REAL := [pi * radius**2];
BEGIN
  NULL;
END;
/

If you do not specify an initial value for a variable, assign a value to it before using it in any other context.

In Example 2-12, the variable counter has the initial value NULL, by default. As the example shows [using the "IS [NOT] NULL Operator"] NULL is different from zero.

Example 2-12 Variable Initialized to NULL by Default

DECLARE
  counter INTEGER;  -- initial value is NULL by default
BEGIN
  counter := counter + 1;  -- NULL + 1 is still NULL
  
  IF counter IS NULL THEN
    DBMS_OUTPUT.PUT_LINE['counter is NULL.'];
  END IF;
END;
/
 

Result:

counter is NULL.

See Also:

NOT NULL Constraint

You can impose the NOT NULL constraint on a scalar variable or constant [or scalar component of a composite variable or constant]. The NOT NULL constraint prevents assigning a null value to the item. The item can acquire this constraint either implicitly [from its data type] or explicitly.

A scalar variable declaration that specifies NOT NULL, either implicitly or explicitly, must assign an initial value to the variable [because the default initial value for a scalar variable is NULL].

In Example 2-13, the variable acct_id acquires the NOT NULL constraint explicitly, and the variables a, b, and c acquire it from their data types.

Example 2-13 Variable Declaration with NOT NULL Constraint

DECLARE
  acct_id INTEGER[4] NOT NULL := 9999;
  a NATURALN                  := 9999;
  b POSITIVEN                 := 9999;
  c SIMPLE_INTEGER            := 9999;
BEGIN
  NULL;
END;
/

PL/SQL treats any zero-length string as a NULL value. This includes values returned by character functions and BOOLEAN expressions.

In Example 2-14, all variables are initialized to NULL.

Example 2-14 Variables Initialized to NULL Values

DECLARE
  null_string  VARCHAR2[80] := TO_CHAR[''];
  address      VARCHAR2[80];
  zip_code     VARCHAR2[80] := SUBSTR[address, 25, 0];
  name         VARCHAR2[80];
  valid        BOOLEAN      := [name != ''];
BEGIN
  NULL;
END;
/

To test for a NULL value, use the "IS [NOT] NULL Operator".

%TYPE Attribute

The %TYPE attribute lets you declare a data item of the same data type as a previously declared variable or column [without knowing what that type is]. If the declaration of the referenced item changes, then the declaration of the referencing item changes accordingly.

The syntax of the declaration is:

referencing_item referenced_item%TYPE;

For the kinds of items that can be referencing and referenced items, see "%TYPE Attribute".

The referencing item inherits the following from the referenced item:

The referencing item does not inherit the initial value of the referenced item. Therefore, if the referencing item specifies or inherits the NOT NULL constraint, you must specify an initial value for it.

The %TYPE attribute is particularly useful when declaring variables to hold database values. The syntax for declaring a variable of the same type as a column is:

variable_name table_name.column_name%TYPE;

In Example 2-15, the variable surname inherits the data type and size of the column employees.last_name, which has a NOT NULL constraint. Because surname does not inherit the NOT NULL constraint, its declaration does not need an initial value.

Example 2-15 Declaring Variable of Same Type as Column

DECLARE
  surname  employees.last_name%TYPE;
BEGIN
  DBMS_OUTPUT.PUT_LINE['surname=' || surname];
END;
/

Result:

surname=

In Example 2-16, the variable surname inherits the data type, size, and NOT NULL constraint of the variable name. Because surname does not inherit the initial value of name, its declaration needs an initial value [which cannot exceed 25 characters].

Example 2-16 Declaring Variable of Same Type as Another Variable

DECLARE
  name     VARCHAR[25] NOT NULL := 'Smith';
  surname  name%TYPE := 'Jones';
BEGIN
  DBMS_OUTPUT.PUT_LINE['name=' || name];
  DBMS_OUTPUT.PUT_LINE['surname=' || surname];
END;
/

Result:

name=Smith
surname=Jones

See Also:

"%ROWTYPE Attribute", which lets you declare a record variable that represents either a full or partial row of a database table or view

References to Identifiers

When referencing an identifier, you use a name that is either simple, qualified, remote, or both qualified and remote.

The simple name of an identifier is the name in its declaration. For example:

DECLARE
  a INTEGER;  -- Declaration
BEGIN
  a := 1;     -- Reference with simple name
END;
/

If an identifier is declared in a named PL/SQL unit, you can [and sometimes must] reference it with its qualified name. The syntax [called dot notation] is:

unit_name.simple_identifier_name

For example, if package p declares identifier a, you can reference the identifier with the qualified name p.a. The unit name also can [and sometimes must] be qualified. You must qualify an identifier when it is not visible [see "Scope and Visibility of Identifiers"].

If the identifier names an object on a remote database, you must reference it with its remote name. The syntax is:

simple_identifier_name@link_to_remote_database

If the identifier is declared in a PL/SQL unit on a remote database, you must reference it with its qualified remote name. The syntax is:

unit_name.simple_identifier_name@link_to_remote_database

You can create synonyms for remote schema objects, but you cannot create synonyms for objects declared in PL/SQL subprograms or packages. To create a synonym, use the SQL statement CREATE SYNONYM, explained in Oracle Database SQL Language Reference.

For information about how PL/SQL resolves ambiguous names, see Appendix B, "PL/SQL Name Resolution".

Note:

You can reference identifiers declared in the packages STANDARD and DBMS_STANDARD without qualifying them with the package names, unless you have declared a local identifier with the same name [see "Scope and Visibility of Identifiers"].

Scope and Visibility of Identifiers

The scope of an identifier is the region of a PL/SQL unit from which you can reference the identifier. The visibility of an identifier is the region of a PL/SQL unit from which you can reference the identifier without qualifying it. An identifier is local to the PL/SQL unit that declares it. If that unit has subunits, the identifier is global to them.

If a subunit redeclares a global identifier, then inside the subunit, both identifiers are in scope, but only the local identifier is visible. To reference the global identifier, the subunit must qualify it with the name of the unit that declared it. If that unit has no name, then the subunit cannot reference the global identifier.

A PL/SQL unit cannot reference identifiers declared in other units at the same level, because those identifiers are neither local nor global to the block.

Example 2-17 shows the scope and visibility of several identifiers. The first sub-block redeclares the global identifier a. To reference the global variable a, the first sub-block would have to qualify it with the name of the outer block—but the outer block has no name. Therefore, the first sub-block cannot reference the global variable a; it can reference only its local variable a. Because the sub-blocks are at the same level, the first sub-block cannot reference d, and the second sub-block cannot reference c.

Example 2-17 Scope and Visibility of Identifiers

-- Outer block:
DECLARE
  a CHAR;  -- Scope of a [CHAR] begins
  b REAL;    -- Scope of b begins
BEGIN
  -- Visible: a [CHAR], b
  
  -- First sub-block:
  DECLARE
    a INTEGER;  -- Scope of a [INTEGER] begins
    c REAL;       -- Scope of c begins
  BEGIN
    -- Visible: a [INTEGER], b, c
    NULL;
  END;          -- Scopes of a [INTEGER] and c end

  -- Second sub-block:
  DECLARE
    d REAL;     -- Scope of d begins
  BEGIN
    -- Visible: a [CHAR], b, d
    NULL;
  END;          -- Scope of d ends

-- Visible: a [CHAR], b
END;            -- Scopes of a [CHAR] and b end
/

Example 2-18 labels the outer block with the name outer. Therefore, after the sub-block redeclares the global variable birthdate, it can reference that global variable by qualifying its name with the block label. The sub-block can also reference its local variable birthdate, by its simple name.

Example 2-18 Qualifying Redeclared Global Identifier with Block Label

  -- label
DECLARE
  birthdate DATE := '09-AUG-70';
BEGIN
  DECLARE
    birthdate DATE := '29-SEP-70';
  BEGIN
    IF birthdate = outer.birthdate THEN
      DBMS_OUTPUT.PUT_LINE ['Same Birthday'];
    ELSE
      DBMS_OUTPUT.PUT_LINE ['Different Birthday'];
    END IF;
  END;
END;
/
 

Result:

Different Birthday

In Example 2-19, the procedure check_credit declares a variable, rating, and a function, check_rating. The function redeclares the variable. Then the function references the global variable by qualifying it with the procedure name.

Example 2-19 Qualifying Identifier with Subprogram Name

CREATE OR REPLACE PROCEDURE check_credit [credit_limit NUMBER] AS
  rating NUMBER := 3;
  
  FUNCTION check_rating RETURN BOOLEAN IS
    rating  NUMBER := 1;
    over_limit  BOOLEAN;
  BEGIN
    IF check_credit.rating  100];
  valid_id := TRUE;
  emp_rec1.first_name := 'Antonio';
  emp_rec1.last_name := 'Ortiz';
  emp_rec1 := emp_rec2;
  comm_tab[5] := 20000 * 0.15;
END;
/

Assigning Values to Variables with the SELECT INTO Statement

A simple form of the SELECT INTO statement is:

SELECT select_item [, select_item ]... 
INTO variable_name [, variable_name ]...
FROM table_name;

For each select_item, there must be a corresponding, type-compatible variable_name. Because SQL does not have a BOOLEAN type, variable_name cannot be a BOOLEAN variable. For the complete syntax of the SELECT INTO statement, see "SELECT INTO Statement".

Example 2-25 uses a SELECT INTO statement to assign to the variable bonus the value that is 10% of the salary of the employee whose employee_id is 100.

Example 2-25 Assigning Value to Variable with SELECT INTO Statement

DECLARE
  bonus   NUMBER[8,2];
BEGIN
  SELECT salary * 0.10 INTO bonus
  FROM employees
  WHERE employee_id = 100;
END;

DBMS_OUTPUT.PUT_LINE['bonus = ' || TO_CHAR[bonus]];
/

Result:

bonus = 2646

Assigning Values to Variables as Parameters of a Subprogram

If you pass a variable to a subprogram as an OUT or IN OUT parameter, and the subprogram assigns a value to the parameter, the variable retains that value after the subprogram finishes running. For more information, see "Subprogram Parameters".

Example 2-26 passes the variable new_sal to the procedure adjust_salary. The procedure assigns a value to the corresponding formal parameter, sal. Because sal is an IN OUT parameter, the variable new_sal retains the assigned value after the procedure finishes running.

Example 2-26 Assigning Value to Variable as IN OUT Subprogram Parameter

DECLARE
  emp_salary  NUMBER[8,2];
 
  PROCEDURE adjust_salary [
    emp        NUMBER, 
    sal IN OUT NUMBER,
    adjustment NUMBER
  ] IS
  BEGIN
    sal := sal + adjustment;
  END;
 
BEGIN
  SELECT salary INTO emp_salary
  FROM employees
  WHERE employee_id = 100;
 
  DBMS_OUTPUT.PUT_LINE
   ['Before invoking procedure, emp_salary: ' || emp_salary];
 
  adjust_salary [100, emp_salary, 1000];
 
  DBMS_OUTPUT.PUT_LINE
   ['After invoking procedure, emp_salary: ' || emp_salary];
END;
/
 

Result:

Before invoking procedure, emp_salary: 24000
After invoking procedure, emp_salary: 25000

Assigning Values to BOOLEAN Variables

The only values that you can assign to a BOOLEAN variable are TRUE, FALSE, and NULL.

Example 2-27 initializes the BOOLEAN variable done to NULL by default, assigns it the literal value FALSE, compares it to the literal value TRUE, and assigns it the value of a BOOLEAN expression.

Example 2-27 Assigning Value to BOOLEAN Variable

DECLARE
  done    BOOLEAN;              -- Initial value is NULL by default
  counter NUMBER := 0;
BEGIN
  done := FALSE;                -- Assign literal value
  WHILE done != TRUE            -- Compare to literal value
    LOOP
      counter := counter + 1;
      done := [counter > 500];  -- Assign value of BOOLEAN expression
    END LOOP;
END;
/

For more information about the BOOLEAN data type, see "BOOLEAN Data Type".

Expressions

An expression always returns a single value. The simplest expressions, in order of increasing complexity, are:

  1. A single constant or variable [for example, a]

  2. A unary operator and its single operand [for example, -a]

  3. A binary operator and its two operands [for example, a+b]

An operand can be a variable, constant, literal, operator, function invocation, or placeholder—or another expression. Therefore, expressions can be arbitrarily complex. For expression syntax, see "Expression".

The data types of the operands determine the data type of the expression. Every time the expression is evaluated, a single value of that data type results. The data type of that result is the data type of the expression.

Topics

  • Concatenation Operator

  • Operator Precedence

  • Logical Operators

  • Short-Circuit Evaluation

  • Comparison Operators

  • BOOLEAN Expressions

  • CASE Expressions

  • SQL Functions in PL/SQL Expressions

Concatenation Operator

The concatenation operator [||] appends one string operand to another, as Example 2-28 shows.

Example 2-28 Concatenation Operator

DECLARE
  x VARCHAR2[4] := 'suit';
  y VARCHAR2[4] := 'case';
BEGIN
  DBMS_OUTPUT.PUT_LINE [x || y];
END;
/
 

Result:

suitcase

The concatenation operator ignores null operands, as Example 2-29 shows.

Example 2-29 Concatenation Operator with NULL Operands

BEGIN
  DBMS_OUTPUT.PUT_LINE ['apple' || NULL || NULL || 'sauce'];
END;
/
 

Result:

applesauce

For more information about the syntax of the concatenation operator, see "character_expression ::=".

Operator Precedence

An operation is either a unary operator and its single operand or a binary operator and its two operands. The operations in an expression are evaluated in order of operator precedence.

Table 2-3 shows operator precedence from highest to lowest. Operators with equal precedence are evaluated in no particular order.

Table 2-3 Operator Precedence

OperatorOperation

**

exponentiation

+, -

identity, negation

*, /

multiplication, division

+, -, ||

addition, subtraction, concatenation

=, , =, , !=, ~=, ^=, IS NULL, LIKE, BETWEEN, IN

comparison

NOT

negation

AND

conjunction

OR

inclusion


To control the order of evaluation, enclose operations in parentheses, as in Example 2-30.

Example 2-30 Controlling Evaluation Order with Parentheses

DECLARE
  a INTEGER := 1+2**2;
  b INTEGER := [1+2]**2;
BEGIN
  DBMS_OUTPUT.PUT_LINE['a = ' || TO_CHAR[a]];
  DBMS_OUTPUT.PUT_LINE['b = ' || TO_CHAR[b]];
END;
/

Result:

a = 5
b = 9

When parentheses are nested, the most deeply nested operations are evaluated first.

In Example 2-31, the operations [1+2] and [3+4] are evaluated first, producing the values 3 and 7, respectively. Next, the operation 3*7 is evaluated, producing the result 21. Finally, the operation 21/7 is evaluated, producing the final value 3.

Example 2-31 Expression with Nested Parentheses

DECLARE
  a INTEGER := [[1+2]*[3+4]]/7;
BEGIN
  DBMS_OUTPUT.PUT_LINE['a = ' || TO_CHAR[a]];
END;
/

Result:

a = 3

You can also use parentheses to improve readability, as in Example 2-32, where the parentheses do not affect evaluation order.

Example 2-32 Improving Readability with Parentheses

DECLARE
  a INTEGER := 2**2*3**2;
  b INTEGER := [2**2]*[3**2];
BEGIN
  DBMS_OUTPUT.PUT_LINE['a = ' || TO_CHAR[a]];
  DBMS_OUTPUT.PUT_LINE['b = ' || TO_CHAR[b]];
END;
/

Result:

a = 36
b = 36

Example 2-33 shows the effect of operator precedence and parentheses in several more complex expressions.

Example 2-33 Operator Precedence

DECLARE
  salary      NUMBER := 60000;
  commission  NUMBER := 0.10;
BEGIN
  -- Division has higher precedence than addition:
  
  DBMS_OUTPUT.PUT_LINE['5 + 12 / 4 = ' || TO_CHAR[5 + 12 / 4]];
  DBMS_OUTPUT.PUT_LINE['12 / 4 + 5 = ' || TO_CHAR[12 / 4 + 5]];
  
 -- Parentheses override default operator precedence:
 
  DBMS_OUTPUT.PUT_LINE['8 + 6 / 2 = ' || TO_CHAR[8 + 6 / 2]];
  DBMS_OUTPUT.PUT_LINE['[8 + 6] / 2 = ' || TO_CHAR[[8 + 6] / 2]];
 
  -- Most deeply nested operation is evaluated first:
 
  DBMS_OUTPUT.PUT_LINE['100 + [20 / 5 + [7 - 3]] = '
                      || TO_CHAR[100 + [20 / 5 + [7 - 3]]]];
 
  -- Parentheses, even when unnecessary, improve readability:
 
  DBMS_OUTPUT.PUT_LINE['[salary * 0.05] + [commission * 0.25] = '
    || TO_CHAR[[salary * 0.05] + [commission * 0.25]]
  ];
 
  DBMS_OUTPUT.PUT_LINE['salary * 0.05 + commission * 0.25 = '
    || TO_CHAR[salary * 0.05 + commission * 0.25]
  ];
END;
/
 

Result:

5 + 12 / 4 = 8
12 / 4 + 5 = 8
8 + 6 / 2 = 11
[8 + 6] / 2 = 7
100 + [20 / 5 + [7 - 3]] = 108
[salary * 0.05] + [commission * 0.25] = 3000.025
salary * 0.05 + commission * 0.25 = 3000.025

Logical Operators

The logical operators AND, OR, and NOT follow the tri-state logic shown in Table 2-4. AND and OR are binary operators; NOT is a unary operator.

Table 2-4 Logical Truth Table

xyx AND yx OR yNOT x

TRUE

TRUE

TRUE

TRUE

FALSE

TRUE

FALSE

FALSE

TRUE

FALSE

TRUE

NULL

NULL

TRUE

FALSE

FALSE

TRUE

FALSE

TRUE

TRUE

FALSE

FALSE

FALSE

FALSE

TRUE

FALSE

NULL

FALSE

NULL

TRUE

NULL

TRUE

NULL

TRUE

NULL

NULL

FALSE

FALSE

NULL

NULL

NULL

NULL

NULL

NULL

NULL


Example 2-34 creates a procedure, print_boolean, that prints the value of a BOOLEAN variable. The procedure uses the "IS [NOT] NULL Operator". Several examples in this chapter invoke print_boolean.

Example 2-34 Procedure Prints BOOLEAN Variable

CREATE OR REPLACE PROCEDURE print_boolean [
  b_name   VARCHAR2,
  b_value  BOOLEAN
] IS
BEGIN
  IF b_value IS NULL THEN
    DBMS_OUTPUT.PUT_LINE [b_name || ' = NULL'];
  ELSIF b_value = TRUE THEN
    DBMS_OUTPUT.PUT_LINE [b_name || ' = TRUE'];
  ELSE
    DBMS_OUTPUT.PUT_LINE [b_name || ' = FALSE'];
  END IF;
END;
/
 

As Table 2-4 and Example 2-35 show, AND returns TRUE if and only if both operands are TRUE.

Example 2-35 AND Operator

DECLARE
  PROCEDURE print_x_and_y [
    x  BOOLEAN,
    y  BOOLEAN
  ] IS
  BEGIN
   print_boolean ['x', x];
   print_boolean ['y', y];
   print_boolean ['x AND y', x AND y];
 END print_x_and_y;
 
BEGIN
 print_x_and_y [FALSE, FALSE];
 print_x_and_y [TRUE, FALSE];
 print_x_and_y [FALSE, TRUE];
 print_x_and_y [TRUE, TRUE];
 
 print_x_and_y [TRUE, NULL];
 print_x_and_y [FALSE, NULL];
 print_x_and_y [NULL, TRUE];
 print_x_and_y [NULL, FALSE];
END;
/
 

Result:

x = FALSE
y = FALSE
x AND y = FALSE
x = TRUE
y = FALSE
x AND y = FALSE
x = FALSE
y = TRUE
x AND y = FALSE
x = TRUE
y = TRUE
x AND y = TRUE
x = TRUE
y = NULL
x AND y = NULL
x = FALSE
y = NULL
x AND y = FALSE
x = NULL
y = TRUE
x AND y = NULL
x = NULL
y = FALSE
x AND y = FALSE

As Table 2-4 and Example 2-36 show, OR returns TRUE if either operand is TRUE. [Example 2-36 invokes the print_boolean procedure from Example 2-35.]

Example 2-36 OR Operator

DECLARE
  PROCEDURE print_x_or_y [
    x  BOOLEAN,
    y  BOOLEAN
  ] IS
  BEGIN
    print_boolean ['x', x];
    print_boolean ['y', y];
    print_boolean ['x OR y', x OR y];
  END print_x_or_y;
 
BEGIN
  print_x_or_y [FALSE, FALSE];
  print_x_or_y [TRUE, FALSE];
  print_x_or_y [FALSE, TRUE];
  print_x_or_y [TRUE, TRUE];
 
  print_x_or_y [TRUE, NULL];
  print_x_or_y [FALSE, NULL];
  print_x_or_y [NULL, TRUE];
  print_x_or_y [NULL, FALSE];
END;
/
 

Result:

x = FALSE
y = FALSE
x OR y = FALSE
x = TRUE
y = FALSE
x OR y = TRUE
x = FALSE
y = TRUE
x OR y = TRUE
x = TRUE
y = TRUE
x OR y = TRUE
x = TRUE
y = NULL
x OR y = TRUE
x = FALSE
y = NULL
x OR y = NULL
x = NULL
y = TRUE
x OR y = TRUE
x = NULL
y = FALSE
x OR y = NULL

As Table 2-4 and Example 2-37 show, NOT returns the opposite of its operand, unless the operand is NULL. NOT NULL returns NULL, because NULL is an indeterminate value. [Example 2-37 invokes the print_boolean procedure from Example 2-35.]

Example 2-37 NOT Operator

DECLARE
  PROCEDURE print_not_x [
    x  BOOLEAN
  ] IS
  BEGIN
    print_boolean ['x', x];
    print_boolean ['NOT x', NOT x];
  END print_not_x;
 
BEGIN
  print_not_x [TRUE];
  print_not_x [FALSE];
  print_not_x [NULL];
END;
/
 

Result:

x = TRUE
NOT x = FALSE
x = FALSE
NOT x = TRUE
x = NULL
NOT x = NULL

In Example 2-38, you might expect the sequence of statements to run because x and y seem unequal. But, NULL values are indeterminate. Whether x equals y is unknown. Therefore, the IF condition yields NULL and the sequence of statements is bypassed.

Example 2-38 NULL Value in Unequal Comparison

DECLARE
  x NUMBER := 5;
  y NUMBER := NULL;
BEGIN
  IF x != y THEN  -- yields NULL, not TRUE
    DBMS_OUTPUT.PUT_LINE['x != y'];  -- not run
  ELSIF x = y THEN -- also yields NULL
    DBMS_OUTPUT.PUT_LINE['x = y'];
  ELSE
    DBMS_OUTPUT.PUT_LINE
      ['Can''t tell if x and y are equal or not.'];
  END IF;
END;
/
 

Result:

Can't tell if x and y are equal or not.

In Example 2-39, you might expect the sequence of statements to run because a and b seem equal. But, again, that is unknown, so the IF condition yields NULL and the sequence of statements is bypassed.

Example 2-39 NULL Value in Equal Comparison

DECLARE
  a NUMBER := NULL;
  b NUMBER := NULL;
BEGIN
  IF a = b THEN  -- yields NULL, not TRUE
    DBMS_OUTPUT.PUT_LINE['a = b'];  -- not run
  ELSIF a != b THEN  -- yields NULL, not TRUE
    DBMS_OUTPUT.PUT_LINE['a != b'];  -- not run
  ELSE
    DBMS_OUTPUT.PUT_LINE['Can''t tell if two NULLs are equal'];
  END IF;
END;
/
 

Result:

Can't tell if two NULLs are equal

In Example 2-40, the two IF statements appear to be equivalent. However, if either x or y is NULL, then the first IF statement assigns the value of y to high and the second IF statement assigns the value of x to high.

Example 2-40 NOT NULL Equals NULL

DECLARE
  x    INTEGER := 2;
  Y    INTEGER := 5;
  high INTEGER;
BEGIN
  IF [x > y]       -- If x or y is NULL, then [x > y] is NULL
    THEN high := x;  -- run if [x > y] is TRUE
    ELSE high := y;  -- run if [x > y] is FALSE or NULL
  END IF;
  
  IF NOT [x > y]   -- If x or y is NULL, then NOT [x > y] is NULL
    THEN high := y;  -- run if NOT [x > y] is TRUE
    ELSE high := x;  -- run if NOT [x > y] is FALSE or NULL
  END IF;
END;
/

Example 2-41 invokes the print_boolean procedure from Example 2-35 three times. The third and first invocation are logically equivalent—the parentheses in the third invocation only improve readability. The parentheses in the second invocation change the order of operation.

Example 2-41 Changing Evaluation Order of Logical Operators

DECLARE
  x  BOOLEAN := FALSE;
  y  BOOLEAN := FALSE;
  
BEGIN
  print_boolean ['NOT x AND y', NOT x AND y];
  print_boolean ['NOT [x AND y]', NOT [x AND y]];
  print_boolean ['[NOT x] AND y', [NOT x] AND y];
END;
/
 

Result:

NOT x AND y = FALSE
NOT [x AND y] = TRUE
[NOT x] AND y = FALSE

Short-Circuit Evaluation

When evaluating a logical expression, PL/SQL uses short-circuit evaluation. That is, PL/SQL stops evaluating the expression as soon as it can determine the result. Therefore, you can write expressions that might otherwise cause errors.

In Example 2-42, short-circuit evaluation prevents the OR expression from causing a divide-by-zero error. When the value of on_hand is zero, the value of the left operand is TRUE, so PL/SQL does not evaluate the right operand. If PL/SQL evaluated both operands before applying the OR operator, the right operand would cause a division by zero error.

Example 2-42 Short-Circuit Evaluation

DECLARE
  on_hand  INTEGER := 0;
  on_order INTEGER := 100;
BEGIN
  -- Does not cause divide-by-zero error;
  -- evaluation stops after first expression
  
  IF [on_hand = 0] OR [[on_order / on_hand] < 5] THEN
    DBMS_OUTPUT.PUT_LINE['On hand quantity is zero.'];
  END IF;
END;
/
 

Result:

On hand quantity is zero.

Comparison Operators

Comparison operators compare one expression to another. The result is always either TRUE, FALSE, or NULL. If the value of one expression is NULL, then the result of the comparison is also NULL.

The comparison operators are:

  • IS [NOT] NULL Operator

  • Relational Operators

  • LIKE Operator

  • BETWEEN Operator

  • IN Operator

Note:

Character comparisons are affected by NLS parameter settings, which can change at runtime. Therefore, character comparisons are evaluated at runtime, and the same character comparison can have different values at different times. For information about NLS parameters that affect character comparisons, see Oracle Database Globalization Support Guide.

Note:

Using CLOB values with comparison operators can create temporary LOB values. Ensure that your temporary tablespace is large enough to handle them.

IS [NOT] NULL Operator

The IS NULL operator returns the BOOLEAN value TRUE if its operand is NULL or FALSE if it is not NULL. The IS NOT NULL operator does the opposite. Comparisons involving NULL values always yield NULL.

To test whether a value is NULL, use IF value IS NULL, as in these examples:

  • Example 2-12

  • Example 2-34

  • Example 2-53

Relational Operators

Table 2-5 summarizes the relational operators.

Table 2-5 Relational Operators

OperatorMeaning

=

equal to

, !=, ~=, ^=

not equal to

greater than

=

greater than or equal to


Topics

  • Arithmetic Comparisons

  • BOOLEAN Comparisons

  • Character Comparisons

  • Date Comparisons

Arithmetic Comparisons

One number is greater than another if it represents a larger quantity. Real numbers are stored as approximate values, so Oracle recommends comparing them for equality or inequality.

Example 2-43 invokes the print_boolean procedure from Example 2-35 to print the values of expressions that use relational operators to compare arithmetic values.

Example 2-43 Relational Operators in Expressions

BEGIN
  print_boolean ['[2 + 2 =  4]', 2 + 2 = 4];
  
  print_boolean ['[2 + 2  4]', 2 + 2  4];
  print_boolean ['[2 + 2 != 4]', 2 + 2 != 4];
  print_boolean ['[2 + 2 ~= 4]', 2 + 2 ~= 4];
  print_boolean ['[2 + 2 ^= 4]', 2 + 2 ^= 4];
  
  print_boolean ['[1 < 2]', 1  2];
 
  print_boolean ['[1 = 1]', 1 >= 1];
END;
/
 

Result:

[2 + 2 =  4] = TRUE
[2 + 2  4] = FALSE
[2 + 2 != 4] = FALSE
[2 + 2 ~= 4] = FALSE
[2 + 2 ^= 4] = FALSE
[1 < 2] = TRUE
[1 > 2] = FALSE
[1 = 1] = TRUE

BOOLEAN Comparisons

By definition, TRUE is greater than FALSE. Any comparison with NULL returns NULL.

Character Comparisons

By default, one character is greater than another if its binary value is larger. For example, this expression is true:

'y' > 'r'

Strings are compared character by character. For example, this expression is true:

'Kathy' > 'Kathryn'

If you set the initialization parameter NLS_COMP=ANSI, string comparisons use the collating sequence identified by the NLS_SORT initialization parameter.

A collating sequence is an internal ordering of the character set in which a range of numeric codes represents the individual characters. One character value is greater than another if its internal numeric value is larger. Each language might have different rules about where such characters occur in the collating sequence. For example, an accented letter might be sorted differently depending on the database character set, even though the binary value is the same in each case.

By changing the value of the NLS_SORT parameter, you can perform comparisons that are case-insensitive and accent-insensitive.

A case-insensitive comparison treats corresponding uppercase and lowercase letters as the same letter. For example, these expressions are true:

'a' = 'A'
'Alpha' = 'ALPHA'

To make comparisons case-insensitive, append _CI to the value of the NLS_SORT parameter [for example, BINARY_CI or XGERMAN_CI].

An accent-insensitive comparison is case-insensitive, and also treats letters that differ only in accents or punctuation characters as the same letter. For example, these expressions are true:

'Cooperate' = 'Co-Operate'
'Co-Operate' = 'coöperate'

To make comparisons both case-insensitive and accent-insensitive, append _AI to the value of the NLS_SORT parameter [for example, BINARY_AI or FRENCH_M_AI].

Semantic differences between the CHAR and VARCHAR2 data types affect character comparisons. For more information, see "Value Comparisons".

Date Comparisons

One date is greater than another if it is more recent. For example, this expression is true:

'01-JAN-91' > '31-DEC-90'

LIKE Operator

The LIKE operator compares a character, string, or CLOB value to a pattern and returns TRUE if the value matches the pattern and FALSE if it does not.

The pattern can include the two wildcard characters underscore [_] and percent sign [%]. Underscore matches exactly one character. Percent sign [%] matches zero or more characters.

Case is significant. The string 'Johnson' matches the pattern 'J%s_n' but not 'J%S_N', as Example 2-44 shows.

Example 2-44 LIKE Operator in Expression

DECLARE
  PROCEDURE compare [
    value   VARCHAR2,
    pattern VARCHAR2
  ] IS
  BEGIN
    IF value LIKE pattern THEN
      DBMS_OUTPUT.PUT_LINE ['TRUE'];
    ELSE
      DBMS_OUTPUT.PUT_LINE ['FALSE'];
    END IF;
  END;
BEGIN
  compare['Johnson', 'J%s_n'];
  compare['Johnson', 'J%S_N'];
END;
/
 

Result:

TRUE
FALSE

To search for the percent sign or underscore, define an escape character and put it before the percent sign or underscore.

Example 2-45 uses the backslash as the escape character, so that the percent sign in the string does not act as a wildcard.

Example 2-45 Escape Character in Pattern

DECLARE
  PROCEDURE half_off [sale_sign VARCHAR2] IS
  BEGIN
    IF sale_sign LIKE '50\% off!' ESCAPE '\' THEN
      DBMS_OUTPUT.PUT_LINE ['TRUE'];
    ELSE
      DBMS_OUTPUT.PUT_LINE ['FALSE'];
    END IF;
  END;
BEGIN
  half_off['Going out of business!'];
  half_off['50% off!'];
END;
/
 

Result:

FALSE
TRUE

See Also:

  • Oracle Database SQL Language Reference for more information about LIKE

  • Oracle Database SQL Language Reference for information about REGEXP_LIKE, which is similar to LIKE

BETWEEN Operator

The BETWEEN operator tests whether a value lies in a specified range. x BETWEEN a AND b returns the same value as [x>=a] AND [x CREATE OR REPLACE PROCEDURE p 2 IS 3 i PLS_INTEGER; 4 BEGIN 5 DBMS_OUTPUT.PUT_LINE['Inside p']; 6 i := $$PLSQL_LINE; 7 DBMS_OUTPUT.PUT_LINE['i = ' || i]; 8 DBMS_OUTPUT.PUT_LINE['$$PLSQL_LINE = ' || $$PLSQL_LINE]; 9 DBMS_OUTPUT.PUT_LINE['$$PLSQL_UNIT = ' || $$PLSQL_UNIT]; 10 END; 11 / Procedure created. SQL> BEGIN 2 p; 3 DBMS_OUTPUT.PUT_LINE['Outside p']; 4 DBMS_OUTPUT.PUT_LINE['$$PLSQL_UNIT = ' || $$PLSQL_UNIT]; 5 END; 6 /

Result:

Inside p
i = 6
$$PLSQL_LINE = 8
$$PLSQL_UNIT = P
Outside p
$$PLSQL_UNIT =
 
PL/SQL procedure successfully completed.

Example 2-55 displays the current values of PL/SQL the compilation parameters.

Example 2-55 Displaying Values of PL/SQL Compilation Parameters

BEGIN
  DBMS_OUTPUT.PUT_LINE['$$PLSCOPE_SETTINGS = '     || $$PLSCOPE_SETTINGS];
  DBMS_OUTPUT.PUT_LINE['$$PLSQL_CCFLAGS = '        || $$PLSQL_CCFLAGS];
  DBMS_OUTPUT.PUT_LINE['$$PLSQL_CODE_TYPE = '      || $$PLSQL_CODE_TYPE];
  DBMS_OUTPUT.PUT_LINE['$$PLSQL_OPTIMIZE_LEVEL = ' || $$PLSQL_OPTIMIZE_LEVEL];
  DBMS_OUTPUT.PUT_LINE['$$PLSQL_WARNINGS = '       || $$PLSQL_WARNINGS];
  DBMS_OUTPUT.PUT_LINE['$$NLS_LENGTH_SEMANTICS = ' || $$NLS_LENGTH_SEMANTICS];
END;
/

Result:

$$PLSCOPE_SETTINGS =
$$PLSQL_CCFLAGS = 99
$$PLSQL_CODE_TYPE = INTERPRETED
$$PLSQL_OPTIMIZE_LEVEL = 2
$$PLSQL_WARNINGS = ENABLE:ALL
$$NLS_LENGTH_SEMANTICS = BYTE

Note:

In the SQL*Plus environment, you can display the current values of initialization parameters, including the PL/SQL compilation parameters, with the command SHOW PARAMETERS. For more information about the SHOW command and its PARAMETERS option, see SQL*Plus User's Guide and Reference.

Assigning Values to Inquiry Directives

You can assign values to inquiry directives with the PLSQL_CCFLAGS compilation parameter. For example:

ALTER SESSION SET PLSQL_CCFLAGS = 
  'name1:value1, name2:value2, ... namen:valuen'

Each value must be either a BOOLEAN literal [TRUE, FALSE, or NULL] or PLS_INTEGER literal. The data type of value determines the data type of name.

The same name can appear multiple times, with values of the same or different data types. Later assignments override earlier assignments. For example, this command sets the value of $$flag to 5 and its data type to PLS_INTEGER:

ALTER SESSION SET PLSQL_CCFLAGS = 'flag:TRUE, flag:5'

Oracle recommends against using PLSQL_CCFLAGS to assign values to predefined inquiry directives, including compilation parameters. To assign values to compilation parameters, Oracle recommends using the ALTER SESSION statement. For more information about the ALTER SESSION statement, see Oracle Database SQL Language Reference.

Example 2-56 uses PLSQL_CCFLAGS to assign a value to the user-defined inquiry directive $$Some_Flag and [though not recommended] to itself. Because later assignments override earlier assignments, the resulting value of $$Some_Flag is 2 and the resulting value of PLSQL_CCFLAGS is the value that it assigns to itself [99], not the value that the ALTER SESSION statement assigns to it ['Some_Flag:1, Some_Flag:2, PLSQL_CCFlags:99'].

Example 2-56 PLSQL_CCFLAGS Assigns Value to Itself

ALTER SESSION SET
PLSQL_CCFlags = 'Some_Flag:1, Some_Flag:2, PLSQL_CCFlags:99'
/
BEGIN
  DBMS_OUTPUT.PUT_LINE[$$Some_Flag];
  DBMS_OUTPUT.PUT_LINE[$$PLSQL_CCFlags];
END;
/

Result:

2
99

Note:

The compile-time value of PLSQL_CCFLAGS is stored with the metadata of stored PL/SQL units, which means that you can reuse the value when you explicitly recompile the units. For more information, see "PL/SQL Units and Compilation Parameters".

For more information about PLSQL_CCFLAGS, see Oracle Database Reference.

Unresolvable Inquiry Directives

If an inquiry directive [$$name] cannot be resolved [that is, if its value cannot be determined] and the source text is not wrapped, then PL/SQL issues the warning PLW-6003 and substitutes NULL for the value of the unresolved inquiry directive. If the source text is wrapped, the warning message is disabled, so that the unresolved inquiry directive is not revealed. For information about wrapping PL/SQL source text, see Appendix A, "PL/SQL Source Text Wrapping".

Static Expressions

A static expression is an expression whose value can be determined at compile time—that is, it does not include character comparisons, variables, or function invocations. Static expressions are the only expressions that can appear in conditional compilation directives.

A static expression is an expression whose value can be determined at compilation time [that is, it does not include references to variables or functions]. Static expressions are the only expressions that can appear in conditional compilation directives.

Topics

  • PLS_INTEGER Static Expressions

  • BOOLEAN Static Expressions

  • VARCHAR2 Static Expressions

  • Static Constants

  • DBMS_DB_VERSION Package

See Also:

"Expressions" for general information about expressions

PLS_INTEGER Static Expressions

PLS_INTEGER static expressions are:

  • PLS_INTEGER literals

    For information about literals, see "Literals".

  • PLS_INTEGER static constants

    For information about static constants, see "Static Constants".

  • NULL

BOOLEAN Static Expressions

BOOLEAN static expressions are:

  • BOOLEAN literals [TRUE, FALSE, or NULL]

  • BOOLEAN static constants

    For information about static constants, see "Static Constants".

  • Where x and y are PLS_INTEGER static expressions:

    • x > y

    • x = y

    • x y

    • x >= y

    • x = y

    • x

Chủ Đề