PL/SQL语言基础(原创)

简介:

PL/SQL概述

PL/SQL是过程化的SQL语言,是ORACLE对SQL语言的扩展,在普通SQL语句的基础上增加了编程语言的特点。使得该语言不仅具有过程编程语言的特征,如循环、条件分支等。同时也具有对象编程语言的特征,如重载、继承等。
PL/SQL程序语言的组成
主要由块组成
一个块由三个基本部分组成:声明、执行体、异常处理
PL/SQL块有匿名块和命名块
命名块会将代码保存到服务器
    典型的块结构如下
        [ DECLARE                    --声明部分
            declaration_statements
        ]
        BEGIN
            executable_statements   --执行体部分
        [EXCEPTION
            exception_handling_statements    --异常处理部分
        ]
        END;
        /
PL/SQL的语言优点有:支持SQL;高生成率,性能好;可移植性;与Oracle集成。

PL/SQL的语法要素
PL/SQL语法要素包括字符集、标识符、文本、分隔符、注释等。
字符集:
        包括英文大小写
        0-数字
        空白符、制表符、空格
        一些特殊符号,如~、!、@、#等
        PL/SQL字符集不区分大小写
标识符:
        变量、常量、子程序的名称
        以字母开头、最大长度个字符
        包含空格等特殊符号时,要用英文双引号括起来
文字:
        数值型
            可用常规表示,也可以用科学计数法和幂的形式
        字符型
            字符型用单引号括起
        日期型
        布尔型
            TRUE、FALSE、NULL
PL/SQL的数据类型
        NUMBER     数字型能存放整数值和实数值,并且可以定义精度和取值范围
                  DEC    数字型NUMBER的子类型,小数
                  DOUBLE PRECISION     数字型NUMBER的子类型,高精度实数
                  INTEGER     数字型NUMBER的子类型,整数
                  INT         数字型NUMBER的子类型,整数
                  NUMERIC     数字型NUMBER的子类型,与NUMBER等价
                  REAL        数字型NUMBER的子类型,与NUMBER等价
                  SMALLINT    数字型NUMBER的子类型,取值范围比INTEGER小
        BINARY_INTEGER  数字型可存储带符号整数,为整数计算优化性能
        VARCHAR2        字符型存放可变长字符串,有最大长度
        CHAR        字符型定长字符串
        LONG        字符型变长字符串,最大长度可达,767
        DATE        日期型以数据库相同的格式存放日期值
        BOOLEAN     布尔型TRUE OR FALSE
        ROWID ROWID 存放数据库的行号
        LOB类型,又分为BFILE,BLOB,CLOB,NCLOB
操作符
        算术运算符
            +、-、*、/、**
        比较运算符
            =、<>、~=、!= 、^=、<、<=、>、>=
        其它分隔符
            ()、:= (赋值)、,(表表项的分隔)、| |(字符串连接)
            << (标号开始) >> (标号的结束)
            --  单行注释
            /*    */    多行注释
            %   属性指示器,一般与TYPE、ROWTYPE等一起用

定义变量
变量的类型可以分为
        标量类型
        复合类型
        参照类型
        LOB 类型
1、标量类型(常用)
varchar2(n),char(n),number(p,s),date,timestamp,long(long raw),boolean,binary_integer,binary_float,binary_double
定义方法(定义时必须使用标量类型)
identifier [constant] datatype [not null] [:= | default expr]
        v_ename     varchar2(20);
        v_sal       number(6,2);
        c_tax_rate  constant number(3,2):=3.35;
        v_hiredate  date;
        v_valid     boolean not null default false;
        v_ename emp.ename%type;    --使用表列来定义数据类型
2、复合类型变量,指用于存放多个值的变量。当定义复合变量时,必须要使用PL/SQL的复合数据类型。PL/SQL包括PL/SQL记录、PL/SQL表、嵌套表及VARRAY等四种复合数据类型。

PL/SQL记录
PL/SQL记录类似于高级语言中的结构,每个PL/SQL记录一般都包含多个成员。当使用PL/SQL记录时,首先需要在定义部分定义记录类型和记录变量,然后在执行部分引用该记录变量。需要注意,当引用记录成员时,必须要加记录变量作为前缀(记录变量.记录成员)。

使 用select into进行变量赋值时,如果选择列表包含多个列和表达式,并且使用标量接收数据,就需要定义多个标量,如果使用plsql记录接收数据就只需要定义一个 记录变量即可,从而简化了数据的处理。在select..into语句中使用plsql记录时,既可以使用记录变量,也可以使用记录成员。
==============定义PL/SQL记录==============

declare
   type emp_record_type is record(
      name emp.ename%type,
      salary emp.sal%type,
      title emp.job%type);
      emp_record emp_record_type;
begin
   select ename,sal,job into emp_record
   from scott.emp where empno=7788;
   dbms_output.put_line('Employee Name: ' || emp_record.name);
end;
/
=========================================

 

PL/SQL表
与 记录一样,表也是PL/SQL中的一种复合数据结构。PL/SQL表是一个一维结构,它是存储相同类型值的元素的一个集合。PL/SQL表类似于高级语言 中的数组。需要注意,PL/SQL表与高级语言的数组有所区别,高级语言数组的下标不能为负,但PL/SQL表的下标可以为 负值;高级语言数组的元素个数有限制,而PL/SQL表的元素个数没有限制,并且其下标没有上下限。当使用PL/SQL表时,必须首先在定义部分定义PL /SQL表类型和PL/SQL表变量,然后在执行部分中引用该PL/SQL表变量。
PL/SQL表的声明
通用语法格式为:
TYPE  tabletypename  IS  TABLE  OF
datatype | variablename%TYPE | tablename.columnname%TYPE
[ NOT NULL ] INDEX BY BINARY_INTERGER;
例如:
TYPE deptname_table_type IS TABLE OF dept.DeptName%TYPE
INDEX BY BINARY_INTERGER;
TYPE major_table_type IS TABLE OF VARCHAR2(50)
INDEX BY BINARY_INTEGER;
我们可用标量数据类型或声明属性%TYPE来声明一个表类型。但声明时必须添加INDEX BY BINARY_INTEGER子句。这是目前对表索引唯一可以使用的子句。主键随同数据列一起存储在表的内部。表包括两列,即索引/主键列和数据列。
声明实际的表,通过“表名+PL/SQL表名”来定义实际的表。基于上面的声明的表类型来定义该实际的表,如下:
deptname_table  deptname_table_type;
引用表元素/行时,我们不能只通过表名来引用表,必须将主键值置于一对圆括号中,作为其下标所索引:
tablename(primarykeyvalue)
例如

deptname_table(5):=’Human Resources’
注:在PL/SQL表中,主键值不是预分配的,只有当一行赋值时此行才会创建
内置函数
内置函数是PL/SQL提供的对PL\SQL表进行操作的方法,通用语法格式为:
tablename.methodname[(index1[,index2])
其中methodname是对表进行操作的方法。内置方法如下表所示:

==============定义PL/SQL表==============

declare
    type ename_table_type is table of emp.ename%type
    index by binary_integer;
    ename_table ename_table_type;
begin
    select ename into ename_table(-1) from scott.emp
    where empno=7369;
    select ename into ename_table(100) from scott.emp
    where empno=7788;
    dbms_output.put_line('First Employee Name : '|| ename_table(-1) || ' Number is ' || ename_table.first);
    dbms_output.put_line('Last Employee Name : '|| ename_table(100) || ' Number is ' || ename_table.last);
    dbms_output.put_line('Employee Number : '|| ename_table.count);
end;
/

First Employee Name : SMITH Number is -1
Last Employee Name : SCOTT Number is 100
Employee Number : 2

=========================================

 

可以看到,PL\SQL下标的计算只针对以使用的PL\SQL表成员有效。

--嵌套表,varray例子略

3、参照类型变量
用于存放数值指针的变量。通常包括游标变量(REF CURSOR)和对象类型变量(REF obj_type)
4、LOB变量
存储大批量数据的变量,通常分为内部LOB以及外部LOB
变量的赋值

在SQL*PLUS中必须首先使用variable命令定义变量,如在SQL*Plus中输出变量,则使用print variable_name

==============SQL*PLUS变量赋值==============

SQL> var name varchar2(20)
SQL> begin
  2    select ename into :name from emp where empno=7788;
  3  end;
  4  /
PL/SQL procedure successfully completed.
SQL> print name
NAME
--------------------------------------------------------------------------------
SCOTT

当然可以直接为变量赋值,方法如下

SQL> var empno number
SQL> exec :empno :=7788
PL/SQL procedure successfully completed.
SQL> print empno
     EMPNO
----------
      7788

===========================================


在PL\SQL中变量的赋值方法有:在定义时赋值,使用select ... into赋值例,手工赋值三种。

==============PL\SQL变量赋值==============

declare
      v_deptno number :=30;                --在定义时赋值
      v_name emp.ename%type;
      v_job  emp.job%type;
      v_empno  emp.empno%type;
begin
      v_empno := &empno;                --手工赋值
      select ename,job into v_name,v_job from emp where deptno = v_deptno and empno = v_empno;                --通过select into赋值
      dbms_output.put_line('Name: ' || v_name);
      dbms_output.put_line('Job: ' || v_job);
exception
      when no_data_found then
        dbms_output.put_line('NO FOUND RECORD');
end;
/

===========================================

 

参考至:http://blog.csdn.net/robinson_0612/article/details/6063399

                http://www.cnblogs.com/FeiyueHang/archive/2011/06/30/2094862.html

                http://blog.163.com/xuejelly1985@126/blog/static/36210340200882394133500/

                http://fzguon.blog.sohu.com/160135515.html

                http://www.2cto.com/database/201110/107424.html

本文原创,转载请注明出处、作者
如有错误,欢迎指正

游戏:czmcj@163.com

作者:czmmiao  文章出处:http://czmmiao.iteye.com/blog/1810096
相关文章
|
5月前
|
SQL 关系型数据库 MySQL
在MySQL中,什么是结构化查询语言 (SQL)
【8月更文挑战第20天】在MySQL中,什么是结构化查询语言 (SQL)
83 1
|
2月前
|
SQL 数据采集 监控
局域网监控电脑屏幕软件:PL/SQL 实现的数据库关联监控
在当今网络环境中,基于PL/SQL的局域网监控系统对于企业和机构的信息安全至关重要。该系统包括屏幕数据采集、数据处理与分析、数据库关联与存储三个核心模块,能够提供全面而准确的监控信息,帮助管理者有效监督局域网内的电脑使用情况。
40 2
|
3月前
|
SQL Oracle 关系型数据库
SQL语言的主要标准及其应用技巧
SQL(Structured Query Language)是数据库领域的标准语言,广泛应用于各种数据库管理系统(DBMS)中,如MySQL、Oracle、SQL Server等
|
3月前
|
SQL 关系型数据库 MySQL
Go语言项目高效对接SQL数据库:实践技巧与方法
在Go语言项目中,与SQL数据库进行对接是一项基础且重要的任务
107 11
|
5月前
|
SQL 关系型数据库 数据库
|
5月前
|
SQL 关系型数据库 MySQL
|
5月前
|
SQL Oracle 关系型数据库
SQL与PL/SQL:数据库编程语言的比较
【8月更文挑战第31天】
105 0
|
5月前
|
SQL 存储 大数据
SQL 语言发展史简直太震撼啦!从诞生到现代数据处理,见证一场奇妙的演变之旅,快来感受!
【8月更文挑战第31天】SQL(结构化查询语言)自20世纪70年代由IBM研究员E.F. Codd提出以来,已成为现代数据处理不可或缺的一部分。它最初简化了层次和网状模型中复杂的存储与检索问题,通过基本的SELECT、FROM和WHERE关键字实现了数据查询。80年代,SQL在商业数据库中广泛应用,引入了GROUP BY、HAVING和ORDER BY等功能,增强了数据分析能力。90年代,互联网和企业信息化推动了SQL的进一步优化与扩展,支持分布式数据库和数据仓库等技术。
81 0
|
5月前
|
SQL 存储 NoSQL
从SQL到NoSQL:理解不同数据库类型的选择与应用——深入比较数据模型、扩展性、查询语言、一致性和适用场景,为数据存储提供全面决策指南
【8月更文挑战第31天】在信息技术飞速发展的今天,数据库的选择至关重要。传统的SQL数据库因其稳定的事务性和强大的查询能力被广泛应用,而NoSQL数据库则凭借其灵活性和水平扩展性受到关注。本文对比了两种数据库类型的特点,帮助开发者根据应用场景做出合理选择。SQL数据库遵循关系模型,适合处理结构化数据和复杂查询;NoSQL数据库支持多种数据模型,适用于非结构化或半结构化数据。SQL数据库在一致性方面表现优异,但扩展性较差;NoSQL数据库则设计之初便考虑了水平扩展性。SQL使用成熟的SQL语言,NoSQL的查询语言更为灵活。
113 0
|
5月前
|
SQL 数据可视化 数据挖掘
SQL 在数据分析中简直太牛啦!从数据提取到可视化,带你领略强大数据库语言的神奇魅力!
【8月更文挑战第31天】在数据驱动时代,SQL(Structured Query Language)作为强大的数据库查询语言,在数据分析中扮演着关键角色。它不仅能够高效准确地提取所需数据,还能通过丰富的函数和操作符对数据进行清洗与转换,确保其适用于进一步分析。借助 SQL 的聚合、分组及排序功能,用户可以从多角度深入分析数据,为企业决策提供有力支持。尽管 SQL 本身不支持数据可视化,但其查询结果可轻松导出至 Excel、Python、R 等工具中进行可视化处理,帮助用户更直观地理解数据。掌握 SQL 可显著提升数据分析效率,助力挖掘数据价值。
174 0
下一篇
开通oss服务