PL /SQL是一种高级数据库程序设计语言,该语言专门用于在各种环境下对ORACLE数据库进行访问。由于该语言集成于数据库服务器中所以PL/SQL代码可以对数据进行快速高效的处理。PL/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/SQLORACLE系统的核心语言,现在ORACLE的许多部件都是由PL/SQL写成。在PL/SQL中可以使用的SQL语句有:

INSERT,UPDATE,DELETE,SELECT INTO,COMMIT,ROLLBACK,SAVEPOINT。

提示:在 PL/SQL中只能用 SQL语句中的 DML 部分,不能用 DDL 部分,如果要在PL/SQL中使用DDL(CREATE  table  )的话,只能以动态的方式来使用。

l  ORACLE 的 PL/SQL 组件在对 PL/SQL 程序进行解释时,同时对在其所使用的表名、列名及数据类型进行检查。

l  PL/SQL 可以在SQL*PLUS 中使用。

l  PL/SQL 可以在高级语言中使用。

l  PL/SQL可以 在ORACLE的 开发工具中使用。

l  其它开发工具也可以调用PL/SQL编写的过程和函数,如Power Builder 等都可以调用服务器端的PL/SQL过程。

PL/SQL程序由三个块组成,即声明部分、执行部分、异常处理部分

PL/SQL块的结构如下:

 

DECLARE 

/* 声明部分: 在此声明PL/SQL用到的变量,类型及游标,以及局部的存储过程和函数 */

BEGIN

    /*  执行部分过程及SQL 语句  , 即程序的主要部分  */

EXCEPTION

   /* 执行异常部分: 错误处理  */

END;

其中 执行部分是必须的。

标识符

PL/SQL程序设计中的标识符定义与SQL 的标识符定义的要求相同。要求和限制有:

l  标识符名不能超过30字符;

第一个字符必须为字母;

不分大小写;

l  不能用’-‘(减号);

l  不能是SQL保留字。

提示一般不要把变量名声明与表中字段名完全一样,如果这样可能得到不正确的结果.

例如:下面的例子将会删除所有的纪录,而不是KING 的记录;

DECLARE

Ename varchar2(20) :=’KING’;

BEGIN

DELETE FROM emp WHERE ename=ename;

END;

变量命名在PL/SQL中有特别的讲究,建议在系统的设计阶段就要求所有编程人员共同遵守一定的要求,使得整个系统的文档在规范上达到要求。下面是建议的命名方法

标识符

命名规则

例子

程序变量

V_name

V_name

程序常量

C_Name

C_company_name

游标变量

Name_cursor

Emp_cursor

异常标识

E_name

E_too_many

表类型

Name_table_type

Emp_record_type

Name_table

Emp

记录类型

Name_record

Emp_record

SQL*Plus 替代变量

P_name

P_sal

绑定变量

G_name

G_year_sal

记录类型

记录类型是把逻辑相关的数据作为一个单元存储起来,称作PL/SQL RECORD 的域(FIELD),其作用是存放互不相同但逻辑相关的信息

定义记录类型语法如下:

 

TYPE record_type IS RECORD(

Field1 type1  [NOT NULL]  [:= exp1 ],

Field2 type2  [NOT NULL]  [:= exp2 ],

. . .   . . .

Fieldn typen  [NOT NULL]  [:= expn ] ) ;

例如

declare

type test_rec is record(

name varchar2(30),

id number(4)

);

v_emp test_rec;

begin

v_emp.name:=’Tom’;

v_emp.id:=1234;

dbms_output.put_line(v_emp.name||’,’||v_emp.id);

end;

使用select…into 对变量进行赋值

declare

type test_rec is record(

name varchar2(30),

id number(4)

);

v_emp test_rec;

begin

select last_name,department_id into v_emp from employees where employee_id = 200;

dbms_output.put_line(v_emp.name||’,’||v_emp.id);

end;

提示: 1) DBMS_OUTPUT.PUT_LINE 过程的功能类似于 Java 中的 System.out.println() 直接将输出结果送到标准输出中.

        2) 在使用上述过程之前必须将 SQL * PLUS 的环境参数 SERVEROUTPUT 设置为 ON, 否则将看不到输出结果:  set serveroutput on

0. 准备工作:

set serveroutput on—这个是sql*plus语言,让sql*plus支持输出

hellowrold 程序

begin

dbms_output.put_line('hello world');

end;

/

1. 使用一个变量

declare

--声明一个变量

v_name varchar2(25);

begin

--通过 select ... into ... 语句为变量赋值

select last_name into v_name

from employees

where employee_id = 186;

-- 打印变量的值

dbms_output.put_line(v_name);

end;

2. 使用多个变量

declare

--声明变量

v_name varchar2(25);

v_email varchar2(25);

v_salary number(8, 2);

v_job_id varchar2(10);

begin

--通过 select ... into ... 语句为变量赋值

select last_name, email, salary, job_id into v_name, v_email, v_salary, v_job_id

from employees

where employee_id = 186;

-- 打印变量的值

dbms_output.put_line(v_name || ', ' || v_email || ', ' ||  v_salary || ', ' ||  v_job_id);

end;

3. 自定义记录类型

declare

--定义一个记录类型

type emp_record is record(

v_name varchar2(25),

v_email varchar2(25),

v_salary number(8, 2),

v_job_id varchar2(10));

--声明自定义记录类型的变量

v_emp_record emp_record;

begin

--通过 select ... into ... 语句为变量赋值

select last_name, email, salary, job_id into v_emp_record

from employees

where employee_id = 186;

-- 打印变量的值

dbms_output.put_line(v_emp_record.v_name || ', ' || v_emp_record.v_email || ', ' ||

v_emp_record.v_salary || ', ' ||  v_emp_record.v_job_id);

end;

4. 使用 %type 定义变量

declare

--定义一个记录类型

type emp_record is record(

v_name employees.last_name%type,

v_email employees.email%type,

v_salary employees.salary%type,

v_job_id employees.job_id%type);

--声明自定义记录类型的变量

v_emp_record emp_record;

begin

--通过 select ... into ... 语句为变量赋值

select last_name, email, salary, job_id into v_emp_record

from employees

where employee_id = 186;

-- 打印变量的值

dbms_output.put_line(v_emp_record.v_name || ', ' || v_emp_record.v_email || ', ' ||

v_emp_record.v_salary || ', ' ||  v_emp_record.v_job_id);

end;

5. 使用 %rowtype

declare

v_emp_record employees%rowtype;

begin

--通过 select ... into ... 语句为变量赋值

select * into v_emp_record

from employees

where employee_id = 186;

-- 打印变量的值

dbms_output.put_line(v_emp_record.last_name || ', ' || v_emp_record.email || ', ' ||

v_emp_record.salary || ', ' ||  v_emp_record.job_id  || ', ' ||

v_emp_record.hire_date);

end;

6. 赋值符号

declare

v_emp_record employees%rowtype;

v_employee_id employees.employee_id%type;

begin

--使用赋值符号位变量进行赋值

v_employee_id := 186;

--通过 select ... into ... 语句为变量赋值

select * into v_emp_record

from employees

where employee_id = v_employee_id;

-- 打印变量的值

dbms_output.put_line(v_emp_record.last_name || ', ' || v_emp_record.email || ', ' ||

v_emp_record.salary || ', ' ||  v_emp_record.job_id  || ', ' ||

v_emp_record.hire_date);

end;

7. 使用 IF ... THEN ... ELSIF ... THEN ... END IF;

要求: 查询出 150 员工的工资, 若其工资大于 10000 则打印 'salary > 10000'; 若在 5000 到 10000 之间, 则打印 '5000< salary <= 10000'; 否则打印 'salary <= 5000'

declare

v_salary employees.salary%type;

begin

--通过 select ... into ... 语句为变量赋值

select salary into v_salary

from employees

where employee_id = 139;

dbms_output.put_line('salary: ' || v_salary);

-- 打印变量的值

if v_salary > 10000 then

dbms_output.put_line('salary > 10000');

elsif v_salary > 5000 then

dbms_output.put_line('5000 < salary <= 10000');

else

dbms_output.put_line('salary <= 5000');

end if;

end

8. 使用 case ... when 完成上面的任务

declare

v_sal employees.salary%type;

v_msg varchar2(50);

begin

select salary into v_sal

from employees

where employee_id = 100;

--case 不能向下面这样用

/*

case v_sal when salary > 10000 then v_msg := '>10000'

when salary > 5000 then v_msg := '5000< salary <= 10000'

else v_msg := 'salary <= 5000'

end;

*/

v_msg :=

case trunc(v_sal / 5000)

when 0 then 'salary <= 5000'

when 1 then '5000< salary <= 10000'

else 'salary > 10000'

end;

dbms_output.put_line(v_msg);

end;

9. 使用循环语句打印 1 - 100.

1).

declare

v_i number(3) := 1;

begin

loop

dbms_output.put_line(v_i);

exit when v_i = 100;

v_i := v_i + 1;

end loop;

end;

2).

declare

v_i number(3) := 1;

begin

while v_i <= 100 loop

dbms_output.put_line(v_i);

v_i := v_i + 1;

end loop;

end;

3).

begin

for i in 1 .. 100 loop

dbms_output.put_line(i);

end loop;

end;

10. 使用 goto

PL/SQL中GOTO语句是无条件跳转到指定的标号去的意思。语法如下:

 

GOTO   label;

 . . .  . . .

<<label>> /*标号是用<< >>括起来的标识符 */

declare

--标记值, 若为 1 则是素数, 否则不是

v_flag number(1) := 0;

begin

for i in 2 .. 100 loop

v_flag := 1;

for j in 2 .. i - 1 loop

if i mod j = 0 then

v_flag := 0;

goto label;

end if;

end loop;

<<label>>

if v_flag = 1 then

dbms_output.put_line(i);

end if;

end loop;

end;

oracle 10g 学习之PL/SQL简介和简单使用(10)的更多相关文章

  1. oracle 10g 学习之基本 SQL SELECT 语句(4)

    本篇文章中,对于有的和MSSQL Server相同的语法我就没有再写了,这里我只写Oracle和MSSQL Server有点不同的 定义空值 l  空值是无效的,未指定的,未知的或不可预知的值 l  ...

  2. Oracle中PL/SQL简介、基本语法以及数据类型

    Oracle中PL/SQL简介.基本语法以及数据类型 一.PL/SQL简介. Oracle PL/SQL语言(Procedural Language/SQL)是结合了结构化查询和Oracle自身过程控 ...

  3. Oracle使用技巧及PL/SQL Developer配置

    Oracle使用技巧及PL/SQL Developer配置 摘自:http://livenzhao.spaces.live.com/blog/cns!6E368BE9F6DDD872!595.entr ...

  4. Oracle数据库之开发PL/SQL子程序和包

    Oracle数据库之开发PL/SQL子程序和包   PL/SQL块分为匿名块与命名块,命名块又包含子程序.包和触发器. 过程和函数统称为PL/SQL子程序,我们可以将商业逻辑.企业规则写成过程或函数保 ...

  5. Oracle安装步骤及PL/SQL Developer连接数据库

    一:Oracle安装步骤及PL/SQL Developer连接数据库 win7 64位 11g 点击(操作步骤):http://www.cnblogs.com/haoke/articles/27343 ...

  6. oracle pl/sql简介、块、过程

    pl/sql语言是oracle在sql上扩展的语言.1 过程.函数.触发器是在pl/sql编写2 过程.函数.触发器是在oracle中3 pl/sql的语句可以在java中直接调用 简单介绍 在sql ...

  7. 十九、oracle pl/sql简介

    一.pl/sql 是什么pl/sql(procedural language/sql)是oracle在标准的sql语言上的扩展.pl/sql不仅允许嵌入sql语言,还可以定义变量和常量,允许使用条件语 ...

  8. oracle pl/sql 简介

    一.pl/sql 是什么pl/sql(procedural language/sql)是oracle在标准的sql语言上的扩展.pl/sql不仅允许嵌入sql语言,还可以定义变量和常量,允许使用条件语 ...

  9. Oracle 数据库基础学习 (八) PL/SQL综合练习

    1.定义游标:列出每个员工的姓名.部门名称并编程显示第10个到第20个记录. declare cursor zemp_cursor is (select temp.ename, temp.dname ...

随机推荐

  1. JavaScript入门培训材料(Copy至此以作备份)

    JavaScript简明学习教程 2014年5月31日 目录 一.说明... 2 二.准备知识... 2 (一)HTML. 2 (二)DOM.. 3 三.JavaScript简介... 3 四.Jav ...

  2. SQL语句修改表字段名/修改字段长度/增加字段/删除字段

    修改字段名Exec sp_rename 'zxchem_Suggest.End_Date','Yj_Finish_Date','Column' 修改字段长度Alter Table zxchem_Sug ...

  3. B/S C/S架构的界面测试

    网站是B/S架构的典型,从做网站的有限经验来整理一下B/S测试的基本要点,并把它与C/S进行区分. 与C/S相比,以下4个测试是除了常用测试外还要注意的: (1)链接测试 (2)表单测试 (3)脚本测 ...

  4. C++ 模板双向不循环链表!!

    CTDChain<T,sort,equal,pointer> * nodeTemp = NULL; -------------------------------------------- ...

  5. WSP (无线会话协议)

    WSP (无线会话协议) WSP是在无线应用协议(WAP:Wireless Application Protocol )组中的协议,用两种服务提供无线应用环境一个稳定的接口. 中文名 WSP WAP ...

  6. 我的前端MVC之路

    大约十几个月前,了解到时下前端MVC之火爆,同事推荐我了解一下angular.当时也不是特别在意,只是稍稍阅读了一遍官方文档,并尝试了文档上的例子.其实当时也颇有震惊之感的,原来代码还可以这么写!看完 ...

  7. 大数据下Limit使用(MySQL)

    对于一直用Oracle的我,今天可是非常诧异,MySQL中同一个函数在不同数量级上的性能居然差距如此之大. 先看表ibmng(id,title,info)  唯一  id key 索引title 先看 ...

  8. 织梦系统规律:查看网站是不是用dedecms建的

    用dedecms织梦系统建站的童鞋,在遇见很喜欢的网站的时候总想知道人家的网站是用什么做的,怎么知道网站是不是dedecms建的呢?? 第一个方法: 可以直接在需要判断网站织梦版本的的URL路径后面添 ...

  9. Mac下部署Android开发环境附加NDK

    作为开发者,我们深有体会,不管是进行什么开发,为了部署开发环境,我们往往需要折腾很长时间.查阅很多资料才能完成,而且这次折腾完了,下次到了另一台新电脑上又得重新来过,整个部署过程记得还好,要是不记得又 ...

  10. 使用nginx lua实现网站统计中的数据收集

    导读网站数据统计分析工具是各网站站长和运营人员经常使用的一种工具,常用的有 谷歌分析.百度统计和腾讯分析等等.所有这些统计分析工具的第一步都是网站访问数据的收集.目前主流的数据收集方式基本都是基于ja ...