Oracle PL/SQL编程之变量
关于Oracle变量中的点
1、变量必须要声明后才能使用,不能提前使用
2、变量可以在任何程序块中、子程序(函数、存储过程)中使用
3、变量的命名有规则:
1. 变量必须是英文字母开头,支持字母、数字、下划线、美元符号、#
2. 变量的名称最多30个字符
3. 变量名不能与数据库的表或列同名
4. 不能使用Oracle中的关键字
5. 变量不区分大小写,`v_id` 与`v_Id`是同一个变量
变量的声明与初始化
declare
v_id number(20) not null := 1;
v_address varchar2(50) :='发财市发财路88888';
v_name constant varchar2(10) :='郑大钱';
v_birthday date;
begin
dbms_output.put_line('v_id:'||v_id);
dbms_output.put_line('v_address:'||v_address);
dbms_output.put_line('v_name:'||v_name);
dbms_output.put_line('v_birthday:'||v_birthday);
end;
输出结果如下:
v_id:1
v_address:发财市发财路88888
v_name:郑大钱
v_birthday:
- := 为赋值的符号,当然还有其它为变量赋值的方式,我们后面再说
- not null 表示这个变量不能为空,必须在定义的时候就要为其赋值,相当于加了一个约束
- constant 关键字限制变量的值不能更改,也就是相当于定义了一个常量
- 变量可以声明后,当没有not null约束的时候,不赋值也不会报错,不赋值的变量,Oracle会默认将其初始值设置为空。
建议在声明变量的时候,就为其初始化,否则如果在涉及计算的时候,任何的值与NULL计算的时候,结果都是NULL。
值得注意的是,声明的变量每一行结束,都需要加;
变量的声明后重新赋值
declare
v_id number(20) not null := 1;
v_address varchar2(50) := '发财市发财路88888';
v_name constant varchar2(10) := '郑大钱';
v_birthday date;
begin
-- 对v_id 重新赋值
v_id := '2022';
dbms_output.put_line('v_id:' || v_id);
dbms_output.put_line('v_address:' || v_address);
dbms_output.put_line('v_name:' || v_name);
dbms_output.put_line('v_birthday:' || v_birthday);
end;
执行结果如下:
v_id:2022
v_address:发财市发财路88888
v_name:郑大钱
v_birthday:
q'操作符
我们在之前说过,Oracle字符串都要放在两个单引号中,但是如果我们字符串中,包含单引号,这个时候该怎么办呢?此时就可以使用q'操作符,示例如下:
declare
v_id number(20) not null := 1;
v_address varchar2(50) := q'@China'Tang@';
v_name constant varchar2(10) := q'[Magic'C]';
v_birthday date;
begin
dbms_output.put_line('v_id:' || v_id);
dbms_output.put_line('v_address:' || v_address);
dbms_output.put_line('v_name:' || v_name);
dbms_output.put_line('v_birthday:' || v_birthday);
end;
输出结果:
v_id:1
v_address:China'Tang
v_name:Magic'C
v_birthday:
我们从上面的中发现,q限bi定符后,一个使用了@,一个使用[,其实不限于这两个,这个定界符,可以指定任意的字符,只要它没有在字符中出现,都可以。
变量的常用基本数据类型
我们在声明变量的时候,需要指定变量的数据类型和长度,在Oracle中,数据的常用基本数据类型如下:
- varchar2(size): 不定长字符串类型,size为数据长度,最大32767个字符
- char(size): 定长字符串,size为数据长度,最大32767个字符
- number(p,s):数值类型,p为数值的位数,s为数值的精度。
- boolean: 布尔数据类型,一共三个值: TRUE、FALSE、NULL
- date: 日期类型
- timestamp:时间戳
char、varchar 和varchar2三者之间的区别:
varchar是标准sql中定义的,而varchar2是oracle所提供的独有的数据类型,varchar对于汉字、全角等字符占两个字节,对于数字,英文字符是一个字节,占的内存小,对于空串,varchar仍按空串处理。
varchar2一般情况下把所有字符都占两字节处理,具体要看字符集情况。比如GBK,汉字就会占两个字节,英文1个;如果是UTF-8,汉字一般占3个字节,英文还是1个,此外varchar2是存放可变长度的字符串,VARCHAR2把空串等同于null处理。
char是一种固定长度的类型,无论存储的数据多少都会固定长度,如果插入的长度小于定义长度,则可以用空格进行填充。所以char可能更会浪费空间。
%TYPE数据类型
在编程中,我们变量最常用的是保存数据库里数据,这就要求数据库中数据要和变量的类型一致,如果我们通过去查询表结构去定义,就太麻烦了,Oracle提供了一种简便的方式,不需要查询表结构,只需要指定表的字段即可,示例如下:
declare
-- 声明一个%Type类型的变量用来接收ename数据
v_emp_name emp.ename%TYPE;
begin
-- 使用select ... into ... 方式为emp赋值
select ename into v_emp_name from emp where empno='7369';
dbms_output.put_line('v_emp_name:' || v_emp_name);
end;
执行结果如下:
v_emp_name:SMITH
我们也可以使用%Type,引用自己的定义的变量,示例如下:
declare
v_name varchar2(20):='郑大钱';
v_name2 v_name%TYPE:='张三';
begin
dbms_output.put_line('v_name:' || v_name);
dbms_output.put_line('v_name2:' || v_name2);
end;
执行结果如下:
v_name:郑大钱
v_name2:张三
%Type属性的变量,不受限于NOT NULL约束
绑定变量(了解)
绑定变量又叫宿主变量,我们之前在语句块声明的变量,在程序运行后,就在内存中释放了,但是绑定变量不一样,在程序块执行完成后,变量依然可以访问,我们也可以理解成全局变量,示例代码如下:
SQL> variable v_name varchar2(20);
SQL>
SQL> begin
2 :v_name :='2022';
3 end;
4 /
PL/SQL procedure successfully completed
v_name
---------
2022
SQL> print v_name
v_name
---------
2022
SQL>
引用绑定变量,需要在变量名前加上:
大对象变量
当要存储大量的数据时候,就需要大对象数据类型,主要为两种数据类型:BLOB、CLOB.
1、CLOB:主要存储单字节的大对象
2、BLOB:用于存储大的二进制对象
变量名称命名规范建议
1、v_变量名:普通变量
2、c_变量名:常量
3、p_变量名:替代变量
4、g_变量名:全局变量