oracle10gSQL和PLSQL编程指南

合集下载

PLSQL数据库配置

PLSQL数据库配置
PLSQL数据库配置
1.第一步点击“开始”——所有程序——Oracle - OraClient10g_home1——选择“Enterprise Manager Console”,出现下图界面
2.点击“导航器”,选择“将数据库添加到树”,如下图所示
3.选择“手动添加数据库”,主机名为数据库服务器IP,SID为“UTMS”,网络服务器名为系统自动填写,如下图所示
4.点击确定,点击左侧“网络”下肢的数据库加号,出现如下图所示,表示配置正确
5.登录PLSQL ,如下图
输入数selectinstance_namefromv$instance;
plsql数据库配置oraclient10ghome1选择enterprisemanagerconsole出现下图界面选择手动添加数据库主机名为数据库服务器ipsid为utms网络服务器名为系统自动填写如下图所示登录plsql如下图输入数据库的用户名和密码点击ok登录查看数据库sid的语句selectinstancenamefromvinstance

PLSQL编程语言的使用与程序设计

PLSQL编程语言的使用与程序设计

实验五PL/SQL编程语言的使用与程序设计【开发语言及实现平台或实验环境】Oracle10g【实验目的】(1)了解PL/SQL在Oracle中的基本概念;(2)掌握PL/SQL的各组成部分;(3)PL/SQL的运用。

【实验原理】1.PL/SQL字符集和所有其他程序设计语言一样,PL/SQL也有一字符集。

读者能从键盘上输入的字符集是PL/SQL的字符。

此外,在某些场合,还有使用某些字符的规定。

我们将要详细介绍:●用PL/SQL编程时可能使用的字符●算术运算符●关系运算符●杂符号1)合法字符用PL/SQL程序时,允许使用下列字符:●所有大、小写字母●数字0到9●符号:()+-*/〈〉=!~;:.‘@ %,“# $ ^ & _ | { } ?[ ]2)算术运算符下面列出了PL/SQL中常用的算术运算符。

如果读者使用过其他高级程序设计语言,想必不会陌生:表6 算术运算符运算符意义+ 加法- 减法* 乘法/ 除法** 幂关系运算符下面列出了PL/SQL中常用的关系运算符。

如果读者有使用其他程序设计语言的经验,一定见过这些符号:表7 关系运算符运算符意义<> 不等于!= 不等于^= 不等于< 小于> 大于= 等于3)杂符号PL/SQL为支持编程,还使用下述符号。

下面列出了部分符号,它们是最常用的,也是使用PL/SQL的所有读者都必须了解的。

表8 杂符号4)变量变量是PL/SQL中用来处理数据项所用的名字。

读者根据下列规则选择变量名称:●变量必须以字母(A~Z)开头。

●其后跟可选的一个或多个字母,数字(0~9)或特殊字符$、# 或_。

●变量长度不超过30个字符。

●变量名中不能有空格。

5)保留字保留字可视为PL/SQL版权所有的字符串。

在定义变量名时,读者不能使用这些保留字。

例如,词“loop”在PL/SQL中有特殊含义,因此下列代码是非法的:declareemployee varchar2(30);loop number;保留字不能用作变量名。

ORACLE-PLSQL编程详解--全8篇

ORACLE-PLSQL编程详解--全8篇

ORACLE PL/SQL编程详解第一章:PL/SQL 程序设计简介SQL语言只是访问、操作数据库的语言,并不是一种具有流程控制的程序设计语言,而只有程序设计语言才能用于应用软件的开发。

PL /SQL是一种高级数据库程序设计语言,该语言专门用于在各种环境下对ORACLE数据库进行访问。

由于该语言集成于数据库服务器中,所以PL/SQL代码可以对数据进行快速高效的处理。

除此之外,可以在ORACLE数据库的某些客户端工具中,使用PL/SQL语言也是该语言的一个特点。

本章的主要内容是讨论引入PL/SQL 语言的必要性和该语言的主要特点,以及了解PL/SQL语言的重要性和数据库版本问题。

还要介绍一些贯穿全书的更详细的高级概念,并在本章的最后就我们在本书案例中使用的数据库表的若干约定做一说明。

SQL与PL/SQL什么是PL/SQLPL/SQL是 Procedure Language & Structured Query Language 的缩写。

ORACLE的SQL是支持ANSI(American national Standards Institute)和ISO92 (International Standards Organization)标准的产品。

PL/SQL是对SQL语言存储过程语言的扩展。

从ORACLE6以后,ORACLE的RDBMS附带了PL/SQL。

它现在已经成为一种过程处理语言,简称PL/SQL。

目前的PL/SQL包括两部分,一部分是数据库引擎部分;另一部分是可嵌入到许多产品(如C语言,JAVA语言等)工具中的独立引擎。

可以将这两部分称为:数据库PL/SQL和工具PL/SQL。

两者的编程非常相似。

都具有编程结构、语法和逻辑机制。

工具PL/SQL另外还增加了用于支持工具(如ORACLE Forms)的句法,如:在窗体上设置按钮等。

本章主要介绍数据库PL/SQL 内容。

PL/SQL的优点或特征有利于客户/服务器环境应用的运行对于客户/服务器环境来说,真正的瓶颈是网络上。

数据库PLSQL编程课件

数据库PLSQL编程课件

2、预定义异常
表2-3 常见异常情况表
3、自定义异常
异常不一定必须是oracle返回旳系统错误,顾客能够在自己旳应用程序 中创建可触发及可处理旳自定义异常,调用异常处理需要使用Raise语句。
异常情态旳传播指旳是当在程序块旳申明、执行、异常部分分别出现 异常情态时,或在本块中没有相应旳异常处理器时会将这个异常情态传播 到哪里,会去激发那个块中旳处理器。传播规则是这么旳:
WHILE…..LOOP有一种条件与循环相联络,假如条件为TRUE,则执 行循环体内旳语句,假如成果为FALSE,则结束循环。
(3)FOR..LOOP循环控制语句 FOR..LOOP循环控制语句旳格式如下: FOR counter IN [REVERSE] start_range..end_range LOOP
if condition1 then Statements_1 elsif condition2
then Statements_2 else Statements_3 end if 该体现式旳功能为:假如if后旳条件成立,执行then背面旳语句,不然判断 elseif背面旳条件,条件成立执行第二个then背面旳语句,不然执行else后旳语 句。这是条件语句嵌套。 IF 能够嵌套,能够在IF 或IF ..ELSE语句中使用IF或IF…ELSE语句。
2.2.4 运算符
与其他程序设计语言相同,PL/SQL有一系列操作符。 主要有: • 算术操作符 + - * / ** || • 关系操作符 <> = > < in like is null between .. and • 逻辑操作符 and or not
2.2.5 流程控制 1.条件构造 2、循环控制 3、GOTO语句 2、嵌套

Oracle10g数据库基础教程第05章SQLPLUS

Oracle10g数据库基础教程第05章SQLPLUS

n 图形界面方式:
p 选择【开始】/【程序】/【Oracle – OraDb10g_home1】/【应用程序开发】菜单中选 择SQL Plus命令,出现如图所示登录窗口。
p 在【用户名】文本框中输入用户名,如scott;在【口 令】文本框中输入用户口令,如tiger;在【主机字符串】 文本框中输入数据库名,如orcl10g。
CONN[ECT] [username]/[password][@hoststring]
p DISC[ONNECT]:断开与数据库的连接。
n 注意:该命令作用仅仅是断开与数据库的连接,不退 出SQL*Plus环境!
PPT文档演模板
Oracle10g数据库基础教程第05章 SQLPLUS
5.2.2 编辑命令
p 运行方式
n 命令行方式
•两层结构——SQL*Plus客户端、数据
n 图形界面方式(GUI)

n 基于Web的iSQL*Plus方式 •三•层服结务构器——Web浏览器、
•应用服务器和数据库服务

PPT文档演模板
Oracle10g数据库基础教程第05章 SQLPLUS
p 在SQL*Plus中执行的语句有3种:
p 在SQL*Plus中执行SQL语句、PL/SQL程序时, 输入的SQL语句和PL/SQL程序代码会暂时存放 到SQL缓冲区中。
p 输入SQL语句
n 在语句最后加分号,并按回车,则立即执行该语句;
n 语句输入结束后回车,换行后再按回车,则结束SQL 语句输入但不执行该语句;
n 语句输入结束后按回车,换行后按斜杠(/),立即 执行该语句。
•注意:如果以系统用户 •身份!
Orcl10g as sysdba

plsql教程

plsql教程

plsql教程PL/SQL是一种与Oracle数据库一起使用的过程化编程语言。

它是操纵、定义和控制Oracle数据库对象的语言,并提供了一种编写存储过程、触发器、函数、包等数据库程序模块的方式。

PL/SQL的基本语法与SQL相似,可以执行SQL语句和存储过程的调用。

以下是一些常用的PL/SQL代码示例:1. 声明变量和常量:```DECLAREnum1 NUMBER := 10;text1 VARCHAR2(20) := 'Hello';constant1 CONSTANT NUMBER := 5;BEGIN-- 执行代码END;```2. 条件语句:```IF num1 > 0 THENNULL;ELSIF num1 = 0 THENNULL;ELSENULL;END IF;```3. 循环语句:```FOR i IN 1..5 LOOPNULL;END LOOP;WHILE num1 > 0 LOOP NULL;num1 := num1 - 1; END LOOP;LOOPNULL;EXIT WHEN num1 = 0; num1 := num1 - 1; END LOOP;```4. 异常处理:```BEGIN-- 执行代码EXCEPTIONWHEN OTHERS THEN -- 处理异常END;```5. 创建存储过程:```CREATE OR REPLACE PROCEDURE procedure_name (param1 IN NUMBER, param2 OUT VARCHAR2) IS-- 变量声明BEGIN-- 执行代码param2 := 'Hello';END;```这些只是PL/SQL语言的一部分功能和用法。

通过学习和实践,您可以掌握更多PL/SQL的知识和技巧,提高数据库编程的效率和质量。

plsqldeveloper开发指南教程


安装PL/sql Developer
运行安装程序,出现如下界面:
基本一路next,直到出现以下完成界面:
安装过程
点Finish,开始安装。完成后出现如下界面:
完成安装
点Close退出即可
Oracle客户端安装
运行”Setup.exe 选择”开始安装”,在欢迎”使用窗口”选择”下一步”:
Oracle客户端安装过程
使用技巧:格式化语句
说明:在使用PL/SQL Developer的SQL Window时,有时候输入的SQL语句太长或太乱,希望能用比较通用的写法格式话一下, 这样看起来会好看些,也好分析; 使用方法:选中需要格式化的SQL语句,然后点击工具栏的PL/SQL beautifier按钮即可
使用技巧:查看执行计划
Pl/sql Developer
黄艳涛 2011-11-13
PL/SQL Developer介绍 PL/SQL Developer 是一个为 Oracle 数据库开发存储程序单元的集成开发环境 (IDE),使用 PL/SQL Developer 可以方便地创建你的客户/服务器应用程序的服 务器部分。主要的功能有: · 使用文本编辑器写程序单元(过程、触发器等等)。 · 使用 Oracle SQL*Plus 编译源文件。 · 如果有编译错误,你必须找出它位于源文件何处,纠正它,转回到 SQL*Plus 重新编译它,然后再找下一处错误。 · 使用 SQL*Plus 或你的客户端应用程序测试程序单元。 · 使用解释计划工具或 tkprof 工具优化你的 SQL 语句。 · 使用 SQL*Plus 或另外的工具在你的数据库里查看或修改其它对象和数据。 这些任务 - 编辑、编译、纠正、测试、调试、优化和查询,在不离开 PL/SQL Developer IDE 的情况下都能被完成。

Oracle PL SQL DBA编程入门

E
14.5 集合的方

C
14.3 变长数组
F
14.6 本章小结
15 15 PL/SQL中的SQL
15 PL/SQL中的SQL
15.1 静态SQL
15.3 利用FORALL实现 SQL语句的批处理
15.2 动态SQL 15.4 本章小结
15 PL/SQL中的SQL
01
15.1.1 在 PL/SQL中使用 SELECT INTO 初始化变量
4.2.6 在查询中使用算数 运算符
4 SQL语言概述
4.2.7 在查询中使 用DISTINCT运算

4.2.8 在查询 中使用连接运算

4.2.9 在查询 中使用的书写规

4.2 数据查询语句
4.3.1 字符型单行函数 4.3.3 日期型单行函数
4 SQL语言概述
4.3 单行函数
4.3.2 数字型单行函数
8.8 触 发器的管 理
8.9 本 章小结
8.1.1 创建标准触发器
8 触发器
8.1 触发器的创建
8.1.2 创建基于Java语言 的触发器
8 触发器
8.7.1 WHEN条 件语句
A
8.7.2 IF条件语 句
B
8.7 触发器的条件语句
8 触发器
8.8.1 查看触发 器
8.8.3 屏蔽触发 器
8.8.2 重新编译 触发器
3.4 本章小结
3 数据库管理工具SQL*Plus
3.1.1 启动 SQL*Plus工

3.1.2 启动 iSQL*Plus工

3.1 SQL*Plus的启动
3 数据库管理工具SQL*Plus

Oracle数据库系统应用开发实用教程电子课件 第7章 PLSQL编程基础

大型数据库管理系统[Oracle]应用开发
1
第七章 PLSQL编程基础
2
学习目标
目标1: 了解PL/SQL语言的特点,执行过程与块组成部分。 目标2: 掌握各种类型的常量和变量用法。 目标3: 掌握各种不同的PL/SQL数据类型。 目标4: 掌握条件控制语句的编写方法。 目标5: 掌握循环控制语句的编写方法。 目标6: 掌握动态SQL语句的适用情境及编写方法。 目标7: 掌握游标的分类以及显式游标的工作原理与操作过程。 目标8: 掌握带参数游标的编写方法。
Declare用于声明变量、游标
7.1.1 PL/SQL的特点
PL/SQL是一种可移植的高性能事务处理语言,它支持SQL 和面向对象编程,提供了良好的性能和高效的处理能力。 其特点包括以下几方面: 1.支持SQL
2.可移植性
3.高性能 4.与SQL紧密集成
5.安全性强
7.1.2 PL/SQL的执行过程
14
7.2.1 变量和常量的定义
声明
使用declare关键字 用于定义变量或者常量
DECLARE variable_name [CONSTANT] type [NOT NULL] [:=value];
声明
是否为常量
是否为空
变量名称
变量的数据 类型
变量初始化
7.2.2 变量和常量的命名规则
任务9: 通过游标为EMP表中某个部门的员工提高10%的薪水。
任务10:通过循环游标分别统计不同部门员工的薪水。 任务11:通过预定义异常程序处理系统出现的预定义异常。
任务12:通过自定义异常程序解决违反业务规则等异常。
7. PL/SQL编程基础

oracle-PLSQL-语法详细手册

SQL PL/SQL语法手册第一部分 SQL语法部分Create table 语句语句: CREATE TABLE [schema.]table_name( { column datatype [DEFAULT expr] [column_constraint] ... | table_constraint}[, { column datatype [DEFAULT expr] [column_constraint] ... | table_constraint} ]...)[ [PCTFREE integer] [PCTUSED integer][INITRANS integer] [MAXTRANS integer][TABLESPACE tablespace][STORAGE storage_clause][ RECOVERABLE | UNRECOVERABLE ][ PARALLEL ( [ DEGREE { integer | DEFAULT } ][ INSTANCES { integer | DEFAULT } ])| NOPARALLEL ][ CACHE | NOCACHE ]| [CLUSTER cluster (column [, column]...)] ][ ENABLE enable_clause| DISABLE disable_clause ] ...[AS subquery]表是Oracle中最重要的数据库对象,表存储一些相似的数据集合,这些数据描述成若干列或字段.create table 语句的基本形式用来在数据库中创建容纳数据行的表.create table 语句的简单形式接收表名,列名,列数据类型和大小.除了列名和描述外,还可以指定约束条件,存储参数和该表是否是个cluster的一部分.Schema 用来指定所建表的owner,如不指定则为当前登录的用户.Table_name 用来指定所创建的表名,最长为30个字符,但不可以数字开头(可为下划线),但不可同其它对象或Oracle的保留字冲突.Column 用来指定表中的列名,最多254个.Datatype 用来指定列中存储什么类型的数据,并保证只有有效的数据才可以输入.column_constraint 用来指定列约束,如某一列不可为空,则可指定为not null.table_constraint 用来指定表约束,如表的主键,外键等.Pctfree 用来指定表中数据增长而在Oracle块中预留的空间. DEFAULT为10%,也就是说该表的每个块只能使用90%,10%给数据行的增大时使用. Pctused 用来指定一个水平线,当块中使用的空间低于该水平线时才可以向该中加入新数据行.Parallel 用来指定为加速该表的全表扫描可以使用的并行查询进程个数. Cache 用来指定该表为最应该缓存在SGA数据库缓冲池中的候选项. Cluster 用来指定该表所存储的 cluster.Tablespace 用来指定用数据库的那个分区来存储该表的数据. Recoverable|Unrecoverable 用来决定是否把对本表数据所作的变动写入Redo 文件.以恢复对数据的操作.As 当不指定表的各列时,可利用As子句的查询结果来产生数据库结构和数据.例:1) create table mytab1e(mydec decimal,myint inteter)tablespace user_datapctfree 5pctused 30;2) create table mytable2as ( select * from mytable1);create sequence语句语句: CREATE SEQUENCE [schema.]sequence_name[INCREMENT BY integer][START WITH integer][MAXVALUE integer | NOMAXVALUE][MINVALUE integer | NOMINVALUE][CYCLE | NOCYCLE][CACHE integer | NOCACHE][ORDER | NOORDER]序列用来为表的主键生成唯一的序列值.Increment by 指定序列值每次增长的值Start with 指定序列的第一个值Maxvalue 指定产生的序列的最大值Minvalue 指定产生的序列的最小值Cycle 指定当序列值逵到最大或最小值时,该序列是否循环.Cache 指定序列生成器一次缓存的值的个数Order 指定序列中的数值是否按访问顺序排序.例:1) create sequence myseqincrement by 4start with 50maxvalue 60minvalue 50cyclecache 3;2)sql> create sequence new_s;sql>insert into new (new_id,last_name,first_name)values(new_s.nextval,’daur’,’permit’);create view语句语句: CREATE [OR REPLACE] [FORCE | NOFORCE] VIEW [schema.]view_name [(alias [,alias]...)]AS subquery[WITH CHECK OPTION [CONSTRAINT constraint]]视图实际上是存储在数据库上旳 select语句.每次在sql语句中使用视图时,表示该视图的select语句就用来得到需要的数据.Or replace 创建视图时如果视图已存在,有此选项,新视图会覆盖旧的视图.Force 如有此选项,当视图基于的表不存在或在该模式中没有创建视图的权限时,也可以建立视图.As subquery 产生视图的select查询语句With check option 如果视图是基于单表的且表中所有的非空列都包含在视图中时,该视图可用于insert和update语句中,本选项保证在每次插入或更新数据后,该数据可以在视图中查到例:create or place view new_vasselect substr(d.d_last_name,1,3),d.d_lastname,d.d_firstname,b.b_start_date,b.b_locationfrom new1 d,new2 bwhere d.d_lastname=b.b_lastname;INSERT语句:语法INSERT INTO [schema.]{table | view | subquery }[@dblink][ (column [, column] ...) ]{VALUES (expr [, expr] ...) | subquery}[WHERE condition]插入单行使用VALUES关键词为新行的每一列指定一个值.如果不知道某列的值,可以使用NULL关键词将其值设为空值(两个连续的逗号也可以表示空值,也可使用NULL关键词)插入一行时试图为那些NOT NULL的列提供一个NULL值,会返回错误信息.举例:插入一条记录到DEPARTMENT表中INSERT INTO DEPARTMENT(DEPARTMENT_ID,NAME,LOCATION_ID)VALUES (01,’COMPUTER’,167)插入多行将SELECT语句检索出来的所有数据行都插入到表中.这条语句通常在从一个表向另一个表快速复制数据行.举例:INSERT INTO ORDER_TEMPSELECTA.ORDER_ID,B.ITEM_ID,,E.FIRST_NAME||'.'||ST_NAME,A.ORDER_DATE,A.SHIP_DATE,D.DESCRIPTION,B.ACTUAL_PRICE,B.QUANTITY,B.TOTALFROM SALES_ORDER A, ITEM B, CUSTOMER C,PRODUCT D, EMPLOYEE EWHERE MONTHS_BETWEEN(TO_DATE(A.ORDER_DATE),TO_DATE('01-7月-91'))>0AND A.CUSTOMER_ID=C.CUSTOMER_IDAND C.SALESPERSON_ID=E.EMPLOYEE_IDAND A.ORDER_ID=B.ORDER_IDAND B.PRODUCT_ID=D.PRODUCT_ID从其它表复制数据:要快速地从一个表向另一个尚不存在的表复制数据,可以使用CREATE TABLE语句定义该表并同时将SELECT语句检索的结果复制到新表中. CREATE TABLE EMPLOYEE_COPYASSELECT *FROM EMPLOYEEUPDATE语句:语法UPDATE [schema.]{table | view | subquery}[@dblink] [alias]SET { (column [, column] ...) = (subquery)| column = { expr | (subquery) } }[, { (column [, column] ...) = (subquery)| column = { expr | (subquery) } } ] ...[WHERE condition]UPDATE语句更新所有满足WHERE子句条件的数据行.同样,该语句可以用SELECT语句检索得到.但SELECT必须只检索到一行数据值.否则报错.而且每更新一行数据,均要执行一次SELECT语句.举例:UPDATE EMPLOYEE_COPSET SALARY=SALARY-400WHERE TO_NUMBER(TO_CHAR(HIRE_DATE,'YYMMDD'))<850101UPDATE ITEM_COP ASET A.ACTUAL_PRICE=(SELECT B.LIST_PRICEFROM PRICE B,SALES_ORDER CWHERE A.PRODUCT_ID=B.PRODUCT_ID ANDA.ORDER_ID=C.ORDER_ID ANDTO_NUMBER(TO_CHAR(C.ORDER_DATE,'YYYYMMDD')) BETWEEN TO_NUMBER(TO_CHAR(B.START_DATE,'YYYYMMDD')) ANDNVL(TO_NUMBER(TO_CHAR(END_DATE,'YYYYMMDD')),29991231))DELETE语句:语法DELETE [FROM] [schema.]{table | view}[@dblink] [alias][WHERE condition]DELETE语句删除所有满足WHERE子句条件的数据行.举例:DELETE FROM itemWHERE ORDER_ID=510TRUNCATE语句:语法TRUNCATE [schema.]table各类Functions:转换函数:函數:TO_CHAR语法:TO_CHAR(number[,format])用途:将一个数值转换成与之等价的字符串.如果不指定格式,将转换成最简单的字符串形式.如果为负数就在前面加一个减号.语法:TO_CHAR(date[,format])用途:将按format参数指定的格式将日期值转换成相应的字符串形式.同样,Oracle提供许多的格式模型,用户可以用它们的组合来表示最终的输出格式.唯一限制就是最终的掩码不能超过22个字符.下表列出了部分日期格式化元素.函數:TO_DATE语法:TO_DATE(string,format)用途:根据给定的格式将一个字符串转换成Oracle的日期值.该函数的主要用途是用来验证输入的日期值.在应用程序中,用户必须验证输入日期是否有效,如月份是否在1~12之间和日期中的天数是否在指定月份的天数内.函數:TO_NUMBER语法:TO_NUMBER(string[,format])用途:该函数将一个字符串转换成相应的数值.对于简单的字符串转换数值(例如几位数字加上小数点).格式是可选的.日期函数函數:ADD_MONTHS语法:ADD_MONTHS(date,number)用途:在日期date上加指定的月数,返回一个新日期.如果给定为负数,返回值为日期date之前几个月的日期.number应当是个整数,如果是小数,正数被截为小于该数的最大整数,负数被截为大于该数的最小整数.例如:SELECT TO_CHAR(ADD_MONTHS(sysdate,1),'DD-MON-YYYY') "Next month"FROM dualNext month-----------19-FEB-2000函數:LAST_DAY语法:LAST_DAY(date)用途:返回日期date所在月份的最后一天的日期.例如:SELECT SYSDATE, LAST_DAY(SYSDATE) "Last",LAST_DAY(SYSDATE) - SYSDATE "Days Left"FROM DUALSYSDATE Last Days Left--------- --------- ----------19-JAN-00 31-JAN-00 12函數:MONTHS_BETWEEN语法:MONTHS_BETWEEN(date1,date2)用途:返回两个日期之间的月份.如果两个日期月份内的天数相同(或者都是某个月的最后一天),返回值是整数.否则,返回值是小数,每于1/31月来计算月中剩余天数.如果第二个日期比第一个日期还早,则返回值是负数.例如:SELECT MONTHS_BETWEEN(TO_DATE('02-02-1992', 'MM-DD-YYYY'), TO_DATE('01-01-1992', 'MM-DD-YYYY'))"Months"FROM DUALMonths----------1.03225806SELECT MONTHS_BETWEEN(TO_DATE('02-29-1992', 'MM-DD-YYYY'), TO_DATE('01-31-1992', 'MM-DD-YYYY'))"Months"FROM DUALMonths----------1函數:NEXT_DAY语法:NEXT_DAY(date,day)用途:该函数返回日期date指定若天后的日期.注意:参数day必须为星期,可以星期几的英文完整拼写,或前三个字母缩写,或数字1,2,3,4,5,6,7分别表示星期日到星期六.例如,查询返回本月最后一个星期五的日期.例如:SELECT NEXT_DAY((last_day(sysdate)-7),'FRIDAY')FROM dualNEXT_DAY(---------28-JAN-00函數:ROUND语法:NEXT_DAY(date[,format])用途:该函数把一个日期四舍五入到最接近格式元素指定的形式.如果省略format,只返回date的日期部分.例如,如果想把时间(24/01/00 14:58:41)SELECT to_char(ROUND(sysdate,'HH'),'DD-MON-YY HH24:MI:SS')FROM dualTO_CHAR(ROUND(SYSDATE,'HH'),'DD-MON-YYHH24:MI:SS')-----------------------------------------------------------------24-JAN-00 15:00:00函數:TRUNC语法:TRUNC(date[,format])用途:TRUNC函数与ROUND很相似,它根据指定的格式掩码元素,只返回输入日期用户所关心的那部分,与ROUND有所不同,它删除更精确的时间部分,而不是将其四舍五入.例如:SELECT TRUNC(sysdate)FROM dualTRUNC(SYS---------24-JAN-00FLOOR函数:求两个日期之间的天数用;select floor(sysdate - to_date('20080805','yyyymmdd')) from dual;字符函数函數:ASCII语法:ASCII(character)用途:返回指定字符的ASCII码值.如果为字符串时,返回第一个字符的ASCII码值.例如:SELECT ASCII('Z')FROM dualASCII('Z')----------90函數:CHR语法:CHR(number)用途:该函数执行ASCII函数的反操作,返回其ASCII码值等于数值number的字符.该函数通常用于向字符串中添加不可打印字符.例如:SELECT CHR(65)||'BCDEF'FROM dualCHR(65------ABCDEF函數:CONCAT语法:CONCAT(string1,string2)用途:该函数用于连接两个字符串,将string2跟在string1后面返回,它等价于连接操作符(||).例如:SELECT CONCAT(‘This is a’,’ computer’)FROM dualCONCAT('THISISA','------------------This is a computer它也可以写成这样:SELECT ‘This is a’||’ computer’FROM dual'THISISA'||'COMPUT------------------This is a computer这两个语句的结果是完全相同的,但应尽可能地使用||操作符.函數:INITCAP语法:INITCAP(string)用途:该函数将字符串string中每个单词的第1个字母变成大写字母,其它字符为小写字母.例如:SELECT INITCAP(first_name||'.'||last_name)FROM employeeWHERE department_id=12INITCAP(FIRST_NAME||'.'||LAST_N-------------------------------Chris.AlbertsMatthew.FisherGrace.RobertsMichael.Douglas函數:INSTR语法:INSTR(input_string,search_string[,n[,m]])用途:该函数是从字符串input_string的第n个字符开始查找搜索字符串的第m 次出现,如果没有找到搜索的字符串,函数将返回0.如果找到,函数将返回位置.例如:SELECT INSTR('the quick sly fox jumped over thelazy brown dog','the',2,1)FROM dualINSTR('THEQUICKSLYFOXJUMPEDOVERTHELAZYBROWNDOG','THE',2,1)----------------------------------------------------------31函數:INSTRB语法:INSTRB(input_string,search_string[,n[,m]])用途:该函数类似于INSTR函数,不同之处在于INSTRB函数返回搜索字符串出现的字节数,而不是字符数.在NLS字符集中仅包含单字符时,INSTRB函数和INSTR函数是完全相同的.函數:LENGTH语法:LENGTH(string)用途:该函数用于返回输入字符串的字符数.返回的长度并非字段所定义的长度,而只是字段中占满字符的部分.以列实例中,字段first_name定义为varchar2(15).语法:SELECT first_name,LENGTH(first_name)FROM employeeFIRST_NAME LENGTH(FIRST_NAME)--------------- ------------------JOHN 4KEVIN 5函數:LENGTHB语法:LENGTHB(string)用途:该函数用于返回输入字符串的字节数.对于只包含单字节字符的字符集来说LENGTHB函数和LENGTH函数完全一样.函數:LOWER语法:LOWER(string)用途:该函数将字符串string全部转换为小写字母,对于数字和其它非字母字符,不执行任何转换.函數:UPPER语法:UPPER(string)用途:该函数将字符串string全部转换为大写字母,对于数字和其它非字母字符,不执行任何转换.函數:LPAD语法:LPAD(string,length[,’set’])用途:在字符串string的左边加上一个指定的字符集set,从而使串的长度达到指定的长度length.参数set可以是单个字符,也可以是字符串.如果string的长度小于length时,取string字符串的前length个字符.语法:SELECT first_name,LPAD(first_name,20,' ')FROM employeeFIRST_NAME LPAD(FIRST_NAME,20,'')--------------- -----------------------------------------JOHN JOHNKEVIN KEVIN函數:RPAD语法:RPAD(string,length[,’set’])用途:在字符串string的右边加上一个指定的字符集set,从而使串的长度达到指定的长度length.参数set可以是单个字符,也可以是字符串.如果string的长度小于length时,取string字符串的前length个字符.例如:SELECT first_name,rpad(first_name,20,'-')FROM employeeFIRST_NAME RPAD(FIRST_NAME,20,'-')--------------- -----------------------------------------JOHN JOHN----------------KEVIN KEVIN---------------函數:LTRIM语法:LTRIM(string[,’set’])用途:该函数从字符串的左边开始,去掉字符串set中的字符,直到看到第一个不在字符串set中的字符为止.例如:SELECT first_name,ltrim(first_name,'BA')FROM employeeWHERE first_name='BARBARA'FIRST_NAME LTRIM(FIRST_NAM--------------- ---------------BARBARA RBARA函數:RTRIM语法:RTRIM(string[,’set’])用途:该函数从字符串的右边开始,去掉字符串set中的字符,直到看到第一个不在字符串set中的字符为止.具有NULL值的字段不能与具有空白字符的字段相比较.这是因为空白字符与NULL字符是完全不同的两种字符.该函数的另外一个用途是当进行字段连接时去掉不需要的字符.函數:SUBSTR语法:SUBSTR(string,start[,length])用途:该函数从输入字符串中取出一个子串,从start字符处开始取指定长度的字符串,如果不指定长度,返回从start字符处开始至字符串的末尾.函數:REPLACE语法:REPLACE(string,search_set[,replace_set])用途:该函数将字符串中所有出现的search_set都替换成replace_set字符串.可以使用该函将字符串中所有出现的符号都替换成某个有效的名字.如果不指定replace_set,则将从字符串string中删除所有的搜索字符串search_set.例如:SELECT REPLACE('abcdefbdcdabc,dsssdcdrd','abc','ABC')FROM dualREPLACE('ABCDEFBDCDABC,-----------------------ABCdefbdcdABC,dsssdcdrd函數:TRANSLATE语法:TRANSLATE(string,search_set,replace_set)用途:该函数用于将所有出现在搜索字符集search_set中的字符转换成替换字符集replace_set中的相应字符.注意:如果字符串string中的某个字符没有出现在搜索字符集中.则它将原封不动地返回.如果替换字符集replace_set比搜索字符集search_set小,那么搜索字符集search_set中后面的字符串将从字符串string中删除.例如:SELECTTRANSLATE('GYK-87M','0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ',9999999999xxxxxxxxxxxxxx')FROM dualTRANSL------xx-99x数值函数函數:ABS语法:ABS(number)用途:该函数返回数值number的绝对值.绝对值就是一个数去掉符号的那部分.函數:SQRT语法:SQRT(number)用途:该函数返回数值number的平方根,输入值必须大于等于0,否则返回错误.函數:CEIL语法:CEIL(number)用途:该函数返回大于等于输入值的下一个整数.函數:FLOOR语法:FLOOR(number)用途:该函数返回小于等于number的最大整数.语法:MOD(n,m)用途:该函数返回n除m的模,结果是n除m的剩余部分.m,n可以是小数,负数.函數:POWER语法:POWER(x,y)用途:该函数执行LOG函数的反操作,返回x的y次方.函數:ROUND语法:ROUND(number,decimal_digits)用途:该函数将数值number四舍五入到指定的小数位.如果decimal_digits为0,则返回整数.decimal_digits可以为负数.函數:TRUNC语法:TRUNC(number[,decimal_pluces])用途:该函数在指定的小数字上把一个数值截掉.如果不指定精度,函数预设精度为0. decimal_pluces可以为负数.语法:SIGN(number)用途:该函数返回number的符号,如果number为正数则返回1,为负数则返回-1,为0则返回0.函數:SIN语法:SIN(number)用途:该函数返回弧度number的正弦值.函數:SINH语法:SINH(number)用途:该函数返回number的返正弦值.函數:COS语法:COS(number)用途:该函数返回弧度number的三角余弦值.要用角度计算余弦,可以将输入值乘以0.01745转换成弧度后再计算.语法:COSH(number)用途:该函数返回输入值的反余弦值.函數:TAN语法:TAN(number)用途:该函数返回弧度number的正切值.函數:TANH语法:TANH(number)用途:该函数返回数值number的反正切值.函數:LN语法:LN(number)用途:该函数返回number自然对数.函數:EXP语法:EXP(number)用途:该函数返回e(2.71828183)的number次方.该函数执行自然对数的反过程.函數:LOG语法:LOG(base,number)用途:该函数返回base为底,输入值number的对数.单行函数:单行函数中可以对任何数据类型的数据进行操作.函數:DUMP语法:DUMP(expression[,format[,start[,length]]])用途:.SELECT DUMP('FARRELL',16)FROM dualDUMP('FARRELL',16)----------------------------------Typ=96 Len=7: 46,41,52,52,45,4c,4c函數:GREATEST语法:GREATEST(list of values)用途:该函数返回列表中项的最大值.对数值或日期来说,返回值是最大值或最晚日期,如果列表中包含字符串,返回值是按字母顺序列表中的最后一项.例如:SELECT GREATEST(123,234,432,112)FROM dualGREATEST(123,234,432,112)-------------------------432函數:LEAST语法:LEAST(list of values)用途:该函数返回列表中项的最小值.对数值或日期来说,返回值是最小值或最早日期,如果列表中包含字符串,返回值是按字母顺序列表中的第一项.例如:SELECT LEAST(sysdate,sysdate-10)FROM dualLEAST(SYS---------10-JAN-00函數:NVL语法:NVL(expression,replacement_value)用途:如果表达式不为空值,函数返回该表达式的值,如果是空值,就返回用来替换的值.例如:SELECT last_name,NVL(TO_CHAR(COMMISSION),'NOT APPLICABLE')FROM employeeWHERE department_id=30LAST_NAME NVL(TO_CHAR(COMMISSION),'NOTAPPLICABLE')--------------- ----------------------------------------ALLEN 300WARD 500MARTIN 1400BLAKE NOT APPLICABLE多行函数组函数可以对表达式的所有值操作,也可以只对其中不同值进行操作,组函数的语法如下所示:function[DISTINCT|ALL expression]如果既不指定DISTINCT,也不指定ALL,函数将对查询返回的所有数据行进行操作.不能在同一个SELECT语句的选择列中同时使用组函数和单行函数.函數:AVG语法:AVG([DISTINCT|ALL] expression)用途:对查询返回的数据行求平均值.例如:SELECT AVG(sal) "Average"FROM empAverage----------2073.21429函數:COUNT语法:COUNT([DISTINCT|ALL] expression)用途:计算表达式的个数.要计算EMP表中雇员的个数.例如:SELECT COUNT(deptno)FROM empCOUNT(DEPTNO)-------------14SELECT COUNT(distinct deptno)FROM empCOUNT(DISTINCTDEPTNO)---------------------3函數:MAX语法:MAX([DISTINCT|ALL] expression)用途:对查询返回的行集求最大值.如果有多个最大值,将所有均返回.要检索公司中最高工资的雇员.语法:SELECT ename,salFROM empWHERE sal=(select max(sal)FROM emp)ENAME SAL---------- ---------KING 5000函數:MIN语法:MIN([DISTINCT|ALL] expression)用途:对查询返回的行集求最小值.如果有多个最小值,将所有均返回.例如:SELECT MIN(last_name)FROM employeeMIN(LAST_NAME)---------------ADAMS函數:SUM语法:SUM([DISTINCT|ALL] expression)用途:计算查询返回的所有非空数值的总和.如果返回的数据都是空值,则该函数也返回空值.例如:SELECT SUM(salary)"Total"FROM employeeWHERE department_id=10Total---------8750函數:VARIANCE语法:VARIANCE([DISTINCT|ALL] expression)用途:该函数计算返回所有行的统计方差.例如:SELECT VARIANCE(salary)FROM employeeVARIANCE(SALARY)----------------TABLE: LOCATION 部门地址表 -------------------- -------- ----LOCATION_ID NOT NULL NUMBER(3) 地址IDREGIONAL_GROUP VARCHAR2(20) 地址名TABLE: DEPARTMENT 部门名称表 -------------------- -------- ----DEPARTMENT_ID NOT NULL NUMBER(2) 部门IDNAME VARCHAR2(14) 部门名称 LOCATION_ID NUMBER(3) 地址ID(LOCATION.LOCATION_ID)TABLE: JOB 工种表-------------------- -------- ----JOB_ID NOT NULL NUMBER(3) 工种IDFUNCTION VARCHAR2(30) 工种名称 TABLE: EMPLOYEE 雇员信息表 -------------------- -------- ----EMPLOYEE_ID NOT NULL NUMBER(4) 雇员IDLAST_NAME VARCHAR2(15)FIRST_NAME VARCHAR2(15)MIDDLE_INITIAL VARCHAR2(1)JOB_ID NUMBER(3) 工种ID(JOB.JOB_ID)MANAGER_ID NUMBER(4) 领导ID(EMPLOYEE.EMPLOYEE_ID)HIRE_DATE DATE 雇佣日期 SALARY NUMBER(7,2) 薪水COMMISSION NUMBER(7,2) 佣金DEPARTMENT_ID NUMBER(2) 部门ID(DEPARTMENT.DEPARTMENT_ID)TABLE: SALARY_GRADE 薪资等级表 -------------------- -------- ----GRADE_ID NOT NULL NUMBER(3) 等级IDLOWER_BOUND NUMBER(7,2) 最低工资 UPPER_BOUND NUMBER(7,2) 最高工资 TABLE: PRODUCT 产品信息表 -------------------- -------- ----PRODUCT_ID NOT NULL NUMBER(6) 品号DESCRIPTION VARCHAR2(30) 品名TABLE: PRICE 产品价格表 -------------------- -------- ----PRODUCT_ID NOT NULL NUMBER(6) 品号(PRODUCT.PRODUCT_ID)LIST_PRICE NUMBER(8,2) 价格MIN_PRICE NUMBER(8,2) 最低价格 START_DATE NOT NULL DATE 生效日期 END_DATE DATE 失效日期 TABLE: CUSTOMER 客户信息表 -------------------- -------- ----CUSTOMER_ID NOT NULL NUMBER(6) 客户ID(CUSTOMER.CUSTOMER_ID)NAME VARCHAR2(45) 客户名ADDRESS VARCHAR2(40) 客户地址 CITY VARCHAR2(30) 城市STATE VARCHAR2(2) 州ZIP_CODE VARCHAR2(9) 邮编AREA_CODE NUMBER(3) 区号PHONE_NUMBER NUMBER(7) 电话号码 SALESPERSON_ID NUMBER(4) 销售员ID(EMPLOYEE.EMPLOYEE_ID)CREDIT_LIMIT NUMBER(9,2) 信用限制 COMMENTS LONG 备注TABLE: SALES_ORDER 订单单头表 -------------------- -------- ----ORDER_ID NOT NULL NUMBER(4) 订单IDORDER_DATE DATE 订单日期 CUSTOMER_ID NUMBER(6) 客户ID(CUSTOMER.CUSTOMER_ID)SHIP_DATE DATE 出货日期 TOTAL NUMBER(8,2) 总金额TABLE: ITEM 订单单身表 -------------------- -------- ----ORDER_ID NOT NULL NUMBER(4) 订单ID(SALES_ORDER.ORDER_ID)ITEM_ID NOT NULL NUMBER(4) 订单行号 PRODUCT_ID NUMBER(6) 品号(PRODUCT.PRODUCT_ID)ACTUAL_PRICE NUMBER(8,2) 实际价格 QUANTITY NUMBER(8) 订单数量 TOTAL NUMBER(8,2) 总金额第二部分 PL/SQL语法部分PL/SQL语言简介(本讲义之所有程序均调式通过)首先我们看一个简单之例子,下面这个例子是统计从1至100的总和. declarei number:=0; /*声明变量井给初值*/t number:=1;error_message exception; /*声明一个出错处理*/beginfor t in 1..100 loopi:=i+t;end loop;if i>=5050 thenraise error_message; /*引发错误处理*/elseinsert into c_nt(c_t) values(i);end if;exceptionwhen error_message theninsert into c_nt(c_t) values(0);end;从上例中可以看出PL/SQL语法的一般规则.PL/SQL中语句以分号(;)结尾.开始程序块的PL/SQL语句(如IF…或BEGIN语句)没有分句.文本值括在单引号(‘ ‘)内,而不是(“ “).过程只允许最后有一个出口..PL/SQL程序可以分为三个部分DECLARE部分用于变量、常量、函数、过程、Cursor.BEGIN部分包含PL/SQL块中要执行的代码用于程序处理,其中可以调用函数、过程.Exception 部分用于出错处理.下面我们再看一个例子:declarei number :=1;t number :=1;p number :=1;/*create table c_ny(c_t number,cou_t number);*/function aa(xx number)return number is /* define function*/tt number;ct number:=1;j number:=1;beginwhile j<=xx loopct:=ct+j;j:=j+1;end loop;return ct;end aa;begin/*create table c_nt(c_t number,cou_t number);*/commit;while i<=200 loopt:=t+i;i:=i+1;p:=aa(i); /* calling function*/insert into c_nt values(t,p);commit;end loop;end;/说明:1.在定义变量可以赋初值,赋初值有两种方法,一为上程序所示,另一种为如下所示:DeclareI number default 92;T number default 0;2.定义常量DeclareI constant number:=1;T constant number:=9;3.定义函数function function_name(parameter type)return type is …declare variantbegin……end function_name;在上面的例子中我们定义了一个函数aa,在begin模块部分引用了此函数aa().4.定义过程procedure procedure_name(parameter IN type) is…declare variantbegin……exception……end procedure_name;见下例:declare/*t_emp c_nt%rowtype;*/i number:=1;t number:=1;procedure te_t(t_t number) is /*定义一个函数*/begininsert into c_nt1(t_1) values(t_t);end te_t;beginfor i in 1..100 loopte_t(i);調用函數end loop;end;/5.定义Cursordeclare/*t_emp c_nt%rowtype;*/t_emp1 number;t_emp2 number;cursor tes_t1is select * from c_nt;beginopen tes_t1;delete from c_nt1;commit;loopfetch tes_t1 into t_emp1,t_emp2;exit when tes_t1%notfound;insert into c_nt1 values(t_emp1,t_emp2);aend loop;close tes_t1;commit;end;/我们在open 一个cursor时,可能会存在一种情况,即我们不需要cursor 中所有之记录,我们该如何处理:1.在定义一个cursor时,可以附带参数如下所示declaecursor c1(p_emp_id) isselect emp_no,emp_name from dept_no where emp_id = p_emp_id; demp_pt c1%rowtype;……beginopen c1(123);loopfetch c1(123) into demp_pt…2.在将cursor中之记录项转到变量中时进行控制,如下所示:declarecursor isselect empt_no,empt_name from dept_no;p_no number;p_name number;beginloopfetch c1 into (p_no,p_name);if condition1 then……end if end;用於到cursor中變量進行控制注意:因为PL/SQL 不支持I/O,所以程序所有结果都是放在数据档中.Delete from accts where status=’bad debt’If sql%rowcount>10 thenRaise out_of_bounds;End if;另:在声明一个变量时,PL/SQL 提供两种变量类型:%TYPE,%ROWTYPE.1.%TYPE使用%TYPE 时,可以有种用法:一用法见下例:declareBalance number(7,2);Minimum_balance balance%type:=10.00;在上例中,minimum_balance 数据类型为number(7,2)具默认值为10.00. 二用法见下例(将数据类型与table 中一column datatype 相对应起来,如果table 中column datatype 变更,则在运行时,上数据类型会自动的变换上):declaremy_dname empc.empto%type;2.%rowtype使用%rowtype 数据类型用于将table 和cursor 中一数据行相对起来. 见下例:DeclareCursor my_cursor is select sal+nvl(comm,0) salcomm,wages,ename from emp;My_rec my_cursor%rowtype; Begin Open my_cursor; loopFetch my_cursor into my_rec ; Exit when my_cursor%notfound; If my_rec.wages>200 thenInsert into temp values (null,my_rec.wages,my_rec.ename); End if;End loop;Close my_cursor;End;定義一個%rowtype 類型,與my_cursor 中記錄行對應. 將my_cursor 中之記錄寫到my_rec 變量中去.变量说明在PL/SQL 中包括以下几种常见的变量类型:CHAR-存储定长的ASCII 字符串,允许存储数字,文本文符等,最长可255个字符.VARCHAR2-存储变长的字符串,尽管伋按符串的最大长度来定义,但VARCHAR2和CHAR 的区别在于如果达不到定义的长度,下的空间不会自动的填写为空格,VARCHAR2最大可以放入2000个字符.DATE-实际上是存储时间信息的日期/时间戳,在使用日期时,应考虑怎样使用日期函数.有关日期函数的格式见函数说明部分.NUMBER-存储数值数据,包括整数和浮点数、数据范围可以从110 到3810 ,而且,你有很大的数据空间. BOOLENA-存储布尔值.它表示是/否,真/假,1/0之类的东西.LONG-这是一种文本字符串,其长度大于VARCHAR2字段的2000个字符.该类最多可储存2 GB 个字符,与原始二进制数据相比,它只能存储字符信息. RAW-用来存储操作系统使用的原始二进制数据,可用于存储像图像或声音记录这样的信息,但这种数据长度最长度只有255字节.LONG RAW-与LONG 类型等价,但存储二进制数据,最长可达2GB 个字节. BINARY_INTEGER-这个字段按计算器使用的二进制格式存储信息,从 -2 到2 -1. 另:PL/SQL 提位两种复合类型:TABLE 和RECORD1.TABLE要定义一个数组,你使用表类型定义语句,例如要定义Last_name 数组,可以使用下述语句:type last_name_list is table of varchar2(22)index by binary_integer;last_name last_name_list;当定义一个长类型时,就涉及到一个删除表的问题,PL/SQL 表不能用Delete 语句来删除,但可以将每一行空值如下所示:sal_tab(3):=null;另一种法是定义两个相同类型的表类型,如果要将另一表清空,只需将空表给要清空的表即可.如下所示.declaretype numtabtype is table of numberindex by binary_integer;sal_tab numbertype;empty_tab numbertype;begin127 31 31for I in 1..100 loopsal_tab(I):=I;end loop;….End;2.RECORDDeclareType deptrectype is record(deptno number(2),dname char(14),loc char(14),);dept_rec deptrectype;beginselect deptno,dname,loc into dept_rec from dept where deptno=30; ……end;与所有的编程语言一样,定义一个变量时,同样存在变量作用范围问题: 如下所示:declarex real;function function_name(variant type)return type isdeclarex char;begin…end function_name;……beginx:=expression1……end;如果想引用另一block 之变量时,可以加上block label,如下所示:<<outer>> declarebirthdate date;begin變量x 為 real 類型. 在此範圍之內變量x 為char 變量x 為real 類型 Block label;…declarebirthdate date; begin….If birthdate=outer.birthdate then ….End if;End;End outer;引用outer block塊所定義之變量.PL/SQL控制程序流IF …THEN…ELSIF…ELSE…….END IF IF … THENSTATMENT1;elseif…then…statment2elseif…then…statment3ELSESTATMENT4;end if;例:<<outer>>for ctr in 1..20 loop…<<inner>>for ctr in 1..10 loopif outer.ctr>ctr then……end loop inner;end loop outer;2.loop…exit…end looploopsequence_of_statement;…exit;end loop;例:loopfetch c1 into …exit when c1%notfound;…end loop;close c1;另:加loop label;例:<<outer>>loop……exit outer when…end loop;…end loop outer;3.while…loop…end loop结构如下所示:例while total<=25000 loop….Select sa1 into salary from emp where…Total:=total+salary;End loop;4.for…loop…例1.select count(empno) into emp_count from emp; for L in 1..emp_count loop…end loop;例2.<<outer>>for step in 1..25 loopfor step in 1..10 loop…if outer.step>15 then…end loop;end loop outer;cursor….loopdeclaresursor c1 is select ename from emp;name varchar2(100);beginfor p_c1_rec in c1 loopname := p_c1_rec.ename;end loop;要创建存储过程,可以使用下面的SQL和PL/SQL语句:CREATE OR REPLACE PROCEDURE PROCEDURE_NAME(parameter list)AS…BEGIN…(SQL AND PL/SQL COMMANDS)END;存储函数create or replace function function_name (parameter list) return type is….Begin……end;PackagePackage分为两部分:Specific and Body在包说明部分中,主要将此包中所含的过程和Function的调用参数说明清楚,如:CREATE OR REPLACE PACKAGE ZDL_JOB_PKGASPROCEDURE ZDL_INSERT_JOB(p_bkc_id in number,p_item_id in number,p_job_number in out varchar2,p_group_id in number,p_lead_day in number,p_load_type in number,P_STATUS_TYPE IN NUMBER,P_USER_ID IN NUMBER,P_JOB_TYPE IN VARCHAR2);PROCEDURE ZDL_UPDATE_JOB(P_BKC_ID IN NUMBER,P_GROUP_ID IN NUMBER,P_STATUS_TYPE IN NUMBER,P_USER_ID IN NUMBER);FUNCTION WIP_MASS_LOAD(P_GROUP_ID IN NUMBER,P_USER_ID IN NUMBER) RETURN NUMBER;PROCEDURE ZDL_PRE_UPDATE;FUNCTION ZDL_UPDATE_ORACLE_WIP(P_USER_ID IN NUMBER) RETURN NUMBER; FUNCTION ZDL_JOB_STATUS (P_JOB_NUMBER IN VARCHAR2) RETURN NUMBER; END ZDL_JOB_PKG;在包体部分,主要将包说明部分之过程及Function之代码写出来,如:CREATE OR REPLACE PACKAGE BODY ZDL_JOB_PKGASPROCEDURE ZDL_INSERT_JOB (p_bkc_id in number, p_item_id in number,p_job_number in out varchar2,p_group_id in number,p_lead_day in number,P_LOAD_TYPE IN NUMBER,P_STATUS_TYPE IN NUMBER,P_USER_ID IN NUMBER,P_JOB_TYPE IN VARCHAR2)is…………begin…………end ZDL_INSERT_JOB;PROCEDURE ZDL_UPDATE_JOB(P_BKC_ID IN NUMBER,P_GROUP_ID IN NUMBER,P_STATUS_TYPE IN NUMBER,P_USER_ID IN NUMBER)AS…………BEGIN…………END ZDL_UPDATE_JOB;FUNCTION WIP_MASS_LOAD(P_GROUP_ID IN NUMBER,P_USER_ID IN NUMBER) RETURN NUMBERas…………begin…………END WIP_MASS_LOAD;PROCEDURE ZDL_PRE_UPDATE IS…………begin…………end ZDL_PRE_UPDATE;FUNCTION ZDL_UPDATE_ORACLE_WIP(P_USER_ID IN NUMBER) RETURN NUMBER IS…………begin…………end ZDL_UPDATE_ORACLE_WIP;FUNCTION ZDL_JOB_STATUS (P_JOB_NUMBER IN VARCHAR2) RETURN NUMBER AS…………BEGIN…………END ZDL_JOB_STATUS;END ZDL_JOB_PKG;所需系统权限要为某表创建触发器,必须能改变这个表,因此不仅要拥有表,并且要具有这个表的 alter权限,或者具有alter any table系统权限,除此之外,必须有create triger系统权限,若要在另一个用户账号(account)(也称之为模式(schema))上创建触发器,就必具有create any trigger系统权限.所需表权限触发器可以引用的表并不是初始化触发事件的表.触发器触发器有十二种类型.一个触发器的类型由执行触发器的层次位置和触发事务的类型定义.行级触发器在某个事务中,行级触发器行执行,对于上述ledger表中记例子而言,触发器.行级触发器是在create trigger命令中通过用for each row 子句创建的.合法的触发器类型当两种不同类型之触发动作相结合时,有十二种可能的配置:Before insert 行级触发器before insert 语句级触发器after insert 行级触发器after insert 语句级触发器before update 行级触发器before update 语句级触发器after update 行级触发器after update 语句级触发器before delete 行级触发器before delete 语句级触发器after delete 行级触发器after delete 语句级触发器例:CREATE OR REPLACE TRIGGER "APPS"."ZDL_BKC_JOB_BODY_AFI"AFTER INSERT ON "APPS"."ZDL_BKC_JOB_BODY"REFERENCING OLD AS OLD NEW AS NEW FOR EACH ROWBEGINInsert into audit_tbl values(:new.id,:new……);UPDATE ZDL_BKC_JOB_HEAD SET UPDATE_DATE = SYSDATEWHERE ZDL_BKC_JOB_HEAD_ID = :NEW.ZDL_BKC_JOB_BODY_ID; END;。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

oracle 10g SQL和PL/SQL编程指南
SQL(Structured Ouery Language)是关系数据库的基本操作语言。它主要包括数据查询,数
据操纵、数据定义等功能,是应用程序与数据库进行交互操作的接口。PL/SQL(Procedural
Language/SQL)是Oracle特有的编程语言,它可以像其他高级编程语言一样,编写出各种
完整的数据库操作功能的程序。由于PL/SQL由Oracle系统本身编译执行,所以程序运行
效率更高。《Oracle 10g SQL和PL/SQL编程指南》为Oracle数据库应用开发人员提供了SQL
使用指南和PL/SQL编程技术。通过学习《Oracle 10g SQL和PL/SQL编程指南》,读者不
仅可以掌握SQL和PL/SQL的基础知识,而且还可以掌握Oracle 10g SQL和PL/SQL的
许多高级特征。
《Oracle 10g SQL和PL/SQL编程指南》可作为高等院校计算机相关专业的辅助教材,也可
作为各类高级数据库编程人员的参考书。《Oracle 10g SQL和PL/SQL编程指南》的编写既
考虑了SQL和PL/SQL的初学者,同时也兼顾到有经验的PL/SQL编程人员。《Oracle 10g
SQL和PL/SQL编程指南》还可以作为培训五班的新材。
第I部分Oracle 10g概述
第1章Oracle简介
数据库的产生与发展
数据管理技术的产生与发展
数据库技术的发展
关系数据库产品简介
的产生与发展
10g简介
10g系列产品
10g 数据库for Windows版本

第2章数据库的建立
数据库逻辑设计
关系数据库设计基础
关系数据库规范化
数据库物理设计
数据库实施
创建数据库
数据库创建前的准备
安装数据库服务器并创建数据库

第3章SQL与PL/SQL概述
与PL/SQL简介
简介
简介
*Plus 简介
范例数据库表的建立
10g基本数据类型
定义表的结构
查看表结构
删除表
添加数据
查看数据
删除数据

第II部分SQL操作
第4章单表查询
简单查询
查询指定列
改变输出
空值处理
条件查询
单一条件查询
复合条件查询
记录排序
按单一列排序
按多列排序
分组查询
列函数及其应用
BY子句
子句

第5章子查询与集合操作
子查询
单行子查询
多行子查询
多列子查询
相关子查询
嵌套子查询
集合操作
使用集合操作符
集合操作的进一步讨论

第6章连接查询
内连接查询
简单内连接
复杂内连接
外连接查询
左外连接
右外连接
全外连接
其他特殊连接
交叉连接
自连接
第7章数据操纵语言与事务处理
数据操纵语言
插入数据(INSERT)
更新数据(UPDATE)
删除数据(DELETE、TRUNCATE TABLE)
数据库完整性
含有子查询的DML语句
数据事务处理
显式处理事务
隐式处理事务
特殊事务

第8章SQL函数
数字函数
数字函数概述
数字函数示例
字符函数
字符函数概述
字符函数示例
日期时间函数
日期时间函数概述
日期时间函数示例
转换函数
转换函数概述
转换函数示例

第9章数据控制语言与数据定义语言
数据控制语言
数据库权限
权限控制

建立表
获得表的相关信息
修改表定义
修改表名
删除表
索引
建立索引
获得索引信息
修改索引名字
删除索引
视图
建立视图
使用视图
获得视图定义信息
修改视图
删除视图

第III部分PL/SQL编程指南
第10章PL/SQL编程基础
SQL语言基础
块简介
基本语法要素
变量及其数据类型
在PL/SQL中执行SQL语句
执行SELECT语句
执行DML语句
执行事务处理语句
SQL程序控制结构
顺序结构
分支结构
循环结构
语句与NULL语句
异常处理
异常的基本概念
系统异常处理
自定义异常处理
使用异常函数
游标
游标应用基础
游标应用
游标FOR循环
游标的复杂应用

第11章复合数据类型
记录类型
定义记录
在SELECT语句中使用记录
在DML中使用记录
记录表类型
定义记录表
使用记录表
联合数组类型
定义联合数组
使用联合数组
嵌套表类型
定义嵌套表
使用嵌套表
变长数组类型
定义变长数组
使用变长数组类型
集合操作
使用集合属性与方法
使用集合操作符

第12章应用程序结构
子程序
过程
函数

定义包
包的管理
调用包
包中子程序的重载
触发器
概述
触发器
OF触发器
系统事件触发器
附录SQL*Plus常用命令

相关文档
最新文档