plsql学习笔记1
declare
/*申明区 声明变量 定义类型*/
beginplsql的程序结构
/*执行区 执行sql语句或者plsql语句*/
exception
/*异常处理区*/
end;
set severoutput on
将输出结果显示在屏幕上
----------------------------------------
变量的数据类型
标准类型:
number
varchar2
date
boolean
binary_integer
组合类型
record table类型
参考类型
ref cursor
大类型:(一般存储的是资源的路径)
BFILE 大二进制 0~4G
blob 大字符类型 0~4G
clob
----------------------------------------
关于函数中变量的赋值,可以在声明时就初始化
也可以先声明,等用到的时候再赋值
赋值符号 := 可以赋值plsql中的任何类型
declare
num number;
name varchar2(30);
begin
num:=1;
name:='Judy';
dbms_output.put_line('NO.'||num||'is'||name);
end;
声明变量时就赋值
declare
num number:=1;
name varchar2(30):='Judy';
begin
dbms_output.put_line('NO.'||num||' is '||name);
end;
plsql中注释可以用
/**/ 多行注释 和 --单行注释
declare
name varchar2(10):='Tom';
begin
dbms_output.put_line('My name is '||name);
/*
注释
*/
end;
declare
name varchar2(10):='TOM';
begin
dbms_output.put_line('My name is '||name);
--注释1
--注释2
end;
constant 防止变量被修改
constant 修饰的变量必须初始化
declare
num constant number:=1;
begin
num:=2;
end;
constant修饰的变量再次赋值时将会出现如下错误
PLS-00363: expression 'NUM' cannot be used as an assignment target
变量声明之后未初始化的值为空
declare
num number;
begin
dbms_output.put_line('num is '||num||'?');
end;
在函数中需要用到,已存在的表中数据类型时
可以使用%type
emp_id s_emp.id%type;
s_emp数据库中已经存在的表名,id是所需要的表中的数据类型
可以使用select从一张表中取值然后赋给变量
declare
emp_id s_emp.id%type;
emp_name s_emp.first_name%type;
emp_salary s_emp.salary%type;
begin
select id,first_name,salary into emp_id,
emp_name,emp_salary from s_emp where id=1;
dbms_output.put_line(emp_id||' '||emp_name||
' '||emp_salary);
end;
record 相当于C语言中的结构体
type 记录名 is record(
变量名 类型,
变量名 类型
......
);
declare
type emp is record(
id number,
name varchar2(30)
);
emp1 emp;
emp2 emp;
begin
emp1.id:=1;
emp1.name:='Tom';
dbms_output.put_line(emp1.id||' '||emp1.name);
emp2:=emp1;
dbms_output.put_line(emp2.id||' '||emp2.name);
end;
同类型record在相互赋值时
可以整体赋值
也可以给几个需要的变量之间进行赋值
当需要在一个record中记录一个表格中的所有类型时
使用 表名%rowtype
declare
emp s_emp%rowtype;
begin
select * into emp from s_emp where id=1;
dbms_output.put_line(emp.id||' '||
emp.first_name||' '||emp.salary);
end;
注意:
emp中的变量名和使用
SQL>desc s_emp
查看到的表头里面变量名是一致的(包括类型和顺序)
---------------------------------------------
定义表类型
type 表名 is table of 表中的数据类型
index by binary_integer;
相当于C语言中的数组
其中数据类型可以时基本类型 也可以时记录类型
只有当向表中插入数据的时候才会分配内存
下标 是整数的取值范围,可以不连续
使用迭代思想
first() 得到第一元素的下标
next(n-1) 跟据上一个元素n-1的的下标得到下一个元素的下标
last() 最后一个元素的下标
基本类型表
declare
type numbertype is table of number
index by binary_integer;
nums numbertype;
num_index number;
begin
nums(1):=100;
nums(3):=300;
nums(5):=700;
/*改成循环
num_index:=nums.first();
dbms_output.put_line('nums(1)= '||nums(num_index));
num_index:=nums.next(num_index);
dbms_output.put_line('nums(3)= '||nums(num_index));
num_index:=nums.next(num_index);
dbms_output.put_line('nums(7)= '||nums(num_index));
*/
num_index:=nums.first();
loop
dbms_output.put_line('nums('||num_index||')'||
nums(num_index));
exit when num_index=nums.last();
num_index:=nums.next(num_index);
end loop;
end;
record类型表
declare
type employee is table of s_emp%rowtype
index by binary_integer;
emp employee;
emp_index binary_integer;
num number:=1;
begin
while(num<=25) loop
select * into emp(num) from s_emp where id=num;
num:=num+1;
end loop;
emp_index:=emp.first();
loop
dbms_output.put_line(emp(emp_index).id||':'||
emp(emp_index).first_name||':'||
emp(emp_index).salary);
exit when emp_index=emp.last();
emp_index:=emp.next(emp_index);
end loop;
end;
---------------------------------------------
plsql中的if语句
if 条件 then
/*符合条件执行代码*/
else
/*不符合条件执行的代码*/
end if;
if 条件1 then
/*符合条件1执行的代码*/
elsif 条件2 then
/*符合条件2执行的代码*/
........
elsif 条件n then
/*符合条件n执行的代码*/
else
/*所有上述条件都不符合执行的代码*/
------------------------------------------------
plsql中的循环
1.最简单的循环
loop
/*执行代码*/
exit when 退出条件
/*执行代码*/
end loop;
2.while 循环
while 退出条件 loop
/*执行代码*/
end loop;
3.for 循环
for i in 1..n loop
/*执行代码*/
end loop;
注:i 不需要声明,系统会自动声明
1..n的取值范围[1,n]
如果循环需要从n到1执行
for i in reverse 1..n loop
/*执行代码*/
end loop;
4.嵌套循环
begin
for i in 1..n loop
for j in 1..m loop
/*执行代码*/
end loop;
end loop;
end;
注:
在while和for循环中可以使用
exit when 退出条件
提前退出循环
-----------------------------------------
plsql中依旧和C语言中的变量规则一样,局部变量优先
plsql解决这种问题的办法标签
标签 <<标签名>>
<<abc>>
declare
num number:=1;
begin
declare
num number:=2;
begin
dbms_output.put_line('num='||num);
dbms_output.put_line('abc.num='||abc.num);
end;
end;