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 存储 Oracle
Oracle的PL/SQL定义变量和常量:数据的稳定与灵动
【4月更文挑战第19天】在Oracle PL/SQL中,变量和常量扮演着数据存储的关键角色。变量是可变的“魔术盒”,用于存储程序运行时的动态数据,通过`DECLARE`定义,可在循环和条件判断中体现其灵活性。常量则是不可变的“固定牌”,一旦设定值便保持不变,用`CONSTANT`声明,提供程序稳定性和易维护性。通过 `%TYPE`、`NOT NULL`等特性,可以更高效地管理和控制变量与常量,提升代码质量。善用两者,能优化PL/SQL程序的结构和性能。
|
30天前
|
SQL 存储 BI
【软件设计师备考 专题 】数据库语言(SQL)
【软件设计师备考 专题 】数据库语言(SQL)
90 0
|
30天前
|
SQL Perl
PL/SQL经典练习
PL/SQL经典练习
13 0
|
13天前
|
SQL 算法 数据库
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
78 6
|
5天前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL游标属性:数据的“导航仪”与“仪表盘”
【4月更文挑战第19天】Oracle PL/SQL游标属性如同车辆的导航仪和仪表盘,提供丰富信息和控制。 `%FOUND`和`%NOTFOUND`指示数据读取状态,`%ROWCOUNT`记录处理行数,`%ISOPEN`显示游标状态。还有`%BULK_ROWCOUNT`和`%BULK_EXCEPTIONS`增强处理灵活性。通过实例展示了如何在数据处理中利用这些属性监控和控制流程,提高效率和准确性。掌握游标属性是提升数据处理能力的关键。
|
5天前
|
SQL Oracle 安全
Oracle的PL/SQL循环语句:数据的“旋转木马”与“无限之旅”
【4月更文挑战第19天】Oracle PL/SQL中的循环语句(LOOP、EXIT WHEN、FOR、WHILE)是处理数据的关键工具,用于批量操作、报表生成和复杂业务逻辑。LOOP提供无限循环,可通过EXIT WHEN设定退出条件;FOR循环适用于固定次数迭代,WHILE循环基于条件判断执行。有效使用循环能提高效率,但需注意避免无限循环和优化大数据处理性能。掌握循环语句,将使数据处理更加高效和便捷。
|
5天前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL条件控制:数据的“红绿灯”与“分岔路”
【4月更文挑战第19天】在Oracle PL/SQL中,IF语句与CASE语句扮演着数据流程控制的关键角色。IF语句如红绿灯,依据条件决定程序执行路径;ELSE和ELSIF提供多分支逻辑。CASE语句则是分岔路,按表达式值选择执行路径。这些条件控制语句在数据验证、错误处理和业务逻辑中不可或缺,通过巧妙运用能实现高效程序逻辑,保障数据正确流转,支持企业业务发展。理解并熟练掌握这些语句的使用是成为合格数据管理员的重要一环。
|
5天前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL表达式:数据的魔法公式
【4月更文挑战第19天】探索Oracle PL/SQL表达式,体验数据的魔法公式。表达式结合常量、变量、运算符和函数,用于数据运算与转换。算术运算符处理数值计算,比较运算符执行数据比较,内置函数如TO_CHAR、ROUND和SUBSTR提供多样化操作。条件表达式如CASE和NULLIF实现灵活逻辑判断。广泛应用于SQL查询和PL/SQL程序,助你驾驭数据,揭示其背后的规律与秘密,成为数据魔法师。
|
9天前
|
SQL 数据库
数据库SQL语言实战(二)
数据库SQL语言实战(二)
|
2月前
|
SQL 关系型数据库 MySQL
MySQL技能完整学习列表3、SQL语言基础——1、SQL(Structured Query Language)简介——2、基本SQL语句:SELECT、INSERT、UPDATE、DELETE
MySQL技能完整学习列表3、SQL语言基础——1、SQL(Structured Query Language)简介——2、基本SQL语句:SELECT、INSERT、UPDATE、DELETE
51 0