--1定义标量变量
--(1)定义语法
变量名 [constant] 数据类型 [not null] [:= | default expr]
-- constant:用于指定常量。必须指定初始值
-- := 用于为变量和常量指定初始值
-- expr初始值的pl/sql表达式,可以是文本值、变量、函数等
--示例1:
v_name varchar2(10);
v_rate constant number(3,2) := 5.5;
v_valid boolean not null default false;
--(2)使用
--变量赋值使用等号前加冒号(:=)
--示例2:
declare
v_name varchar2(10);
v_money number(6,2);
c_tax_rate constant number(3,2) := -0.03;
v_tax_money number(6,2);
begin
select user_name,game_money into v_name,v_money
from user_info where user_id = 100000;
v_tax_money := v_money*c_tax_rate;
dbms_output.put_line('name:'||v_name);
dbms_output.put_line('money:'||v_money);
dbms_output.put_line('rate:'||v_tax_money);
end
--(3)使用%TYPE属性
v_name user_info.user_name%TYPE;
v_money user_info.game_money%TYPE;
c_tax_rate constant number(3,2) := -0.03;
v_tax_money v_money%TYPE;
--变量v_name,v_money与user_info表的user_name,game_money列的类型和长度完全一致
--变量v_tax_money与变是v_money的类型和长度完全一致
--2复合变量
--(1)pl/sql记录(类似于结构)
-- 在定义部分定义记录类型和记录变量,在执行部分引用该记录变量
-- 引用记录成员时必须要加记录变量作为前缀(记录变量。记录成员)
--示例3:
declare
TYPE record_type IS RECORD(
v_name user_info.user_name%TYPE,
v_money user_info.game_money%TYPE
);
emp_record record_type;
begin
select user_name,game_money into emp_record
from user_info where user_id = 100000;
dbms_output.put_line('name:'||emp_record.v_name);
dbms_output.put_line('money:'||emp_record.v_money);
end
--(2)pl/sql表(类似于数组)
-- pl/sql表与数组区别:下标没有上下限,个数年没有限制,下票可以为负值
-- 必须先在定义部分定义pl/sql表类型和pl/sql表变量,在执行部分引用该pl/sql表变量
--示例4:
declare
TYPE name_table_type IS TABLE OF user_info.user_name%TYPE
INDEX BY BINARY_INTEGER;
v_name name_table_type;
begin
select user_name into v_name(-1)
from user_info where user_id = 100000;
dbms_output.put_line('name:'||v_name(-1));
end
--(3)嵌套表
--(4)VARRAY(变长数组)
--3 参照变量
-- 用于存放数值指针的变量。
--(1)游标变量(REF CURSOR)
-- 静态游标:需要在定义游标时指定相应的select语句
-- 示例5:
declare
type c1 is ref cursor;--c1为ref cursor类型
emp_cursor c1;--emp_cursor为游标变量
v_name user_info.user_name%TYPE;
v_money user_info.game_money%TYPE;
begin
open emp_cursor for --打开游标变量时指定了对应的select语句
select user_name,game_money from user_info where user_id = 100000;
loop
fetch emp_cursor into v_name,v_money;
exit when emp_cursor%notfound;
dbms_output.put_line(v_name);
end loop;
end;
-- 动态游标:在定义游标变量时不要需指定相应的select语句,而是打开游标时指定select语句
--(2)对象类型变量(REF obj_type)
-- 是指向对象实例的指针
-- 示例6:
create or replace type home_type as object(--建立对象类型
street varchar2(50),city varchar2(20),
state varchar2(20),zipcode varchar2(6),
owner varchar2(10)
);
create table homes of home_type;--建表
insert into homes values('上海路100号','上海','200000','junly');
commit;
--对象表homes存放家庭地址及户主姓名,如每个家庭有四口人,为了同一家庭成员共享家庭地址,
--可使用REF引用home_type对象类型,从而降低占用空间。
create table person(
id number(6) primary key,
name varchar2(10),
addr ref home_type
);
insert into person select 1,'junly',ref(p) from homes p where p.owner='junly'
insert into person select 2,'junl2',ref(p) from homes p where p.owner='junly'
--person表插入数据时,addr列将存入指向homes表相应数据的地址指针
--4 LOB变量
/**//*用于存储大批量数据的变量
(1)内部LOB
CLOB 支技事务操作 存储数据库中 用于存储大批量字符数据
BLOB 支技事务操作 存储数据库中 用于存储大批量二进制数据
NCLOB 支技事务操作 存储数据库中 用于存储大批量字符数据
(2)外部LOB
BFILE 不支技事务 存在OS文件中 存储指向OS文件的指针
*/
--5非PL/SQL变量
posted on 2010-07-28 12:01
junly 阅读(1099)
评论(0) 编辑 收藏 所属分类:
oracle/mysql/sql