Friday, 13 July 2012

Declaring RECORD variables


Declare variables and constants in a PL/SQL declare block.

     name [CONSTANT] datatype [NOT NULL]
        [:= | DEFAULT expr]

   name      : The name of the variable

   datatype  : may be scalar, composite, reference or LOB

   expr      : a literal value, another variable 
               or any plsql expression involving operators & functions
For readability put only one declaration per line .

A constant MUST have it's initial value in the declaration.

Composite datatypes are TABLE, RECORD, NESTED TABLE and VARRAY

You can use [schema.]object%TYPE to define variables based on actual object datatypes.

Declaring RECORD variables

A specific RECORD TYPE corresponding to a fixed number (and datatype) of underlying table columns can simplify the job of defining variables.
%TYPE is used to declare a field with the same type as that of a specified table's column.
%ROWTYPE is used to declare a record with the same types as found in the specified database table, view or cursor.

TYPE type_name IS RECORD

 'field_declaration' is defined as:

   field_name {field_type |
               variable%TYPE |
               table.column%TYPE |
               [ [NOT NULL] {:= | DEFAULT} expr ]

        Where field_type is the datatype of the field
        (any plsql datatype except REF CURSOR)

        expr is the field_type or an initial value

Then to declare a record variable of this type..

   identifier type_name;
Declare %ROWTYPE Record variables:
      variable_name table_name%ROWTYPE
At runtime the system will evaluate the number of variables and their datatype; The columns may be based on an underlying table or a cursor.

Declare SQL*Plus bind variables.

plus > VARIABLE g_bar VARCHAR2(30)
plus > ACCEPT p_foo PROMPT 'enter the value required'

You can reference host variables in PL/SQL statements *unless* the statement is in a procedure, function or package.
This is done by prefixing with & (to read the variable) or prefix with : (writing to the variable)


-- Declare individual variables:

   v_ename emp.ename%TYPE;
   v_balance NUMBER(7,2);
   v_min_bal v_balance%TYPE := 10;

-- Declare RECORD TYPE variable:

   TYPE job_type IS RECORD
      (jobid    NUMBER(7,2),
       jobname  t_jobs.jb_name%Type);
   job_record job_type;

-- Declare a variable based on SQL*Plus Bind variable

   v_amount NUMBER(6,2) := &p_foo

-- Assign value to a SQL*Plus variable from a PL/SQL variable

   :g_bar := v_amount *12

No comments:

Post a Comment