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
这两个在后面会介绍到.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

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

友情链接更多精彩内容