一、声明字符变量
字符数据类型包括CHAR,VARCHAR2和LONG。
DECLAREv_emp_job VARCHAR2(9);v_order_no VARCHAR2(6);v_product_id VARCHAR2(10);v_rpt_body_part LONG;
…
二、声明数字变量
数字数据类型包括NUMBER,PLS_INTEGER,BINARY_INTEGER和BINARY_FLOAT。 在语法中,CONSTANT约束变量,使其值不能改变。 常量必须初始化。 INTEGER是NUMBER(38,0)的别名。
DECLAREv_dept_total_sal NUMBER(9,2) := 0;v_count_loop INTEGER := 0;c_tax_rate CONSTANT NUMBER(3,2) := 8.25;…
(1)声明日期变量
日期数据类型包括DATE,TIMESTAMP和TIMESTAMP WITH TIMEZONE。
DECLAREv_orderdate DATE := SYSDATE + 7;v_natl_holiday DATE;v_web_sign_on_date TIMESTAMP;
…
(2)声明布尔变量
布尔值是存储用于逻辑计算的三个可能值之一的数据类型:TRUE,FALSE或NULL。
DECLAREv_valid BOOLEAN NOT NULL := TRUE;v_is_found BOOLEAN := FALSE;v_underage BOOLEAN;
…
声明布尔变量细节
声明布尔变量时:
•只能将值TRUE,FALSE和NULL分配给布尔变量。•条件表达式使用逻辑运算符AND和OR,而运算符不检查变量值。
•变量总是产生TRUE,FALSE或NULL。
•您可以使用算术,字符和日期表达式来返回布尔值。
三、声明和初始化PL / SQL变量的准则
只有值TRUE,FALSE和NULL可以分配给布尔变量。•使用有意义的名称并遵循命名约定。
•为了更好的可读性,代码维护和更简单的评论,每行声明一个标识符。
•当变量必须保存一个值时,使用NOT NULL约束。
•避免使用列名作为标识符。
DECLAREcountry_id CHAR(2);
BEGINSELECT country_idINTO country_idFROM countriesWHERE country_name = 'Canada';
END;
四、使用%TYPE属性固定变量
您可以使用%TYPE属性根据另一个先前声明的变量或数据库列声明变量,而不是对变量的数据类型和精度进行硬编码。当存储在变量中的值是从数据库中的表派生时,最常使用%TYPE属性。
当你使用%TYPE属性声明一个变量时,你应该用数据库表和列名作为前缀。
(1)%TYPE属性
看看这个数据库表和使用它的PL / SQL块。 这个PL / SQL块将正确的薪水存储在v_emp_salary变量中。 但是如果表格列稍后改变呢?CREATE TABLE myemps (emp_name VARCHAR2(6),emp_salary NUMBER(6,2));
DECLAREv_emp_salary NUMBER(6,2);
BEGINSELECT emp_salary INTO v_emp_salaryFROM myemps WHERE emp_name = 'Smith';
END;
(2)%TYPE属性详细信息
%TYPE属性:•用于自动给变量赋予与以下相同的数据类型和大小:
- 数据库列定义
- 另一个声明的变量
•带有以下任一项的前缀:
- 数据库表和列
- 其他声明变量的名称
(3)用%TYPE属性声明变量
句法:
identifier table.column_name%TYPE;
例子:
...v_emp_lname employees.last_name%TYPE;v_balance NUMBER(7,2);v_min_balance v_balance%TYPE := 1000;
...
(4)%TYPE属性的优点
%TYPE属性的优点是:
•您可以避免由数据类型不匹配或错误精度造成的错误。
•如果列定义更改,则不需要更改变量声明。 也就是说,如果您已经为特定的表格声明了一些变量而不使用%TYPE属性,那么如果声明变量的列被更改,那么PL / SQL块可以返回错误。
•当您使用%TYPE属性时,PL / SQL将在编译块时确定变量的数据类型和大小。 这确保了这样的变量总是与用于填充它的列兼容。
(5)%TYPE属性
再看看数据库表和PL / SQL块。现在,即使列数据类型稍后发生更改,PL / SQL块仍会继续正常工作。CREATE TABLE myemps (emp_name VARCHAR2(6),emp_salary NUMBER(6,2));
DECLAREv_emp_salary myemps.emp_salary%TYPE;
BEGINSELECT emp_salary INTO v_emp_salaryFROM myemps WHERE emp_name = 'Smith';
END;