- 浏览: 20767 次
最新评论
--设置屏幕输出为on,即在屏幕上显示相应的输出。
SQL> set serveroutput on;
--dbms_output.put_line();相当于Java中的System.out.println();
SQL> begin
2
dbms_output.put_line('hello!');
3
end;
4
/
--PL/SQL 中声明变量用declare ,变量名在前,类型在后;约定俗成的变量命名以“V_”开头
SQL> declare
2
v_name varchar2(10);
3
begin
4
v_name := 'myname';
5
dbms_output.put_line(v_name);
6
end;
7
/
declare
v_num number := 0;
begin
v_num = 2/v_num;
dbms_output.put_line(v_num);
exception
when others then
dbms_output.put_line('error!');
end;
/
--变量声明,使用%type属性
declare
v_empno number(4);
v_empno2 emp.empno%type;
v_empno3 v_empno2%type;
--Table变量类型 即相当于Java中的数组类型
declare
--声明类型type_table_emp_empno是一个table类型,里边存放的是emp表中的empno类型的数据,用binary_integer类型的索引;该类型的变量的下标可以是负数。
type type_table_emp_empno is table of
emp.empno%type index by binary_integer;
--定义变量v_empnos 是上面声明的类型
v_empnos type_table_emp_empno;
--Record变量类型,相当于Java中的类
declare
type type_record_dept is record
--声明类型type_record_dept 是一个record
{
deptno
dept.deptno%type,
dname
dept.dname%type,
loc
dept.loc%type
};
v_temp type_record_dept;
--定义变量v_temp是上面声明的type_record_dept类型的
begin
v_temp.deptno := 50;
v_temp.dname :='aaa';
v_temp.loc := 'BJ';
dbms_output.put_line(v_temp.deptno
||' '||v_temp.dname);
end;
--使用%rowtype声明record变量
declare
v_temp dept%rowtype; --声明变量v_temp为 dept
整张表的行结构,当dept的表结构发生变化的时候该变量则跟着发生相应的变化
begin
v_temp.deptno := 50;
v_temp.dname :='aaa';
v_temp.loc := 'BJ';
dbms_output.put_line(v_temp.deptno
||' '||v_temp.dname);
end;
--SQL语句的运用
declare
v_ename emp.ename%type;
v_sal emp.sal%type;
begin
--用select语句时必须要有返回值,并且返回值只能有一条
select ename,sal into
v_ename,v_sal from emp where empno = 7369;
dbms_output.put_line(v_ename);
end;
declare
v_deptno dept.deptno%type :=50;
v_name dept.dname%ytpe :='aaa';
v_loc dept.loc%type := 'BJ';
begin
insert into dept2
values(v_deptno ,v_dname,v_loc);
commit;
end;
--PL/SQL中执行DDL语句需要在前面加上execute immediate 语句
begin
execute
immediate
'create table t (nnn varchar2(10)
default ''aaa'' )'; --用两个单引号对DDL语句中的单引号进行转义
end;
--if语句
--取出7369的薪水,如果<1200,则输出'low',如果<200则输出'middle',否则'high'
declare
v_sal emp.sal%type;
begin
select sal into v_sal from emp
where empno = 7369;
if(v_sal <1200)
then
dbms_output.put_line('low');
elsif (v_sal
< 2000) then
dbms_output.put_line('middle');
else
dbms_output.put_line('high');
end if;
end;
--PL/SQL中的循环
declare
i binary_integer :=1;
begin --相当于do..while循环
loop
dbms_output.put_line(i);
i :=
i+1;
exit when
(i>=11);
end loop;
end;
declare
j binary_integer :=1;
begin
while j<11
loop
dbms_output.put_line(j);
j :=
j+1;
end loop;
end;
begin
for k in 1..10 loop
dbms_output.put_line(k);
end loop;
--从1到10倒序循环
for k in reverse 1..10 loop
dbms_output.put_line(k);
end loop;
end;
--错误处理
declare
v_empno emp.empno%type;
begin
select empno into v_empno from
emp where deptno=10;
exception
when
too_many_rows then
dbms_output.put_line('太对记录了');
when others
then
dbms_output.put_line('error!');
end;
--错误日志的记录
create table errlog
(
id number primary key,
errcode number,
errmsg varchar2(1024),
errdate date
)
create sequence seq_errlog_id start with 1 increment by 1;
--创建errlog表的递增序列
declare
v_deptno dept.deptno%type := 10;
v_errcode number;
v_errmsg errlog.errmsg%type;
begin
delete from dept where deptno =
v_deptno;
commit;
exception
when others then
rollback;
v_errcode :=
SQLCODE;
v_errmsg
:=SQLERRM;
insert into
errlog values
(seq_errlog_id.nextval,v_errcode,v_errmsg,sysdate);
commit;
end;
--PL/SQL中cursor(游标)的使用
游标有四个属性:isopen、notfound、found、recount
declare
cursor c is
select * from emp;
v_emp c%rowtype;
begin
open c;
fetch c into v_emp;
dbms_output.put_line(v_emp.ename);
close c;
end;
--游标配合循环的运用
declare
cursor c is
select * from emp;
v_emp c%rowtype;
begin
open c;
loop
fetch c into
v_emp;
exit when
(c%notfound);
dbms_output.put_line(v_emp.ename);
end
loop;
close c;
end;
--用while循环的实现
declare
cursor c is
select * from emp;
v_emp c%rowtype;
begin
open c;
fetch c into v_emp;
while(c%found) loop
dbms_output.put_line(v_emp.ename);
fetch c into
v_emp;
end
loop;
close c;
end;
--用for循环的实现
declare
cursor c is
select * from emp;
begin
for v_emp in
c
loop
dbms_output.put_line(v_emp.ename);
end loop;
end;
--带参数的游标的实例:
declare
cursor c(v_deptno emp.deptno%type,v_job
emp.job%type) is
select ename,sal from emp where
deptno = v_deptno and job = v_job;
begin
for v_emp in
c(30,'CLERK')
loop
dbms_output.put_line(v_emp.ename);
end loop;
end;
--可更新的游标
declare
cursor c
is select * from emp2
for update;
begin
for v_temp in c loop
if(v_temp.sal
< 2000) then
update
emp2 set sal = sal *2 where current of c;
elsif
(v_temp.sal = 5000) then
delete
from emp2 where current of c;
end if
;
end loop;
commit;
end;
--存储过程
create or replace procedure p
is
cursor c
is select * from emp2
for update;
begin
for v_temp in c loop
if(v_temp.sal
< 2000) then
update
emp2 set sal = sal + 20 where current of c;
elsif
(v_temp.sal = 5000) then
update
emp2 set sal = sal + 50 where current of c;
else
update
emp2 set sal = sal +30 where current of c;
end if
;
end loop;
commit;
end;
--运行过程的命令如下;
execute p;
或者
begin
p;
end;
--创建带参数的存储过程
create or replace procedure p
(v_a in number,v_b in number,v_c out number,v_d
in out number)
is
begin
if(v_a > v_b)
then
v_c :=
v_a;
else
v_c
:= v_b;
end if ;
v_d := v_d +1;
end;
--调用带参数的过程的实例:
declare
v_a number := 3;
v_b number := 4;
v_c number;
v_d number := 5;
begin
p(v_a,v_b,v_c,v_d);
dbms_output.put_line(v_c);
dbms_output.put_line(v_d);
end;
--函数
create or replace function sal_tax
(v_sal number)
return number
is
begin
if(v_sal < 2000)
then
return
0.1;
elsif(v_sal
<2750) then
return
0.15;
else
return
0.20;
end if ;
end;
--创建函数后调用同其他函数一样,例如:
select sal_tax(sal) , lower(ename) from emp;
--触发器
create table emp2_log
(
uname varchar2(20),
action varchar2(10),
atime date
);
--创建触发器
create or replace trigger trig
after insert or delete or update on emp2 for each
row
begin
if inserting then
insert into
emp2_log values (USER,'insert',sysdate);
elsif
updating then
insert
into emp2_log values (USER ,'update' ,sysdate);
elsif
deleting then
insert
into emp2_log values(USER,'delete',sysdate);
end if;
end;
--创建一触发器,解决当你执行update dept set deptno = 99 where deptno =
10;时,会报emp表中已经有相应的引用的错
create or replace trigger trig
after update on dept
for each
row
begin
update emp set deptno =
:NEW.deptno where deptno =:OLD.deptno;
end;
--当执行一条语句时既检查约束条件也触发相应的触发器,则相应的触发器先被触发!
相关推荐
以下是对PL/SQL的学习笔记的详细解析: 1. **什么是PL/SQL语言** PL/SQL是Oracle数据库为数据库管理员和开发人员设计的一种编程语言。它扩展了SQL的功能,允许编写包含控制结构、变量、过程和函数的程序段,这些...
### PL/SQL学习笔记4 —— 集合与成员函数 #### 一、PL/SQL 表(索引表) 在PL/SQL中,**索引表**(也称为**PL/SQL表**)是一种非常有用的结构,它类似于数组但具有更多的灵活性。这种表是非持久化的,即它们不会...
在这个“我的PL/SQL学习笔记(一)”中,我们将探讨PL/SQL的基础知识,包括其语法结构、变量声明、流程控制以及如何与Oracle数据库中的数据进行交互。 首先,PL/SQL的基本结构分为声明部分、执行部分和异常处理部分...
在PL/SQL编程中,游标是处理查询结果集的重要工具。它们允许程序逐行处理结果,而不是一次性加载所有数据,这对于大型数据集尤其有用,因为它可以节省内存并提高性能。下面将详细解释游标的基本概念、分类以及如何在...
本文将深入探讨从"SQL,PL/SQL学习笔记"中提取的关键知识点,帮助编程人员更好地理解和运用这两种语言。 首先,我们关注SQL并行查询。通过`ALTER SESSION ENABLE PARALLEL DMl`,我们可以开启会话的并行DML操作,这...
在PL/SQL编程中,存储过程和函数是关键的组件,它们允许我们将可重用的代码逻辑存储在数据库中,以便于管理和调用。本文主要探讨了存储过程、函数以及程序包的概念,特点,创建方法,执行方式,权限管理以及参数处理...
PL/SQL数据库学习笔记 PL/SQL是一种高级的程序语言,主要用于Oracle数据库管理系统中。下面是PL/SQL数据库学习笔记的知识点总结。 一、基本原则 *瀑布模型:需求分析→设计(概要设计,详细设计:SQL语句,变量...
在学习PL/SQL的过程中,理解这些基本概念和结构是至关重要的。通过实践编写存储过程、函数和触发器,你可以逐渐掌握PL/SQL的强大功能,并利用它来解决实际的数据库编程问题。对于初学者来说,循序渐进、结合实例学习...
在PL/SQL的学习中,分区是数据库管理大型数据集的一种高效方法,特别是在处理大数据量时。本篇笔记主要探讨了何时应该使用分区以及Oracle支持的分区类型。 首先,当面对超过2GB的大数据表时,分区是十分必要的。这...
ORACLE PL/SQL是从入门到精通的专业知识,涵盖了数据库开发与管理的多个方面,包括...这本书籍将为读者提供一个全面、系统的学习路径,帮助数据库管理员、开发人员深入理解并掌握ORACLE PL/SQL的强大功能和应用技巧。
总的来说,“PL/SQL超级笔记”应该涵盖了从基本语法到高级特性的全面教程,通过学习,新手可以逐步掌握如何使用PL/SQL进行数据库编程,从而更好地管理和操作Oracle数据库。配合"oracle_ppt"中的PPT材料,学习效果会...
### PL/SQL听课笔记 #### 一、PL/SQL简介 **PL/SQL**(Procedural Language for SQL)是一种专门为Oracle数据库设计的过程化语言扩展。它是在标准SQL基础上增加了一系列高级编程特性,如变量、控制结构、函数、...
### PL/SQL 学习笔记知识点详解 #### 1. PL/SQL 基本结构 - **DECLARE**: 在此部分声明变量、常量、数据类型及游标。 - **BEGIN**: 主程序体开始,可以包含任何合法的PL/SQL语句。 - **EXCEPTION**: 异常处理部分,...
这篇课堂笔记主要涵盖了基础的SQL查询语法和部分PL/SQL概念。 首先,SQL查询的基础是从数据库中选择数据。`SELECT`语句用于指定需要选取的列,如`SELECT ename, sal, job FROM emp;`。字段顺序可以自由调整,例如`...
此文档由个人总结快速学习pl/sql的案例及说明,也是快速查询pl、sql开发的精华文档,在此提供给大家学习与查阅