首页 > 代码库 > 5.PL_SQL——变量的种类以及如何声明变量(autoprint, %TYPE)

5.PL_SQL——变量的种类以及如何声明变量(autoprint, %TYPE)

一、变量的种类

        PL/SQL中变量主要有以下几类:

Scalar:标量,单一变量,如IntegerCharacter等等,最为常见,使用最广;

Composite复合变量,里面还有多种子结构,如数组等,使用也比较广泛;

Reference引用类型,类似指针,指向某个类型

Large objectLOB):CLOBCharacterLarge Object,存储文档),BLOBBinary Large Object,存储二进制文件,如图片、声音等)

Non-PL/SQL variables Bindvariables:绑定变量,环境变量。所谓环境就是指的PL/SQL所允许的环境,因为PL/SQL可以运行在C语言,JAVA语言等等语言中,C语言和JAVA语言就是PL/SQL的环境,有环境就需要对环境进行一些定义和配置,这就是这种变量的作用。

 

二、声明和初始化变量的标准

        变量声明和初始化应遵循以下标准

1. 遵循命名规范,这样有利于代码的可维护性

2. 见名知意,使用有意义的名字

3. 每一行定义一个变量,以便与代码的维护

4.对于定义为非空或常量的变量进行初始化

5. 使用":="或者“DEFAULT”来赋初值

6.不要使用列名来作为变量名以防止混淆:因为如果一个变量和列名一样,PL/SQL则优先将其解释为列名。如下面这个例子:


SQL> edit

   

DECLARE
   employee_id NUMBER(6);
BEGIN
   SELECT employee_id
   INTO       employee_id
   -- 变量名和列名重复了,容易发生混淆
   FROM    employees
   WHERE   last_name = ‘Kochhar‘;
   DBMS_OUTPUT.PUT_LINE(‘The resultis ‘ || employee_id);
END;

SQL> /

Theresult is 101
PL/SQLprocedure successfully completed.

           其中变量名和列名重合了,虽然有时候可以运行,但无法保证结果正确。

           7. 如果constraint定义为NOT NULL,则声明时必须为其赋初值。

 

三、各类型变量详解

1. Scalar Variable标量

    Scalar变量是使用最广泛的一种变量,它只包含单一的值,内部没有更复杂的结构,例如:

                TRUE——Boolean

                25-JAN-01——Date

                256120.08——Number

    Atlanta”——String

              The Soul ofthe lazy man desires, and he has nothing; but the soul of the diligent shall bemade rich.——String(如果该值不长,比如CHARVARCHAR通常最多可存储20004000个字符,则可以作为字符串,否则最好作为CLOB类型,即无结构文档);

                                               

常见的Scalar变量主要有以下几种:

                CHAR [(maximum_length)] ——长度不可变

                VARCHAR (maximum_length) ——长度可变

                NUMBER [(precisionscale)]

                BINARY_INTEGER

                BINARY_FLOAT

                BINARY_DOUBLE

                PLS_INTEGER

                BOOLEAN

                DATE

                --------------以下几类在内部其实都存储为数字-----

                TIMESTAMP

                TIMESTAMP WITH TIME ZONE

                TIMESTAMP WITH LOCAL TIME ZONE

                INTERVAL YEAR TO MONTH

                INTERVAL DAY TO SECOND

               

                下这个例子演示了如何定义Scalar变量:

 

  DECLARE
     v_emp_job            VARCHAR2(9)
     v_count_loop         BINARY_INTEGER := 0;
     v_dept_total_sal     NUMBER(9,2) := 0;
     v_orderdate          DATE := SYSDATE + 7;
     c_tax_rate           CONSTANT NUMBER(3,2):= 8.25;
     v_valid              BOOLEAN NOTNULL := TRUE;
     ...

      Scalar变量中的布尔型变量有以下几个特点:

                1. OracleBOOLEAN型的变量和其他编程语言不同,它除了TRUEFALSE以外,还有NULL值;

                2. 在进行条件判断时,可以使用逻辑操作符: AND, ORNOT

                3. 数字、字符和表达式都可以返回布尔型的值。

 

2. Bind Variable绑定变量

 

绑定变量也称为环境变量,PL/SQL中的环境变量有以下特点:

     1. 在特定环境中创建:如在C语言中,或者是在JAVA语言中;

     2. 由于它是在环境中创建的,故也称为宿主变量;

     3. 如果是在sql*plus中使用,则用关键字 VARIABLE来定义它;

     4. 它可以用在SQL语句中,也可以用在PL/SQL块中;

     5.即使PL/SQL块执行结束了,该环境变量仍然能够访问,因为即使程序结束了,环境是不会结束的;

     6. 引用环境变量时,要在环境变量前面加上冒号“:”

               

下面来举例演示如何使用绑定变量:

SQL> VARIABLE b_salary NUMBER;

-- sql*plus中定义环境变量,使用VARIABLE关键字

SQL> edit

BEGIN  
        SELECT salary
        INTO  :b_salary
     -- 在PL/SQL块中引用绑定变量b_salary时,需要在变量前面加上冒号
        FROM  employees
        WHERE employee_id = 178;
END;
PL/SQLprocedure successfully completed.

 

SQL> PRINT b_salary;

--PL/SQL块已经运行完毕了,仍然能够访问到变量b_salary;
-- PRINT是sql*plus的命令,且现在不在PL/SQL块中,故引用该变量时无需加上冒号
  B_SALARY
----------
      7000

SQL> SELECT first_name, last_name FROMemployees WHERE salary =:b_salary;

 -- 由于b_salary是环境变量,故还能访问到;这里执行的是SQL语句,故需要使用冒号表示引用
FIRST_NAME           LAST_NAME
---------------------------------------------
Oliver               Tuvault
Sarath               Sewall
Kimberely            Grant

 

如果设置autoprint为打开状态,则可以将结果自动打印到屏幕上

 

SQL> VARIABLE b_emp_salary NUMBER

SQL> SET AUTOPRINT ON

# 设置自动打印功能

SQL> edit

  1 DECLARE
  2    v_empno NUMBER(6) :=&empno;
  3 BEGIN
  4    SELECT salary
  5    INTO :b_emp_salary
  6              FROM employees
  7     WHERE  employee_id = v_empno;
 8  END;
 9  /
Entervalue for empno: 178
old   2:       v_empno NUMBER(6) :=&empno;
new   2:     v_empno NUMBER(6) :=178;
PL/SQLprocedure successfully completed. 
B_EMP_SALARY
------------
 7000

3. LOB Large Object 数据类型

LOB类型的数据主要有以下几种:

                A. CLOB——用来存放字符串;

                B. BLOB——用来存放二进制文件,如图片等;

                C. BFILE——因为这类文件体积很大,故存放在磁盘上,而数据库中存放的只是指针,而不是文件本身,它的访问速度可能会比BLOB更快

                D. NCLOB——用来存放一些非英文字母的文字

 

4. Composite 复合变量

       复合型变量中可以存放多种其他类型的变量,如RECORD, AREA,TABLE等类型的变量,其中还可以存放布尔型、日期型、字符型、LOB型的其他变量。

wKioL1PqcCGRmzlqAADfAuQAKq8325.png

 

四、 %TYPE的作用


%TYPRPL/SQL中独有的一种属性。比如以下这个语句:

                SELECT first_name

                INTO v_fname

其中fist_namev_fname的值是同一列,为了避免hardcode,即将代码写死在程序里,就可以用到%TYPE,在声明变量时使用%TYPE来表明该变量的数据类型和数据库中某张表某一列的数据类型是一致的。

 

以下两种情况可以用到%TYPE

                1. 和数据库中某一列类型相同;

                2. 和另外一个已经声明过了变量类型相同。

 

使用%TYPE时需要加上前缀,这些前缀可以是:

                1. 数据库中的表名和列名;

                2. 已经定义过的变量名。

使用%TYPE来定义变量的格式如下:

               

                identifier table.colum_name%TYPE;

               

下面来举例说明%TYPE的用法:

1.

           

 ...
 emp_lname       employees.last_name%TYPE;
-- 定义一个变量emp_lname,它的数据类型和employees这个表中的last_name这一列是一致的
 ...

2.            

    ...
    balance      NUMBER(7,2);
    -- 定义第一个变量 balance,其数据类型为NUMBER
    min_balance  balance%TYPE:=1000;
    -- 定义第二个变量min_balance,其数据类型引用前一个变量balance的数据类型
    ...

 

 


本文出自 “重剑无锋 大巧不工” 博客,请务必保留此出处http://wuyelan.blog.51cto.com/6118147/1539211