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. easyUI框架之学习记录汇总

    在添加完之后,可以使用 $.parser.parse();这个方法进行处理:(1) 对整个页面重新渲染: $.parser.parse(); (2) 渲染某个特定的objectvar targetOb ...

  2. App接口简介

  3. CentOS 6.3 NFS的安装配置、启动及mount挂载方法

    一.环境介绍: 服务器:centos 192.168.1.225 客户端:centos 192.168.1.226 二.安装: NFS的安装配置: centos 5 : yum -y install ...

  4. 初学structs2,简单配置

    一.structs2-demo1项目下新建structs.xml文件,文件名必须是structs 二.package节点配置及其子节点配置 <!--name:单纯给包起个名字,保证和其他包不重名 ...

  5. xss概念剖析

    XSS又叫CSS (Cross-Site Scripting) ,跨站脚本攻击.恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意 ...

  6. php 非缓冲查询

    最近在开发一个PHP程序时遇到了下面的错误: PHP Fatal error: Allowed memory size of 268 435 456 bytes exhausted 错误信息显示允许的 ...

  7. Hello world,Hello 2014,Bye 2013

    序 想要写点什么的时候发现不知道写什么了,用一句话来总结2013的话,就是2013是既熟悉又陌生的一年,熟悉是同样的开发工作,陌生是从河南到北京的环境改变,当时大学的卧谈会,谈论毕业了要做什么,想要在 ...

  8. StackExchange Redis如何实现BRPOP/BLPOP

    今天在使用StackExchange Redis客户端时.我想要使用BRPOP,但是我发现StackExchange Redis并没有提供API,没办法只好找资料看文档了. 原来StackExchan ...

  9. 如何测试本机的公网IP能否被Internet用户访问

    声明:本机的公网IP是指ADSL拨号方式取得的公网IP,并非指固定公网IP. 一.新建IIS站点 xp系统需要有安装包才能安装IIS服务 windows7及以上与系统直接在windows->控制 ...

  10. quick-cocos2d-x学习笔记—定时器

    定时器用的地方还是比较多的,游戏中的逻辑判断很多都是采用每帧执行.quick对于schedule的封装在scheduler这个lua文件中.如果是第一次接触quick的话,可能按照官方的api来写一个 ...