随笔-124  评论-49  文章-56  trackbacks-0
--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(6primary 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

只有注册用户登录后才能发表评论。


网站导航: