`

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

0
0
分享到:
评论

相关推荐

    PL\SQL 编程设计

    PL/SQL (Procedural Language for SQL) 是一种过程化语言,它专为Oracle数据库设计,允许开发者编写复杂的数据库应用程序。通过结合SQL的数据操作能力与传统过程化语言的控制结构,PL/SQL提供了强大的数据库编程功能...

    PL/pgSQL从入门到放弃(1)-入门

    对SQL语言增加控制结构 可以执行复杂计算 继承所有用户定义类型、函数和操作符 可以被定义为受服务器信任 便于使用 优点 客户端和服务器之间的额外往返通信被消除 客户端不需要的中间结果不必被整理或者在服务器和...

    Oracle 基础知识 -大全- 原创整理.pdf

    PL/SQL是Oracle特有的过程式语言,结合SQL用于编写存储过程、函数、触发器等。它支持异常处理、循环、游标等高级特性。 16. **PL/SQL高级用法** 高级PL/SQL编程包括编写分页过程、订单处理过程等,通过包...

    SQLBoy 存储过程之历险记

    文章目录:1、概述:2、存储过程概念及语法格式:3、数据类型与定义变量和常量4、特殊数据类型之%TYPE和%ROWTYPE5、在存储...PL/SQL(Procedural Language/SQL)是一种过程化语言,在 PL/SQL 中可以通过 IF 语句或 LOOP

    ORACLE IZ-0147教材

    - **Oracle9i: Program with PL/SQL**:这部分内容的标题指出该教材专注于教授如何使用PL/SQL编程语言进行Oracle数据库的开发。Oracle9i是Oracle数据库系统的一个版本,而PL/SQL是一种专门用于处理Oracle数据库的...

    oracle入门ppt

    4. **PL/SQL编程**:介绍Oracle的PL/SQL语言,它是SQL的扩展,用于编写存储过程、函数、触发器等数据库程序。讲解变量声明、流程控制语句(IF-THEN-ELSIF、CASE、FOR循环)和异常处理。 5. **数据库对象**:讨论表...

    (原创)PERL用ADO连接SQLSERVER2000

    标题中的"(原创)PERL用ADO连接SQLSERVER2000"指的是使用Perl编程语言通过ActiveX Data Objects (ADO) 连接并操作Microsoft SQL Server 2000数据库的过程。描述提到这是作者经过努力研究得出的方法,适用于在...

    oracle存储过程集锦

    `调用存储过程(1).doc`和`调用存储过程.doc`可能侧重于如何在应用程序中调用存储过程,这可能包括了在SQL命令行、PL/SQL块中或者使用其他编程语言(如Java、C#)的数据库连接API来执行存储过程的方法。这些文档对于...

    Oracle 数据库客户端

    4、下载并安装PL.SQL.Developer配置应用 貌似把环境变量Path添加了instantclient就可以了,不需要具体的设置。 配置tools-&gt;preferences-&gt;connection Oracle Home  D:/instantclient_11_2 OCI library  D:/instant...

    Tutorialspoint MIS MySQL NodeJS ObjC Nginx NumPy PHP7 PLSQL Perl PostgreSQL 教程

    MySQL支持SQL语言,用于数据查询、更新和管理。 3. **Node.js**:Node.js是一个基于Chrome V8引擎的JavaScript运行环境,用于构建可伸缩的网络应用。它利用异步I/O模型,使得开发高效且非阻塞的服务器端程序成为...

    Parch 学习笔记系列(十七本)

    4. **PLSQL基础**:PL/SQL是Oracle数据库中的过程化语言,结合SQL进行复杂的数据处理。笔记将涵盖变量声明、控制结构、异常处理和存储过程的编写。 5. **Bootstrap基础**:Bootstrap是流行的前端开发框架,提供响应...

    工资管理系统.doc

    在数据库设计中,可能使用了PL/SQL,这是Oracle数据库特有的编程语言,用于处理复杂的数据库操作和事务管理。 系统的测试环节不容忽视,通过单元测试和集成测试确保了程序的正确性和可靠性。此外,论文还可能涉及了...

    TutorialsPoint 数据库教程 20160127 __

    9. **PL/SQL**:Oracle数据库的编程语言,结合了SQL和过程编程元素,常用于创建数据库应用和管理Oracle数据库。 10. **Redis**:是一个内存中的数据结构存储系统,既可用作数据库,也可用作缓存和消息代理。它的...

    PLSQL 10.0.1 注册机+汉化+插件

    PLSQL Developer是一款强大的Oracle数据库开发工具,主要用于编写、调试、执行和管理PL/SQL代码。在10.0.1这个版本中,我们看到几个关键的组成部分,包括注册机、汉化包和插件,这些都是用户在使用PLSQL Developer时...

    原创-java岗位技能与职业规划

    PL/SQL,用于Oracle数据库操作。 - **版本管理**: SVN,用于代码版本控制。 1.1.3. **能力** - **学习能力**: 快速掌握新技术的能力。 - **沟通能力**: 有效交流,确保团队协作顺利进行。 - **团队合作能力**:...

    PLSQL Developer 9.0.6.1665 中文 绿色 破解版

    Enhancements in PL/SQL Developer 9.0.6.1665 =========================================== * Fixed a resource leak introduced in 9.0.6.1661 * Connection List logon dialog could be slow *****************...

    甲骨文俱乐部应用开发大赛推广

    - 选项2:使用Flash, JavaScript和PL/SQL,搭配Oracle 10g Express Edition数据库。 2. **竞赛时间**:比赛从2010年8月开始,持续到2011年5月结束,包括作品提交阶段。关键日期包括2011年3月作品提交系统开放,4月...

Global site tag (gtag.js) - Google Analytics