PL/SQL中的变量

在所有的编程语言中,变量的使用是肯定都会有的,PL/SQL作为面向过程的数据库编程语言同样少不了变量,利用变量可以把PL/SQL块需要的参数传递进来,做到动态执行程序,同时也可以把值传递出去返回给用户.

product表

一、语法结构

1、变量声明语法结构

variable_name  datatype
[
    [not null]
    { := default | expr}
]

variable_name:变量名
datatype:变量数据类型,PL/SQL是一门强类型语言,使用变量、常量时必须先声明类型
not null:非空约束,使用之后必须为变量赋初始值
:= default | expr:指定变量的初始值,或者指定变量初始值的表达式(可以是文本值、其它变量、函数等)

2、常量声明语法结构

const_name  constant datatype
[
    [not null]
    { := default | expr}
]

常量定义和变量很相似,主要是通过关键字constant表明这是一个常量.
const_name:常量名
constant :表示是常量

二、变量和常量的数据类型

变量和常量的数据类型可以概括为三类:
标量类型:单一类型,不存在组合
复合类型:由几种单一类型组合而成的
参照类型:主要有游标、对象类型

1、标量类型

标量类型是我们最常用的,主要有下面几个:

数字类型
number(p,s)
                          
字符类型
char、varchar2、nchar、nvarchar2、long

日期类型
date、timestamp

布尔类型 (表中的字段不能使用布尔类型,但是PL/SQL中可以)
boolean

%type类型     
根据已有的变量数据类型或者数据库表中字段的类型

这里只列出常用的一些标量类型,下面举例演示:

declare 
  v_pid       product.pid%type;
  v_name      varchar2(20);
  v_price     number(8,2);
  v_num       number(10);
  v_address   v_pid%type;
  v_cid       varchar(36); 

  c_desc      constant varchar2(20) := '测试常量';
  v_date      date  := sysdate;
  
begin
  select p.pid, p.name, p.price, p.num, p.address, p.cid
    into v_pid, v_name, v_price, v_num, v_address, v_cid
    from product p
    where p.pid = '1';
  
  DBMS_OUTPUT.PUT_LINE('商品id:'   || v_pid);
  DBMS_OUTPUT.PUT_LINE('商品名称:' || v_name);
  DBMS_OUTPUT.PUT_LINE('商品价格:' || v_price);
  DBMS_OUTPUT.PUT_LINE('商品数量:' || v_num);
  DBMS_OUTPUT.PUT_LINE('商品生产地址:' || v_address);
  DBMS_OUTPUT.PUT_LINE('商品分类id:'   || v_cid);
  DBMS_OUTPUT.PUT_LINE('常量:' || c_desc);
  DBMS_OUTPUT.PUT_LINE('时间:' || v_date);
end;
/

2、复合类型

复合类型主要有:记录类型、表类型、varray类型
1)记录类型

形式1:
TYPE  type_name IS RECORD   --声明记录类型
(   
  variable_name1  datatype1,
  variable_name2  datatype2,
  ...
);
variable_name  type_name;   --记录类型变量
示例:
declare
    TYPE product_rec IS RECORD  
    (
        v_name  varchar2(20),
        v_price number(8,2)
    );
    v_product   product_rec;         
                        
begin
    select p.name, p.price
        into v_product
        from product p
        where p.pid = '1';
    
        DBMS_OUTPUT.PUT_LINE('商品名称:' || v_product.v_name);
        DBMS_OUTPUT.PUT_LINE('商品价格:' || v_product.v_price);
end;
/




形式2:利用 %rowtype 声明记录类型
示例:
declare
  v_product product%rowtype;
                        
begin
    select *
        into v_product
        from product p
        where p.pid = '1';
            
      DBMS_OUTPUT.PUT_LINE('商品名称:' || v_product.name);
      DBMS_OUTPUT.PUT_LINE('商品价格:' || v_product.price);
      DBMS_OUTPUT.PUT_LINE('商品数量:' || v_product.num);
      DBMS_OUTPUT.PUT_LINE('生产地址:' || v_product.address);
      DBMS_OUTPUT.PUT_LINE('商品分类:' || v_product.cid);
end;
/

2)表类型
表类型类似其它语言中的数组类型,不过PL/SQL中的表类型下标可以为负值,也可以为字符串,并且元素个数没有限制.

示例1:
declare
  TYPE name_table_type IS TABLE OF product.name%type     --声明表类型 
    INDEX BY BINARY_INTEGER;   --表明索引是数字
  name_table  name_table_type;               --定义表类型变量 
  
begin
    select name
        into name_table(-1)
        from product
        where pid = '1';
        
        DBMS_OUTPUT.PUT_LINE('商品名称:' || name_table(-1));
end;
/


示例2:
declare
  TYPE name_table_type IS TABLE OF product%rowtype     --声明表类型 
    INDEX BY BINARY_INTEGER;
  name_table  name_table_type;    --定义表类型变量 
  
begin
    select *
        into name_table(-1)
        from product
        where pid = '1';
            
      DBMS_OUTPUT.PUT_LINE('商品名称:' || name_table(-1).name);
      DBMS_OUTPUT.PUT_LINE('商品价格:' || name_table(-1).price);
      DBMS_OUTPUT.PUT_LINE('商品数量:' || name_table(-1).num);
      DBMS_OUTPUT.PUT_LINE('生产地址:' || name_table(-1).address);
      DBMS_OUTPUT.PUT_LINE('商品分类:' || name_table(-1).cid);
end;
/

示例3:
declare
  TYPE str_table_type IS TABLE OF varchar2(20)       --声明表类型 
    INDEX BY varchar2(20);          --表明索引是字符
  str_table  str_table_type;        --定义表类型变量 
  
begin
    str_table('name')  := 'GTX1080Ti';
    str_table('price') := 6000; 
    str_table('num')   := 99;    
            
      DBMS_OUTPUT.PUT_LINE('商品名称:' || str_table('name'));
      DBMS_OUTPUT.PUT_LINE('商品价格:' || str_table('price'));
      DBMS_OUTPUT.PUT_LINE('商品数量:' || str_table('num'));
end;
/

3)varray类型
该类型和数组也很相似,它的元素个数需要限制,下标是从1开始的,适合较少的数据时使用.

declare
  TYPE varr IS VARRAY(100) OF varchar2(20);    --声明varray类型
  str_array varr := varr('1','2');       --定义varray类型变量
  
begin
    str_array(1) := 'A';
    str_array(2) := 'B';     
            
        DBMS_OUTPUT.PUT_LINE(str_array(1));
    DBMS_OUTPUT.PUT_LINE(str_array(2));
end;
/

3、参照类型

1)REF CURSOR
2)REF obj_type
这两个在后面会介绍到.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容

  • PL/SQL 这是对Oracle-SQL知识点详细介绍的文章系列,其他文章如下: Oracle-SQL系列知识点(...
    GuaKin_Huang阅读 7,140评论 0 14
  • 昨天看《遇见最好的自己》,感触还是蛮多的,别总是因为迁就别人就委屈自己,这个世界上没有几个人值得你总弯腰,弯腰的...
    菜花上酸菜阅读 200评论 0 0
  • 今天朋友带孩子来家里玩,一个过几天就要过一周岁生日的小妹妹,比小六金小了三个月。小妹妹已经快会走路了,胆子很大,熟...
    Celine靓宝阅读 226评论 0 0
  • 姓名:丁秋红 所在公司:宁波绿之品电器科技有限公司 组别: 340期【反省一组】学员 【知~学习】 1、朗诵《六项...
    丁小博阅读 309评论 0 0
  • 小时候,我妈最常对我说的一句话就是:你要懂事。然后我就努力做一个懂事的孩子。任何时候我都会想着要让父母高兴,做他们...
    焕彩阅读 239评论 1 3