`
foreversunyao
  • 浏览: 212269 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

pl/sql 基本知识(转载)

    博客分类:
  • DB
阅读更多

PL/SQL存储过程编程(上) 

1. Oracle应用编辑方法概览 
答:1) Pro*C/C++/... : C语言和数据库打交道的方法,比OCI更常用; 
2) ODBC 
3) OCI: C语言和数据库打交道的方法,和ProC很相似,更底层,很少用; 
4) SQLJ: 很新的一种用Java访问Oracle数据库的方法,会的人不多; 
5) JDBC 
6) PL/SQL: 存储在数据内运行, 其他方法为在数据库外对数据库访问; 

2. PL/SQL 
答:1) PL/SQL(Procedual language/SQL)是在标准SQL的基础上增加了过程化处理的语言; 
2) Oracle客户端工具访问Oracle服务器的操作语言; 
3) Oracle对SQL的扩充; 

4. PL/SQL的优缺点 
答:优点: 
1) 结构化模块化编程,不是面向对象; 
2) 良好的可移植性(不管Oracle运行在何种操作系统); 
3) 良好的可维护性(编译通过后存储在数据库里); 
4) 提升系统性能; 

缺点 
1) 不便于向异构数据库移植应用程序(只能用于Oracle); 

5. SQL与PL/SQL的区别 
答:SQL:1) 第四代语言(智能语言); 
2) 做什么,不管怎么做; 
3) 缺少过程与控制语句; 
4) 无算法 
PL/SQL: 1) 扩展变量和类型; 
2) 扩展控制结构; 
3) 扩展过程与函数; 
4) 扩展对象类型与方法 


第二章 

PL/SQL程序结构 

1. PL/SQL块 
答:1) 申明部分, DECLARE(不可少); 
2) 执行部分, BEGIN...END; 
3) 异常处理,EXCEPTION(可以没有); 

2. PL/SQL开发环境 
答:可以运用任何纯文本的编辑器编辑,例如:VI 

3. PL/SQL字符集 
答:PL/SQL对大小写不敏感 

4. 标识符命名规则 
答:1) 字母开头; 
2) 后跟任意的非空格字符、数字、货币符号、下划线、或# ; 
3) 最大长度为30个字符(八个字符左右最合适); 

5. 变量声明 
答:语法 
Var_name type [CONSTANT][NOT NULL][:=value]; 
注:1) 申明时可以有默认值也可以没有; 
2) 如有[CONSTANT][NOT NULL], 变量一定要有一个初始值; 
3) 赋值语句为“:=”; 
4) 变量可以认为是数据库里一个字段; 
5) 规定没有初始化的变量为NULL; 

第三章 

1. 数据类型 
答:1) 标量型:数字型、字符型、布尔型、日期型; 
2) 组合型:RECORD(常用)、TABLE(常用)、VARRAY(较少用) 
3) 参考型:REF CURSOR(游标)、REF object_type 
4) LOB(Large Object) 

2. %TYPE 
答:变量具有与数据库的表中某一字段相同的类型 
例:v_FirstName studengts.first_name%TYPE; 

3. RECORD类型 
答:TYPE record_name IS RECORD( /*其中TYPE,IS,RECORD为关键字,record_name为变量名称*/ 
field1 type [NOT NULL][:=expr1], /*每个等价的成员间用逗号分隔*/ 
field2 type [NOT NULL][:=expr2], /*如果一个字段限定NOT NULL,那么它必须拥有一个初始值*/ 
... /*所有没有初始化的字段都会初始为NULL 
fieldn type [NOT NULL][:=exprn]); 

4. %ROWTYPE 
答:返回一个基于数据库定义的类型 
DECLARE 
v_StuRec Student%ROWTYPE; /*Student为表的名字*/ 

注:与3中定一个record相比,一步就完成,而3中定义分二步:a. 所有的成员变量都要申明; b. 实例化变量; 

5. TABLE类型 
答:TYPE tabletype IS TABLE OF type INDEX BY BINARY_INTEGER; 
例:DECLARE 
TYPE t_StuTable IS TABLE OF Student%ROWTYPE INDEX BY BINARY_INTERGER; 
v_Student t_StuTable; 
BEGIN 
SELECT * INTO v_Student(100) FROM Student WHERE id = 1001; 
END; 
注:1) 行的数目的限制由BINARY_INTEGER的范围决定; 

6. 变量的作用域和可见性 
答:1) 执行块里可以嵌入执行块; 
2) 里层执行块的变量对外层不可见; 
3) 里层执行块对外层执行块变量的修改会影响外层块变量的值; 

第四章 

1. 条件语句 
答:IF boolean_expression1 THEN 
... 
ELSIF boolean_expression2 THEN /*注意是ELSIF,而不是ELSEIF*/ 
... /*ELSE语句不是必须的,但END IF;是必须的*/ 
ELSE 
... 
END IF; 

2. 循环语句 
答:1) Loop 
... 
IF boolean_expr THEN /* */ 
EXIT; /* EXIT WHEN boolean_expr */ 
END IF; /* */ 
END LOOP; 
2) WHILE boolean_expr LOOP 
... 
END LOOP; 
3) FOR loop_counter IN [REVERSE] low_blound..high_bound LOOP 
... 
END LOOP; 
注:a. 加上REVERSE 表示递减,从结束边界到起始边界,递减步长为一; 
b. low_blound 起始边界; high_bound 结束边界; 

3. GOTO语句 
答:GOTO label_name; 
1) 只能由内部块跳往外部块; 
2) 设置标签:<<label_name>> 
3) 示例: 
LOOP 
... 
IF D%ROWCOUNT = 50 THEN 
GOTO l_close; 
END IF; 
... 
END LOOP; 
<<l_close>>; 
... 

4. NULL语句 
答:在语句块中加空语句,用于补充语句的完整性。示例: 
IF boolean_expr THEN 
... 
ELSE 
NULL; 
END IF; 

5. SQL in PL/SQL 
答:1) 只有DML SQL可以直接在PL/SQL中使用; 

第五章 

1. 游标(CURSOR) 
答:1) 作用:用于提取多行数据集; 
2) 声明:a. 普通申明:DELCARE CURSOR CURSOR_NAME IS select_statement /* CURSOR的内容必须是一条查询语句*/ 
b. 带参数申明:DELCARE CURSOR c_stu(p_id student.ID%TYPE) SELECT * FROM student WHERE ID = p_id; 
3) 打开游标:OPEN Cursor_name; /*相当于执行select语句,且把执行结果存入CURSOR; 
4) 从游标中取数:a. FETCH cursor_name INTO var1, var2, ...; /*变量的数量、类型、顺序要和Table中字段一致;*/ 
b. FETCH cursor_name INTO record_var; 
注:将值从CURSOR取出放入变量中,每FETCH一次取一条记录; 
5) 关闭游标: CLOSE Cursor_name; 
注:a. 游标使用后应该关闭; 
b. 关闭后的游标不能FETCH和再次CLOSE; 
c. 关闭游标相当于将内存中CURSOR的内容清空; 

2. 游标的属性 
答:1) %FOUND: 是否有值; 
2) %NOTFOUND: 是否没有值; 
3) %ISOPEN: 是否是打开状态; 
4) %ROWCOUNT: CURSOR当前的记录号; 

3. 游标的FETCH循环 
答:1) LOOP 
FETCH cursor INTO ... 
EXIT WHEN cursor%NOTFOUND; /*当cursor中没记录后退出*/ 
END LOOP; 
2) WHILE cursor%FOUND LOOP 
FETCH cursor INTO ... 
END LOOP; 
3) FOR var IN cursor LOOP 
FETCH cursor INTO... 
END LOOP; 

第六章 

1. 异常 
答:DECLARE 
... 
e_TooManyStudents EXCEPTION; /* 申明异常 */ 
... 
BEGIN 
... 
RAISE e_TooManyStudents; /* 触发异常 */ 
... 
EXCEPTION 
WHEN e_TooManyStudents THEN /* 触发异常 */ 
... 
WHEN OTHERS THEN /* 处理所有其他异常 */ 
... 
END; 



PL/SQL存储过程编程(下) 

1. 存储过程(PROCEDURE) 
答:创建过程: 
CREATE [OR REPLACE] PROCEDURE proc_name 
[(arg_name[{IN|OUT|IN OUT}]TYPE, 
arg_name[{IN|OUT|IN OUT}]TYPE)] 
{IS|AS} 
procedure_body 
1) IN: 表示该参数不能被赋值(只能位于等号右边); 
2) OUT:表示该参数只能被赋值(只能位于等号左边); 
3) IN OUT: 表示该类型既能被赋值也能传值; 

2. 存储过程例子 
答:CREATE OR REPLACE PROCEDURE ModeTest( 
p_InParm IN NUMBER, 
p_OutParm OUT NUMBER, 
p_InOutParm IN OUT NUMBER) 
IS 
v_LocalVar NUMBER; /* 声明部分 */ 
BEGIN 
v_LocalVar:=p_InParm; /* 执行部分 */ 
p_OutParm:=7; 
p_InOutParm:=7; 
... 
EXCEPTION 
... /* 异常处理部分 */ 
END ModeTest; 

3. 调用PROCEDURE的例子 
答:1) 匿名块可以调; 
2) 其他PROCDEURE可以调用; 
例: 
DECLARE 
v_var1 NUMBER; 
BEGIN 
ModeTest(12, v_var1, 10); 
END; 
注:此时v_var1等于7 

4. 指定实参的模式 
答:1) 位置标示法:调用时添入所有参数,实参与形参按顺序一一对应; 
2) 名字标示法:调用时给出形参名字,并给出实参 
ModeTest(p_InParm=>12, p_OutParm=>v_var1, p_Inout=>10); 
注:a. 两种方法可以混用; 
b. 混用时第一个参数必须通过位置来指定。 

5. 函数(Function)与过程(Procedure)的区别 
答:1) 过程调用本身是一个PL/SQL语句(可以在命令行中通过exec语句直接调用); 
2) 函数调用是表达式的一部分; 

6. 函数的声明 
答:CREATE [OR REPLACE] PROCEDURE proc_name 
[(arg_name[{IN|OUT|IN OUT}]TYPE, 
arg_name[{IN|OUT|IN OUT}]TYPE)] 
RETURN TYPE 
{IS|AS} 
procedure_body 
注:1) 没有返回语句的函数将是一个错误; 

7. 删除过程与函数 
答:DROP PROCEDURE proc_name; 
DROP FUNCTION func_name; 

第八章 

1. 包 
答:1) 包是可以将相关对象存储在一起的PL/SQL的结构; 
2) 包只能存储在数据库中,不能是本地的; 
3) 包是一个带有名字的声明; 
4) 相当于一个PL/SQL块的声明部分; 
5) 在块的声明部分出现的任何东西都能出现在包中; 
6) 包中可以包含过程、函数、游标与变量; 
7) 可以从其他PL/SQL块中引用包,包提供了可用于PL/SQL的全局变量。 
8) 包有包头和包主体,如包头中没有任何函数与过程,则包主体可以不需要。 

2. 包头 
答:1) 包头包含了有关包的内容的信息,包头不含任何过程的代码。 
2) 语法: 
CREATE [OR REPLACE] PACKAGE pack_name {IS|AS} 
procedure_specification|function_specification|variable_declaration|type_definition|exception_declaration|cursor_declaration 
END pack_name; 
3) 示例: 
CREATE OR REPLACE PACKAGE pak_test AS 
PROCEDURE RemoveStudent(p_StuID IN students.id%TYPE); 
TYPE t_StuIDTable IS TABLE OF students.id%TYPE INDEX BY BINARY_INTEGER; 
END pak_test; 

3. 包主体 
答:1) 包主体是可选的,如包头中没有任何函数与过程,则包主体可以不需要。 
2) 包主体与包头存放在不同的数据字典中。 
3) 如包头编译不成功,包主体无法正确编译。 
4) 包主体包含了所有在包头中声明的所有过程与函数的代码。 
5) 示例: 
CREATE OR REPLACE PACKAGE BODY pak_test AS 
PROCEDURE RemoveStudent(p_StuID IN students.id%TYPE) IS 
BEGIN 
... 
END RemoveStudent; 
TYPE t_StuIDTable IS TABLE OF students.id%TYPE INDEX BY BINARY_INTEGER; 
END pak_test; 

4. 包的作用域 
答:1) 在包外调用包中过程(需加包名):pak_test.AddStudent(100010, 'CS', 101); 
2) 在包主体中可以直接使用包头中声明的对象和过程(不需加包名); 

5. 包中子程序的重载 
答:1) 同一个包中的过程与函数都可以重载; 
2) 相同的过程或函数名字,但参数不同; 

6. 包的初始化 
答:1) 包存放在数据库中; 
2) 在第一次被调用的时候,包从数据库中调入内存并被初始化; 
3) 包中定义的所有变量都被分配内存; 
4) 每个会话都将拥有自己的包内变量的副本。 

第九章 

1. 触发器 
答:1) 触发器与过程/函数的相同点 
a. 都是带有名字的执行块; 
b. 都有声明、执行体和异常部分; 
2) 触发器与过程/函数的不同点 
a. 触发器必须存储在数据库中; 
b. 触发器自动执行; 

2. 创建触发器 
答:1) 语法: 
CREATE [OR REPLACE] TRIGGER trigger_name 
{BEFORE|AFTER} triggering_event ON table_reference 
[FOR EACH ROW [WHEN trigger_condition]] 
trigger_body; 
2) 范例: 
CREATE OR REPLACE TRIGGER UpdateMajorStats AFTER INSERT OR DELETE OR UPDATE ON students 
DECLARE 
CURSOR c_Statistics IS 
SELECT * FROM students GROUP BY major; 
BEGIN 
... 
END Up; 

3. 触发器 
答:1) 三个语句(INSERT/UPDATE/DELETE); 
2) 二种类型(之前/之后); 
3) 二种级别(row-level/statement-level); 
所以一共有 3 X 2 X 2 = 12 

4. 触发器的限制 
答:1) 不应该使用事务控制语句; 
2) 不能声明任何LONG或LONG RAW变量; 
3) 可以访问的表有限。 

5. 触发器的主体可以访问的表 
答:1) 不可以读取或修改任何变化表(被DML语句正在修改的表); 
2) 不可以读取或修改限制表(带有约束的表)的主键、唯一值、外键列。

分享到:
评论

相关推荐

    PL/SQL 基本知识

    这篇博客主要探讨了PL/SQL的基础知识,包括其语法特性、使用场景以及在数据库管理中的重要性。 首先,PL/SQL是一种过程化语言,它允许用户定义变量、控制流程(如循环、条件语句)、处理异常,并且可以嵌入SQL查询...

    oracle10g_pl/sql

    1. **PL/SQL基本概念** - **块结构**:PL/SQL代码由声明、执行和异常处理三部分组成,包括BEGIN...END块、DECLARE...BEGIN...END块以及匿名块。 - **变量和常量**:PL/SQL支持各种数据类型,如NUMBER、VARCHAR2、...

    pl/sql最新中文手册

    1. **PL/SQL基础**:手册可能会从基础开始,介绍PL/SQL的基本结构,包括声明变量、常量、游标、记录类型等。还会讲解如何编写存储过程、函数和触发器。 2. **控制流程语句**:这包括条件判断(IF-THEN-ELSIF-ELSE)...

    一个对数据库的操作工具PL/SQLpl/sqL工具

    PL/SQL是Oracle公司开发的一种过程化语言,全称为Procedural Language/Structured Query Language,它是SQL的一个扩展,专门用于处理Oracle数据库系统。这个“PL/SQL工具”显然是一个用于辅助管理和操作Oracle数据库...

    Oracle PL/SQL实战(待续)

    Oracle PL/SQL是一种强大的编程语言,它结合了SQL的数据处理能力与PL的程序设计特性,是Oracle数据库系统中用于创建存储过程、函数、触发器和包的主要工具。在这个"Oracle PL/SQL实战(待续)"的主题中,我们将深入...

    PL/SQL编程基础知识

    ### PL/SQL编程基础知识 #### 一、PL/SQL简介 PL/SQL(Procedural Language for SQL)是一种过程化语言,它结合了SQL的数据操纵功能和过程化语言的控制结构,使用户能够灵活地控制数据操作流程。作为Oracle数据库...

    pl/sql developer11.0

    PL/SQL Developer是一款由Allround Automations公司开发的专业Oracle数据库开发工具,专为编写、调试、测试和管理PL/SQL代码而设计。标题中的“pl/sql developer11.0”指的是该软件的第11个主要版本。在本文中,我们...

    oracle 9i pl/sql程序设计笔记

    PL/SQL程序的基本单位是块,这些块可以是匿名的、带名的,或以子程序的形式存在。 **2.1.1 PL/SQL块的类型** 1. **匿名块(Anonymous Block)**:这类块通常是临时性的,仅用于一次性执行,并不存储在数据库中。...

    pl/sql64位

    PL/SQL是Oracle数据库系统中的一个关键组件,全称为Procedural Language/Structured Query Language,是一种结合了SQL和过程编程语言的工具,主要用于编写数据库应用程序。64位的PL/SQL开发者工具对于那些处理大数据...

    oracle pl/sql从入门到精通 配套源代码

    PL/SQL支持变量、常量、条件语句(如IF-THEN-ELSIF-ELSE)、循环(如FOR、WHILE)、异常处理(如EXCEPTION)等基本编程元素。 在Oracle PL/SQL中,我们可以通过使用SQL语句来与数据库进行交互,例如SELECT用于查询...

    ORACLE PL/SQL从入门到精通

    ORACLE PL/SQL是从入门到精通的专业知识,涵盖了数据库开发与管理的多个方面,包括触发器、过程、函数、软件包、异常处理、游标、循环、分支、变量使用、数据库安装等关键知识点。 触发器是数据库中用来保证数据...

    Oracle PL/SQL程序设计(第5版)(上下册)

    ### Oracle PL/SQL程序设计(第5版)(上下册)知识点概述 #### 一、PL/SQL编程基础 - **PL/SQL简介**:PL/SQL(Procedural Language for SQL)是Oracle数据库的一种内嵌式过程化语言,用于增强SQL的功能。它允许在SQL...

    PL/SQL VCS插件安装包+PL/SQL

    PL/SQL VCS插件是为开发者提供的一种增强工具,它与PL/SQL Developer整合,目的是为了更好地管理和控制Oracle数据库中的SQL脚本和存储过程的版本。这个安装包结合了Version Control System (VCS)的功能,如Visual ...

    pl/sql 免安装,绿色版pl/sql

    1. **PL/SQL编程支持**:PL/SQL Developer内置了强大的PL/SQL编辑器,支持语法高亮、自动完成、错误检查等功能,使开发人员能够高效编写PL/SQL代码。此外,还具备代码折叠、查找替换、书签设置等实用功能,提高了...

    PL/SQL Developer 远程连接Oracle数据库

    在使用PL/SQL Developer进行远程连接时,首先需要了解以下知识点: 1. **Oracle TNS(Transparent Network Substrate)**:TNS是Oracle提供的网络通信组件,它定义了如何在客户端和服务器之间建立连接。你需要知道...

    Oracle PL/SQL实例编程(PL/SQL经典书籍)

    下面我们将深入探讨PL/SQL的关键知识点。 1. **基础语法**:PL/SQL是过程化SQL,它包含声明部分、执行部分和异常处理部分。声明部分用于定义变量、常量和游标;执行部分包含了SQL语句和流程控制结构,如循环、条件...

    pl/sql快捷插件

    PL/SQL Developer是一款由Allround Automations公司开发的专门用于Oracle数据库管理的集成开发环境(IDE)。这款软件为Oracle数据库管理员、开发人员和测试人员提供了便捷的SQL和PL/SQL编写、调试和执行功能。而“pl...

    oracle pl/sql 实例精解(中文原书第4版)

    本书是一本逐步分解的,详尽的pl/sql编程教程,使用真实场景的试验、范例和练习来介绍读者所需的pl/sql编程...使用本书,读者可以快速掌握pl/sql编程基本知识,并建立工程化的概念,是市面上难得的pl/sql教程。.

    PL/SQL下载

    1. **基础语法**:理解PL/SQL的基本数据类型、变量声明、流程控制结构等。 2. **函数和过程**:掌握如何定义和调用自定义函数和过程。 3. **游标**:了解如何使用游标处理结果集。 4. **异常处理**:学习如何编写...

    PL/SQL开发文档1

    6. 在PL/SQL中,调用过程是一个基本操作,文档中介绍了如何使用SQL Developer来调用过程,并说明了过程调用的语法和可能的执行结果。 7. Oracle的培训材料通常包含版权声明和商标声明,明确指出材料的使用限制、...

Global site tag (gtag.js) - Google Analytics