网站导航网学 原创论文 原创专题 网站设计 最新系统 原创论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 交易代码 > SQL语法 > 正文

19、PLSQL语法基础

论文降重修改服务、格式排版等 获取论文 论文降重及排版 论文发表 相关服务

【网学网提醒】:网学会员为需要朋友们搜集整理了19、PLSQL语法基础相关资料,希望对各位网友有所帮助!


    ?PL/SQL也是一种程序语言,叫做过程化SQL语言(ProceduralLanguage/SQL)。PL/SQL是Oracle数据库
    对SQL语句的扩展。在普通SQL语句的使用上增加了编程语言的特点,所以PL/SQL就是把数据操作和查询语句
    组织在PL/SQL代码的过程性单元中,通过逻辑判断、循环等操作实现复杂的功能或者计算的程序语言。
    PL/SQL集成了现代软件工程的特点,将SQL的数据操作功能与过程化语言数据处理功能结合起来,允许使用循
    环、分支等过程化方法来处理数据。PL/SQL是ORACLE数据库应用的重要开发工具。
    结构化查询语言是用来访问关系型数据库的一种能用语言,属于第四代语言(4GL),其执行特点是非过程化,
    即不用指明执行的具体方法和途径,而是简单地使用相应语句来直接取得结果。这种不关注任何细节的语言,
    对于开发者极为方便。然而,有些复杂的业务流程要求相应的程序来描述,这种情况下,第四代语言就有些无
    能为力了。PL/SQL的出现正是为了解决这一问题。PL/SQL是一种过程化的语言,它属于第三代语言(3GL),
    它与C++、JAVA一样关注于处理细节,可以用来实现比较复杂的业务逻辑。
    PL/SQL程序语言的组成
     PL/SQL程序由块结构构成,在PL/SQL程序中含有变量、各种不同的程序控制结构、异常处理模块、子程
    序(过程、函数、包)、触发器等。
    
    PL/SQL程序的基本结构
     PL/SQL块由四个基本部分组成:声明、执行体开始、异常处理、执行体结束。
    PL/SQL注释:
     /*和*/之间的多行注释;
     以--开始的单行注释。
    PL/SQL块简介
     构成PL/SQL程序的基本单元是语句块,所有的PL/SQL程序都是由语句块构成的,每个语句块完成特定
     的功能,语句块可以具有名字(命名块),也可以不具有名字(匿名块),语句块之间还可以相互嵌套。
    块结构:
     一个完整的PL/SQL语句块由以下3个部分组成:
    
     DECLARE
     ......
     BEGIN
     ......
     EXCEPTION
     ......
     END;
    
     (1)定义、声明部分
     DECLARE开始,到BEGIN结束。在此主要定义程序所要使用的常量、变量、数据类型、
     游标、异常处理名称等。PL/SQL程序中所有需要定义的内容必须在该部分集中定义。
     不能在执行的时候定义。定义、声明部分是可选的。在进行变量定义时一般是类型后置。
     (2)执行部分
     关键字BEGIN开始,END结束(如果PL/SQL块中有异常处理部分,则以EXCEPTION结束)
     它是PL/SQL块的功能实现部分,该部分通过一系列语句和流程控制,实现数据查询、
     数据操作、事务控制、游标处理等数据库操作的功能。执行部分是必须的
     (3)异常处理部分
     以关键字EXCEPTION开始,END结束。该部分用于
    处理该PL/SQL块执行过程中产生的
     错误。异常处理部分是可选的。
     所有的PL/SQL块都以END;结束。可以一个块的执行部分或异常处理部分嵌套其他的PL/SQL块。
    匿名块:
     PL/SQL匿名块,是指动态生成,只能执行一次的块,它没有名字,不能由其它应用程序调用。
     如:
     SQL>SETSERVEROUTPUTON
     SQL>BEGIN
     2DBMS_OUTPUT.PUT_LINE('Thisamininumanonymousblock');
     3END;
     4/
    
     编写一个PL/SQL块,输出empno为7834的记录
    1.SQL>SETSERVEROUTPUTON
    SQL>DECLARE
    2v_nameVARCHAR2(10);--数据类型后置
    3BEGIN
    4SELECTenameINTOv_nameFROMempWHEREempno='7839';
    5DBMS_OUTPUT.PUT_LINE('7834''snameis:'||v_name);
    6END
    7;
    8/
    7834'snameis:KING
    PL/SQL过程已成功完成。
    2.SQL>DECLARE
    2v_nameVARCHAR2(10);
    3empnoNUMBER(4);
    4BEGIN
    5SELECTenameINTOv_nameFROMempWHEREempno=&;empno;
    6DBMS_OUTPUT.PUT_LINE('nameis:'||v_name);
    7END;
    8/
    输入empno的值:7900
    原值5:SELECTenameINTOv_nameFROMempWHEREempno=&;e
    mpno;
    新值5:SELECTenameINTOv_nameFROMempWHEREempno=79
    00;
    nameis:JAMES
    PL/SQL过程已成功完成。
    3.本例中,如果记录不存在就会出错,为此我们可以加入异常处理
    SQL>DECLARE
    2v_nameVARCHAR2(10);
    3empnoNUMBER(4);
    4BEGIN
    5SELECTenameINTOv_nameFROMempWHEREempno=&;empno;
    6DBMS_OUTPUT.PUT_LINE('nameis:'||v_name);
    7EXCEPTION
    8WHENNO_DATA_FOUNDTHEN
    9DBMS_OUTPUT.PUT_LINE('notfoundrecord!');
    10END;
    11/
    输入empno的值:100
    原值5:SELECTenameINTOv_nameFROMempWHEREempno=&;e
    mpno;
    新值5:SELECTenameINTOv_nameFROMempWHEREempno=10
    0;
    notfoundrecord!
    PL/SQL过程已成功完成。
    命名块
     命名块是指一次编译可多次执行的PL/SQL程序,包括自定义函数、过程、包、触发器等。
     它们编译后放在服务器中,由应用程序或系统在特定条件下,调用执行。
     另外,在复杂的PL/SQL中,可以在一个PL/SQL块中包含另一个PL/SQL块,这种现象称为块嵌套。
    PL/SQL语法要素:
     PL/SQL程序都是由基本语法要素构成。PL/SQL基本语法要素包括字符集、标识符、文本、分隔符、
     注释等。
    字符集:
     PL/SQL字符集包括:
     大小写英文字母A-Z和a-z。
     0-9数字
     空白符,包括制表符、空格、回车。
     特殊符号,包括~、!、@、#、$、%、*、(、)、_、-、+、=、|、:、;、"、'、<、>、,、.、?、/、^等。
     PL/SQL字符集不区分大小写
    标识符:
     用于定义PL/SQL变量、常量、异常、游标名称、游标变量、参数、子程序名称和其它的程序单元名
     称等。以字母开头,最大长度为30个字符,并且所有的字符都是有效的。如果标识符区分大小写、
     使用预保留关键字、或包含空格等特殊符号,需要用英文双引号("")括起来,称为引证标识符。
    文字:
     所谓文字是指不能作为标识符的数字型、字符型、日期型和布尔型数值。
    
     (1)数值型文字
     数值型文字分为整数与实数两类。数值型文字可以直接在sql语句的算术表达式中引用。PL/SQL还
     可以使用科学计数法和幂操作符。
     SQLPL/SQL均可使用: 常规的数值表式方法,如3.14、2008
     PL/SQL还可以使用: 科学计算法和幂操作符,如-10E4、5.123e-6、7*10**2
     (2)字符型文字
     字符型文字用单引号括起来的一个或多个字符。在字符型文字中区分大小写。如果字符型文字中
     本身包含单引号,则用两个连续的单引号进行转义。在ORACLE10G中,如果字符串文本包含单引
     号,那么还可以使用其他分隔符(如[]、()、<>等)赋值。注意,如果要使用分隔符[]、()、<>为
     字符串赋值,那么不仅需要在分隔符前后加单引号,而且需要带有前缀q。
     如:
     使用单引号:'7'、'K'、'='、'Iamastudent.'
     使用其他分隔符:'I''mastudent'、q'[I'mastudent.]'
     (3)日期型文字
     日期型文字表示日期时间值,形式与字符串类似。日期型数值也必须放在单引号之中,同时日期
     型数值格式随日期类型格式和日期语言不同而不同。日期型文字的示例如下:
     '01-04月-1963''2008-01-0108:00:01'
     (4)布尔型文字
     包括TRUE、FALSE、NULL三个值。
    分隔符
     分隔符由具有特定含义的单个字符或组合字符构成。用户可以使用分隔符完成诸如算术运算、数值比较、
     给变量赋值等操作。
    
     算术运算符:
     +、-、*、/、**(乘方)
     比较操作符:
     =、<>、~=、!=、^=(四个均为不等于)、<、<=、>、>=
     其他分隔符:
     (、)、:=(赋值)、'、"、,(列表项分隔)、@(数据库连接分隔符)、;(语句结束)、
     ||(字符串连接)、=>(联合操作符,调用子程序,给其传递参数)、
     <<、>>(标号开始与结束符)、--(单行注释)、
     /*、*/(多行注释开始与结束)、%(属性指示器,一般与TYPE、ROWTYPE等一起用)
    注释
     单行注释:--
     多行注释:/*注释内容
    ,可跨行*/
    变量及其数据类型
     PL/SQL变量的数据类型包括标量类型、复合类型、引用类型和LOB类型。
    标量变量:
     只存放单个数值的变量,包括数字型、字符型、日期时间型、布尔型等多种数据类型。
     (1)数字类型
     NUMBER 最大长度38位,小数部分位数-84~127。
     PLS_INTEGER 数值范围-2147483647~2147483647。其子类型包括NATURAL、NATURALN、
     POSITIVE、POSITIVEN和SIGNTYPE。对新开发的应用系统来说,
     ORACLE推荐PLS_INTEGER,而不要使用BINARY_INTEGER。像
     BINARY_INTEGER类型一样,PLS_INTEGER也是在当不需要在数据库中
     存储这个数值,而只在算术运算中使用这个数字的时候才用这种数字类型。
    
     BINARY_INTEGER数值范围-2147483647~2147483647,当不需要在数据库中存储这个
     数值,而只在算术运算中使用这个数字的时候才用这种数字类型。
     BINARY_DOUBLE双精度浮点型,10G中新引入的,在科学计算中,有性能优势。
     BINARY_FLOAT 单精度浮点型
     (2)字符类型
     CHAR 定长字符串
     NCHAR
     VARCHAR
     VARCHAR2
     NVARCHAR2
     LONG
     RAW
     LONGRAW
     ROWID
     UROWID
     (3)日期时间型
     DATE 存储世纪、年、月、日、时、分、秒。秒不能带小数
     TIMESTAMP
     INTERVAL
     (4)布尔型
     TURE
     FALSE
     NULL
    复合变量
     复合类型的变量包含一个或多个标量变量。
     复合类型包括记录、嵌套表、index-by表、和数组
    引用变量(参照变量)
     PL/SQL中包含两种引用类型,即REFCURSOR类型和REF类型。
    LOB变量
     CLOB
     NCLOB
     BLOB
     BFILE
    在PL/SQL中执行SQL语句
    执行SELECT语句
     在PL/SQL中执行SELECT语句要加INTO,其格式为:
     SELECTexpression_listINTOvariable_list|record_variable
     FROMtable_nameWHEREcondition;
     例1:在dept表中查询部门编号为10的部门,将部门名和工作地点显示出来
     DECLARE
     v_namedept.dname%TYPE;
     v_locdept.loc%TYPE;
     v_iddept.deptno%TYPE;
     BEGIN
     SELECTdname,locINTOv_name,v_locFROMdeptWHEREdeptno=(&;v_id);
     DBMS_OUTPUT.PUT_LINE('deptnameis:'||v_name);
     DBMS_OUTPUT.PUT_LINE('deptlocis:'||v_loc);
     EXCEPTION
     WHENNO_DATA_FOUNDTHEN
     DBMS_OUTPUT.PUT_LINE('notfoundrecord!');
     END;
     /
    输入v_id的值:10
    原值6:SELECTdname,locINTOv_name,v_locFROMdeptWHEREdeptn
    o=(&;v_id);
    新值6:SELECTdname,locINTOv_name,v_locFROMdeptWHEREdeptn
    o=(10);
    deptnameis:ACCOUNTING
    deptlocis:NEWYORK
    PL/SQL过程已成功完成。
     例2:查询7788记录的信息
     DECLARE
     v_studentemp%ROWTYPE;
     BEGIN
     SELECT*INTOv_studentFROMempWHEREempno=(&;v_student);
     DBMS_OUTPUT.PUT_LINE('idnamejobsal');
     DBMS_OUTPUT.PUT_LINE(v_student.empno||''||v_student.ename
     ||''||v
    _student.job||''||v_student.sal);
     EXCEPTION
     WHENNO_DATA_FOUNDTHEN
     DBMS_OUTPUT.PUT_LINE('notfoundrecord!');
     END;
     /
    输入v_student的值:7788
    原值4:SELECT*INTOv_studentFROMempWHEREempno=(&;v_student
    );
    新值4:SELECT*INTOv_studentFROMempWHEREempno=(7788);
    idnamejobsal
    7788SCOTTANALYST3000
    PL/SQL过程已成功完成。
     注:如果查询的结果有多条记录的话,要用游标,否则会产生TOO_MANY_ROW异常。
    执行DML语句
     1、执行insert
     DECLARE
     v_idemp.empno%TYPE:=8000;
     v_nameemp.ename%TYPE:='zhangsan';
     v_jobemp.job%TYPE:='MGR';
     v_salemp.sal%TYPE:=5000;
     BEGIN
     INSERTINTOEMP(empno,ename,job,sal)VALUES
     (v_id,v_name,v_job,v_sal);
     END;
     /
    SQL>select*fromemp
    2whereempno=8000;
    EMPNOENAMEJOBMGRHIREDATESALCOMM
    -------------------------------------------------------------------------
    DEPTNO
    ----------
    8000zhangsanMGR5000
     2、执行update
     DECLARE
     v_idemp.empno%TYPE:=8000;
     v_nameemp.ename%TYPE:='ZHANGSAN';
     v_jobemp.job%TYPE:='ANALYST';
     BEGIN
     UPDATEempSETename=v_name,job=v_jobWHEREempno=v_id;
     END;
     /
    SQL>select*fromemp
    2whereempno=8000;
    EMPNOENAMEJOBMGRHIREDATESALCOMM
    -------------------------------------------------------------------------
    DEPTNO
    ----------
    8000ZHANGSANANALYST5000
     3、执行delete
     DECLARE
     v_idemp.empno%TYPE;
     BEGIN
     DELETEFROMempWHEREempno=&;v_id;
     END;
     /
    输入v_id的值:8000
    原值4:DELETEFROMempWHEREempno=&;v_id;
    新值4:DELETEFROMempWHEREempno=8000;
    PL/SQL过程已成功完成。
    SQL>select*fromemp
    2whereempno=8000;
    未选定行
    在PL/SQL中执行事务处理语句
     与在SQL中完全一样
     DECLARE
     v_idemp.empno%TYPE:=8000;
     v_nameemp.ename%TYPE:='zhangsan';
     v_jobemp.job%TYPE:='MGR';
     v_salemp.sal%TYPE:=5000;
     BEGIN
     INSERTINTOEMP(empno,ename,job,sal)VALUES(v_id,v_name,v_job,v_sal);
     COMMIT;
     UPDATEempSETename='TEST',job='TEMP_JOB'WHEREempno=8000;
     ROLLBACK;
     DELETEFROMempWHEREempno=8001;
     COMMIT;
     END;
     /
    
    
  • 下一篇资讯: 17NativeSQL查询
  • 设为首页 | 加入收藏 | 网学首页 | 原创论文 | 计算机原创
    版权所有 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师