定义并使用变量

PL/SQL有四种类型:标量类型,复合类型,引用类型(reference),LOB(Large Obejct)类型

一.标量类型

最常用的就是标量类型,是指只能存放单个数值的变量,包括数字类型、字符类型、日期类型和布尔类型,每种类型又包含相应的子类型。

常量标量类型如下:

VARCHAR2 (n) , CHAR (n), NUMBER (p,s),DATE, TIMESTAMP , LONG , LONG   RAW ,BOOLEAN,BINARY_INTEGER(仅PL / SQL使用),BINARY_FLOAT和BINARY_DOUBLE(10g新引入的)

定义标量:

identifier [CONSTANT] datatype [NOT NULL] [:=| DEFAULT expr]

使用标量需要注意的是=号被:=取代,与delphi一样的赋值符号@_@

例子:

v_name  VARCHAR2 ( 10 );

v_rate CONSTANTS  NUMBER ( 4 , 2 ) : = 3.04 ;

为了防止定义的变量类型与表中的字段类型不一致,可以使用%TYPE来定义:

v_name employee.name % TYPE;

如上面所示,v_name的类型就与表employee中的name字段类型一样!!

二。复合变量:

用于存放多个值的变量称为复合变量,包括PL/SQL记录,PL/SQL表,嵌套表和VARRAY四种类型

1。PL/SQL记录

类似于C/C++中的结构概念:

declare
   TYPE employee_record  is  RECORD(
     id employee.id % TYPE,
     name employee.name % TYPE,
     email employee.email % TYPE);
   em_record employee_record;
begin
    select  id,name,email  into  em_record  from  employee  where  name =& name;
   dbms_output.put_line( ' 雇员名: ' || em_record.name || '  雇员ID: ' || em_record.id);
end ; 

2。PL/SQL表,类似于数组概念,不同的是PL/SQL表允许负值下标,而且没有上下限,如:

declare
   TYPE employee_table  is   table   of  employee.name % TYPE  index   by  BINaRY_INTEGER;
   em_table employee_table;
begin
    select  name  into  em_table( - 1 )  from  employee  where  name =& name;
   dbms_output.put_line( ' 雇员名: ' || em_table( - 1 ));
end ; 

3。嵌套表,与PL/SQL表相似,不同的是嵌套表可以做表列的数据类型,而PL/SQL表不能,使用嵌套表作为表列时,必须为其指定专门的存储表,如:

create   or   replace  TYPE emp_type   as  OBJECT(
  name  VARCHAR2 ( 10 ),salary  NUMBER ( 6 , 2 ),hiredate DATE);

CREATE   OR   REPLACE  TYPE emp_array  IS   TABLE   OF  emp_type;

  CREATE   TABLE  department(
    deptno  NUMBER ( 2 ),dname  VARCHAR2 ( 10 ),
    employee emp_array)NESTED  TABLE  employee STORE  as  employee_dept;

4。VARRAY(变长数组),与嵌套表相似,也可以做为表列的数据类型,但是嵌套表没有个数限制,而VARRAY有个数限制,如:

CREATE TYPE TEST_ARRAY IS VARRAY(20) OF emp_type;

三。引用变量(reference)

类似于C++中的指针或者JAVA中引用的概念,用于存放数值指针的变量,使用此变量,可以使得应用程序共享相同对象,降低占用空间。此类有两种类型:游标(REF CURSOR)和对象类型(REF OBJECT)

1。REF CURSOR,定义时同时指定SELECT语句的游标称为显式或者静态游标,在打开时才指定SELECT语句的游标称为动态游标,如:

  DECLARE  
     TYPE c1  IS  REF  CURSOR ;
     emp_cursor c1;
     v_name employee.name % TYPE;
     v_sal employee.salary % TYPE;
     begin
      open  emp_cursor  for
        SELECT  name,salary  FROM  EMPLOYEE ;
     LOOP
        FETCH  emp_cursor  INTO  v_name,v_sal;
        EXIT   WHEN  emp_cursor % NOTFOUND;
       dbms_output.put_line(v_name);
      END  LOOP;
      close  emp_cursor;
     end ;  

2。REF OBJECT,与JAVA的引用概念相同,存储的是指向对象的指针

四。LOB类型

LOB类型是指用于存储大批量数据的变量,包括内部的3种(CLOB,BLOB,NCLOB)和外部LOB(BFILE)。

CLOB,NCLOB用于存储大量的字符数据。

BLOB用于存储大批量二进制数据(如图象)。

BFILE则存储指向OS文件的指针。

文章转自庄周梦蝶  ,原文发布时间5.17

PL/SQL学习笔记(二)相关推荐

  1. 判断题:oracle自带的sql语言环境是pl/sql,Oracle之PL/SQL学习笔记之数据类型(三)

    Oracle之PL/SQL学习笔记之数据类型(三) 所有的编程语言中变量是使用最频繁的.PL/SQL作为一个面向过程的数据库编程语言同样少不了变量,利用变量可以把PL/SQL块需要的参数传递进来,做到 ...

  2. Oracle之PL/SQL学习笔记之有名块练习

    2019独角兽企业重金招聘Python工程师标准>>> Oracle之PL/SQL学习笔记之有名块练习 存储过程案例: 案例1: 根据雇员姓名跟新雇员工资,如果雇员不存在输出没有该雇 ...

  3. PL/SQL学习笔记-常量变量及数据类型初步

    一:常量和变量 开始之前,还是照例做个经典的例子,如下: declare mydate varchar2(16) := 'hellow world'; begindbms_output.put_lin ...

  4. PL/SQL学习笔记(四)

    这部分主要讲述在PL/SQL中如何访问oracle (一)检索单行数据 在PL/SQL嵌入select语句,使用方法: SELECT select_list INTO variable_name1,v ...

  5. PL/SQL学习笔记之存储过程

    一:PL/SQL的两种子程序 子程序:子程序是执行一个特定功能.任务的程序模块.PL/SQL中有两种子程序:函数  和  过程. 函数:主要用于计算并返回一个值. 过程:没有直接返回值,主要用于执行操 ...

  6. PL/SQL学习笔记(二)—— 执行语句

    一.语法 execute immediate SQL语句/PLSQL代码块 into 变量 [using 参数1,参数2,--]: using后面的参数要与into后面的变量及变量的数据类型对应起来 ...

  7. PL/SQL学习笔记-过程

    一:创建和修改一个过程 create or replace procedure xland_proc (v_title in varchar2,v_int out number) is v_char ...

  8. PL/SQL学习笔记-循环控制与顺序控制

    一:LOOP...END LOOP 先看代码 declare v_flag number := 1; begin loop exit when v_flag>16;v_flag := v_fla ...

  9. My SQL 学习笔记二

    本文主要记录这两天遇到的问题: 1.sql脚本文件存在自己的目录下,例如在F盘,通过命令:mysql> source F:/filename.sql 会弹出Failed  to open fil ...

最新文章

  1. 怎么定义图像的质量?如何评价图像的质量?
  2. {ValueError}invalid literal for int() with base 10: ‘1.0‘
  3. Java NIO、NIO.2学习笔记
  4. java执行python路径_java调用其它语言脚本(python、js)
  5. C++11新特性之八——函数对象function
  6. docker容器的标准使用过程_docker容器的使用
  7. 三组划分//巧妙填数
  8. stm32死机问题的处理
  9. 试除法判定质数、试除法分解质因数(附例题)
  10. 2台电脑一根网线传文件_安卓端和Mac快速连接传文件
  11. 猫眼电影诛仙评论爬取并进行数据分析
  12. 第三届中国移动开发者大会(MDCON.2015)
  13. js绑定事件和解绑事件的方法
  14. python输入abcd输出对应的1234_python语法部分
  15. 20190925-ORA-00600错误及被注入的软件
  16. 2/3/4/5G、NB、Cat.1网络对比
  17. Word控件Spire.Doc 【文本】教程(5) ;从 Word 文档中的文本框中提取文本
  18. 国内各大银行数据汇总
  19. 浏览器提示(KB927917)解决方案
  20. Redis io多线程

热门文章

  1. 解决 php提交表单到当前页面,刷新会重复提交 的问题
  2. STP:生成树协议解决网络冗余问题
  3. Scala官网下载不下来问题-已解决
  4. vue添加滚动事件,解决简书Carol_笑一笑方案中vue移除滚动事件失效的问题
  5. Kubernetes master无法加入etcd 集群解决方法
  6. 【java】javac命令在win10不可用,提示javac不是内部或外部命令,也不是可运行的程序【解决方法】
  7. VS2012 无法启动IIS Express Web服务器的解决方案
  8. 解决“Cannot merge new index 67208 into a non-jumbo instruction”的问题
  9. 在sql中使用函数,遇到net.sf.jsqlparser.parser.ParseException异常
  10. 为什么NaN - NaN == 0.0与英特尔C ++编译器?