zoukankan      html  css  js  c++  java
  • Oracle(00):PL/SQL数据类型

    一、标量类型

    标量:容纳单个值,没有内部组成。

    • Number 数字类型

    • BINARY_INTEGER
    • NUMBER
    • 子类型是 DEC、DECIMAL、DOUBLE PRECISION、FLOAT、INTEGER、INT、NUMERIC、REAL、SMALLINT
    • PLS_INTEGER

    Character 字符类型

    • CHAR:定长字符串。范围:0-32767 可选,确省=1
    • VARCHAR2:可变字符串。0-32767。默认=4000
    • RAW
    • LONG 和 LONG RAW:变长字符串
    • ROWID 和 UROWID
    • NCHAR
    • NVARCHAR2

    Datetime 和 Interval 日期类型

    • DATE
    • TIMESTAMP
    • TIMESTAMP WITH TIME ZONE
    • TIMESTAMP WITH LOCAL TIME ZONE
    • INTERVAL YEAR TO MONTH
    • INTERVAL DAY TO SECOND

    BOOLEAN 布尔类型

    • 用于存储逻辑值(TRUE、FALSE 和 NULL)
    • 不能向数据库中插入 BOOLEAN 数据
    • 不能将列值提取或选择到 BOOLEAN 变量中
    • 只允许对 BOOLEAN 变量执行逻辑操作

    1、定义标量类型

    简单语法:变量名 数据类型;
    完整语法:变量名 [constant] 变量类型 [not null] [default 值 | :=值]

    v1 char;
    v2 varchar2(10);
    v3 number;
    v4 number(5);
    v5 number(5,2);
    v6 date;
    v7 number default 10;

    如果在定义变量时么可有指定初始值, 则初始化值为NULL。

    2、%type,rowtype类型

    %type–用于按照数据数据库或其他变量定义变量(其数据类型和长度完全一致)

    表%rowtype:保存了某一行记录的所有字段的值。

    oldfare fare.first_fare%TYPE;
    newfare oldfare%TYPE;
    
    emp_rec employee%ROWTYPE;--%rowtype–代表表中的行
    --可以使用下列属性引用特定字段 
    emp_rec.emp_num;

    二、复合类型:

    • RECORD 记录类型:一个记录类型的变量只能保存从数据库中查询出的一行记录,若查询出了多行记录,就会出现错误。

      DECLARE
      --定义与hr.employees表中的这几个列相同的记录数据类型
         TYPE RECORD_TYPE_EMPLOYEES IS RECORD(
              f_name   hr.employees.first_name%TYPE,
              h_date   hr.employees.hire_date%TYPE,
              j_id     hr.employees.job_id%TYPE);
      --声明一个该记录数据类型的记录变量
         v_emp_record RECORD_TYPE_EMPLOYEES;
       
      BEGIN
         SELECT first_name, hire_date, job_id INTO v_emp_record
         FROM employees
         WHERE employee_id = &emp_id;
       
         DBMS_OUTPUT.PUT_LINE('雇员名称:'||v_emp_record.f_name
                   ||'  雇佣日期:'||v_emp_record.h_date
                   ||'  岗位:'||v_emp_record.j_id);
      END;
    • Table:与记录类型相似,但它是对记录类型的扩展。它可以处理多行记录,类似于高级中的二维数组,使得可以在PL/SQL中模仿数据库中的表。

      Declare
        type MyRefCur  is  ref  cursor;
        vrefcur myrefcur;
        vtemp  vrefcur%rowtype;
       begin
        case(&n)
         when  1 then open vrefcur  for select   *   from emp;
         when  2 then open vrefcur  for select   *   from dept;
         else 
          open vrefcur  for select   eno,  ename  from emp where job = 'CLERK';
        end case;
      
      loop
          fetch  vrefcur into  vtempb;
          exit  when  vrefcur%notfound;
          dbms_output.put_line(vrefcur%rowcount||'  '||vtempb);
       end Loop;
      close  vrefcur;
       end;
    • VARRAY:数组是具有相同数据类型的一组成员的集合。每个成员都有一个唯一的下标,它取决于成员在数组中的位置。

      declare
      --定义一个最多保存5个VARCHAR(25)数据类型成员的VARRAY数据类型
         type reg_varray_type is varray(5) of varchar(25);
      --声明一个该VARRAY数据类型的变量
         v_reg_varray REG_VARRAY_TYPE;
       
      begin
      --用构造函数语法赋予初值
         v_reg_varray := reg_varray_type
               ('中国', '美国', '英国', '日本', '法国');
       
         DBMS_OUTPUT.PUT_LINE('地区名称:'||v_reg_varray(1)||''
                                          ||v_reg_varray(2)||''
                                          ||v_reg_varray(3)||''
                                          ||v_reg_varray(4));
         DBMS_OUTPUT.PUT_LINE('赋予初值NULL的第5个成员的值:'||v_reg_varray(5));
      --用构造函数语法赋予初值后就可以这样对成员赋值
         v_reg_varray(5) := '法国';
         DBMS_OUTPUT.PUT_LINE('第5个成员的值:'||v_reg_varray(5));
      end;
    • NESTED TABLE:

    三、参照类型:

    • REF CURSOR :REF游标变量是一种 引用 REF游标类型  的变量,指向动态关联的结果集

      Declare
        type MyRefCur  is  ref  cursor;
        vrefcur myrefcur;
        vtemp  vrefcur%rowtype;
       begin
        case(&n)
         when  1 then open vrefcur  for select   *   from emp;
         when  2 then open vrefcur  for select   *   from dept;
         else 
          open vrefcur  for select   eno,  ename  from emp where job = 'CLERK';
        end case;
      
      loop
          fetch  vrefcur into  vtempb;
          exit  when  vrefcur%notfound;
          dbms_output.put_line(vrefcur%rowcount||'  '||vtempb);
       end Loop;
      close  vrefcur;
       end;
    • REF操作符

    四、LOB类型:

    1. BFILE (Movie)
      存放大的二进制数据对象,这些数据文件不放在数据库里,而是放在操作系统的某个目录里,数据库的表里只存放文件的目录。
    2. BLOB(Photo)
      存储大的二进制数据类型。变量存储大的二进制对象的位置。大二进制对象的大小<=4GB。

    3. CLOB(Book)
      存储大的字符数据类型。每个变量存储大字符对象的位置,该位置指到大字符数据块。大字符对象的大小<=4GB。

    4. NCLOB

      存储大的NCHAR字符数据类型。每个变量存储大字符对象的位置,该位置指到大字符数据块。大字符对象的大小<=4GB。

    五、pl/sql变量声明和复制。

    变量为数据的临时存储

    • 变量在声明部分中声明,可以在 SQL 语句和过程语句中使用、在可执行部分中赋予新值。
    • 变量的作用域为变量声明开始到当前语句块结束。
    DECLARE 
       declarations ——定义常量,变量,函数、复杂数据类型、游标和异常处理名称等
    BEGIN        
       executable statements ——PL/SQL语句和SQL语句
    EXCEPTION
       handlers
    END;

    变量声明

    oldfare NUMBER(5);
    m_name VARCHAR(15);
    cont BOOLEAN;

    赋值

    oracle中变量赋值方式是值复制而非引用 ,通过使用赋值操作符“:=”,将变量放在“:=”左侧,而将包含数据量、变量、算术操作符或 PL/SQL 函数调用的表达式放置在右侧来对变量赋值。示例

    emp_rec.dept_code := ‘MKTG’;
    num := 100;

    1、还可以按如下方法使用 SELECT INTO 对变量赋值
    SELECT <列名> INTO <变量名> FROM <表名> WHERE <条件>;
    示例

    SELECT first_fare INTO oldfare
    FROM fare WHERE route_code = ‘SAN-LOU’;

    SELECT 语句执行后,仅当它检索一行时,SELECT 才成功操作 ,检索了多行和不检索任何行的情况将导致错误并产生异常处理程序 。

    2、使用“&”操作符及赋值操作符可以接受用户输入的值

    mbranch_code :=&mcode’;
    num := &num;

    “mcode”是绑定变量,不应该声明,但是需要声明 mbranch_code

  • 相关阅读:
    一轮项目冲刺9
    一轮项目冲刺8
    一轮项目冲刺7
    一轮项目冲刺6
    一轮项目冲刺5
    一轮项目冲刺4
    一轮项目冲刺3
    一轮项目冲刺2
    一轮项目冲刺1
    移山小分队---每日记录01
  • 原文地址:https://www.cnblogs.com/springsnow/p/9394926.html
Copyright © 2011-2022 走看看