PLSQL串讲笔记

pl/sql是一种访问数据库的编程语言,专门访问oracle数据库,只能用于oracle。

 

begin开始 end结束

程序演示

      

declare

       v_num number;

       v_str varchar2(20);

begin

       v_num:=2+3;

       dbms_output.put_line('v_num='||v_num);

       v_str:='tom''s pen';

       dbms_output.put_line(v_str);

end;

      

dbms_output.put_line();里面只能写一个内容 写多个要加上||

 

 

要先打开输出结果显示 set serveroutput on;

@文件名

@test.sql 这个是进入sqlplus的目录下的文件

加上目录

@目录/test.sql      

/

----------------------------------------------------------

数字类型

       number

       number子类型

       binary_integer

              最主要的 是number 和binart_integer 两种类型

       number(3)  精度为3  有效数字为三位 ex:123

       number(3)如果赋值1234 编译的时候就会报错的

       number(4,3) 4为精度 3为刻度 ex:1.234 整数部分最多也就只有一位了

       number(4,3) 1.23456 有效的是 1.235 四舍五入

       number(3,-3) 小数点前面3为四舍五入

       p+|s|>=有效数位 ex:1234 结果就是1000 因为从2开始四舍五入

       number(4,6) ex:0.0012345 也是没有错误的 结果是 0.001235

*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*--*-*-*-*-*-

     有效数位是指从左边算起第一个不为0的数字开始算起     

*-*--*-*-*-*-*-*-*-*-*-*--*-*-**-*-*-*--*-*-**-*-*-*--**-*-*-*--*-*-**-*--**--**

       binary_integer 只能保存整数

       number底层不是用二进制来保存的

       如果变量数据日后一定和表里的数据进行计算 那么这样的情况下一般会用           

       number  如果保存的只是来进行计算 不能     跟表里的数据有什么交互 我们就使用binary_integer

字符类型

       varchar2 等价 varchar 等价sting.......

       long 和varchar2差不多 保存的字节数 没有varchar2多 跟数据库里的long是不同的

      

布尔类型

       boolean 布尔类型

日期类型

       date

       timestamp

 

查表里的数值 并且赋值给变量

 

declare

       v_id bob.id%type;

       v_name bob.name%type;

       v_salary bob.salary%type;

begin

       SELECT id,name,salary

       INTO v_id,v_name,v_salary

       FROM bob

       WHERE id=1;

       /*现在查询的结果只有一个,但是如果结果有两个值的话 用into会报错,定义 

       变量的属性参考数据库表的属性如果表里的字段属性发生变化,那么sql脚本 

       里面也要做出相应的更改*/

       dbms_output.put_line(v_id||''||v_name||''||v_salary);

end;

 

 

record  把多个变量集中在一种类型   进行一种封装

..............................................................................................

declare

      

/*

       v_id bob.id%type;

       v_name bob.name%type;

       v_salary bob.salary%type;

*/

TYPE t_bob IS RECORD(

       id bob.id%type,

       name bob.name%type,

       salary bob.salary%type

);

       v_bob  t_bob;

/* record 定义的顺序和 查询的顺序要一样*/

begin

       SELECT id,name,salary

       INTO v_bob

       FROM bob

       WHERE id=2;

       dbms_output.put_line(v_bob.id||''||v_bob.name||''||v_bob.salary);

end;

.............................................................................................

declare

 

TYPE t_bob IS RECORD(

       id bob.id%type,

       name bob.name%type,

       salary bob.salary%type

);

       v_bob  t_bob;

       v_bob2  t_bob;

begin

       SELECT id,name,salary

       INTO v_bob

       FROM bob

       WHERE id=2;

/*

       v_bob2.id:=v_bob.id;

       v_bob2.name:=v_bob.name;

       v_bob2.salary:=v_bob.salary;

*/

       v_bob2:=v_bob;

--在类型一样的时候 可以这样赋值

 

       dbms_output.put_line(v_bob.id||''||v_bob.name||''||v_bob.salary);

end;

............................................................................................

DECLARE

TYPE t_bob IS RECORD(

       id bob.id%type,

       name bob.name%type,

       salary bob.salary%type

);

       v_bob  t_bob;

/* record 定义的顺序和 查询的顺序要一样*/

begin

       SELECT *

--如果用星号  上面的record定义里面要跟表里免得顺序一样,全写出来

       INTO v_bob

       FROM bob

       WHERE id=2;

       dbms_output.put_line(v_bob.id||''||v_bob.name||''||v_bob.salary);

       end;

*****************************************************************

%rowtype

语法bob%rowtype

DECLARE

       v_bob  bob%rowtype;

/* record 直接获取表里的所有字段属性*/

begin

       SELECT *

--如果用星号  上面的record定义里面要跟表里面得顺序一样,全写出来

       INTO v_bob

       FROM bob

       WHERE id=2;

       dbms_output.put_line(v_bob.id||''||v_bob.name||''||v_bob.salary);

--输出的结果字段要和表里的字段一样了

end;

*****************************************************************

Table类型 是一个同种类型数据的集合

 

TYPE  类型名字  IS TABLE OF  任意一种已知的数据类型

INDEX BY BINARY_INTEGER;

 

DECLARE

       TYPE t_bob  IS TABLE OF  bob%rowtype  INDEX BY BINARY_INTEGER;

       v_bob t_bob;

begin

       select *

       into v_bob(100)

       from  bob

       where id=3;

 

       select *

       into v_bob(2000)

/*v_bob(2000)中的2000这个索引为任意数字 */

       from  bob

       where id=4;

dbms_output.put_line(v_bob(100).id||''||v_bob(2000).name);

end;

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Exercise

create table bob(

id number(3),

name varchar(10),

salary number(5),

cid number(2)

);

insert into bob values(1,'weqb',2000,1);

insert into bob values(2,'dasdas',2100,2);

insert into bob values(3,'bob',2400,1);

insert into bob values(4,'dasda',4500,2);

insert into bob values(5,'bob',7850,1);

insert into bob values(6,'aswb',1235,2);

 

把这些数据都检索出来 RECORD table

 

DECLARE

/*

type v_bob is record(

id bob.id%type,

name bob.name%type,

salary bob.salary%type,

cid bob.cid%type

);

 

c_bob bob%rowtype;

*/

type v_bob is table of  bob%rowtype index by binary_integer;

c_bob v_bob;

begin

select id,name,salary,cid

into c_bob(100)

from bob

where id=4;

dbms_output.put_line(c_bob(100).id||''||c_bob(100).name||''||c_bob(100).salary||''||c_bob(100).cid);

end;

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++

变量的作用域就是说 哪里能用 哪里不能用 从变量声明开始到该语句块结束

DECLARE

       V_num number := 100;

BEGIN

DECLARE

       V_str number := 100;

       V_num number := 10;

 BEGIN

       DBMS_OUTPUT.PUT_LINE(‘v_num=’||v_num);

       DBMS_OUTPUT.PUT_LINE(‘v_str=’||v_str);

 END;

--DBMS_OUTPUT.PUT_LINE(‘v_str=’||v_str);

END;

在最外面声明 不管里面有多少嵌套  都是可以使用的  而里面声明的变量外面就不可以使用的

在最外面加上标号 来访问

<>

DECLARE

       V_num number := 100;

BEGIN

DECLARE

       V_str number := 100;

       V_num number := 10;

 BEGIN

       DBMS_OUTPUT.PUT_LINE('v_num='|| outer.v_num);

       DBMS_OUTPUT.PUT_LINE('v_str='|| v_str);

 END;

--DBMS_OUTPUT.PUT_LINE('v_str='||v_str);

END;

******************************************************************

控制语句

If 语句

1.    If 布尔表达式(true) THEN

……..

………

End if;

\2.   If 布尔表达式(true)     THEN

……..

else

………

End if;

3.    If 布尔表达式(true)     THEN

……..

elseif布尔表达式(true)        THEN

.........

else

………

End if;

------------------------------------------------------------------------------------------------

exercis:

declare

v_flag boolean;

begin

if v_flag then

dbms_output.put_line('true');

elsif not v_flag then

dbms_output.put_line('false');

else

dbms_output.put_line('good');

end if;

end;

表bob id=3工资大于5000的 奖金给20%  2000-4500之间的是10% 小于2000的给5%

declare

c_bob  bob.salary%type;

c_bouns  bob.salary%type;

begin

select salary

into c_bob

from bob

where id=3;

if c_bob >5000 then

c_bouns:= c_bob *0.2;

elsif c_bob >2000 and c_bob <4500 then

c_bouns:= c_bob *0.1;

else

c_bouns:= c_bob *0.05;

end if;

dbms_output.put_line(' c_bouns ='|| c_bouns);

end;

******************************************************************

loop循环 

              loop

              .......

              if i>100 then

              exit;

              end if;

              end loop;

或者是

exit when i>100 替代if 语句

 

1+2+3+...+100=a

 

declare

v_sum number :=0;

i number :=1;

begin

loop

v_sum :=v_sum+i;

i :=i+1;

exit when i>100;

end loop;

dbms_output.put_line('v_sum='||v_sum);

end;

 

while循环

where 布尔表达式  loop  如果是真 就继续循环 直到假的时候终止循环

..................循环体

end loop;

declare

a number :=1;

i number :=0;

begin

while i<=100 loop;

a:=a+i;

i:=i+1;

end loop;

end;

******************************************************************

1.从bob表里循环的找出5名员工信息 保存到一个table变量里面

2.循环的从变量里把这些员工信息出去来

declare

type v_bob is table of  bob%rowtype index by binary_integer;

c_bob v_bob;

i number :=0;

begin

loop

select id,name,salary,cid

into c_bob(i+1)

from bob

where id=i+1;

i=i+1;

exit when i<=5;

end loop;

end;


如果给你带来帮助,欢迎微信或支付宝扫一扫,赞一下。