--设置数据库输出,默认为关闭,每次新打开窗口都要重新设置
set serveroutput on
--调用 包 函数 参数
execute dbms_output.put_line('hello world');
--或者用call调用,相当于java中的调试程序打桩
call dbms_output.put_line('hello world');
--pl语句块是pl/sql里最小的编程块,其中可以再嵌套begin end
begin
dbms_output.put_line('Hello World');
dbms_output.put_line('2*3='||(2*3));
dbms_output.put_line('what''s');
end;
--如何声明变量,所有变量必须再declare中声明,程序中不允许声明
--没有初始化的变量默认值为null,屏幕上null是看不见的,命名习惯:一般变量以v_开头
--注意number也能存小数,最长38位,所以以后建议整数都用binary_integer存
--long是字符类型,boolean类型补能打印
--标准变量类型:数字,字符,时间,布尔
declare
v_number1 number ;
v_number2 number(3,2) ;
v_number3 binary_integer :=1;
v_name varchar2(20) :='kettas';
v_date date :=sysdate;
v_long long :='ni hao';
v_b boolean := true;
begin
if (v_number1 is null) then
dbms_output.put_line( 'hello');
end if;
dbms_output.put_line(v_number1);
dbms_output.put_line(v_number2);
dbms_output.put_line(v_number3);
dbms_output.put_line(v_name);
dbms_output.put_line(v_date);
dbms_output.put_line(v_long);
--dbms_output.put_line(v_b);
end;
/
--组合类型:record table
--record类型最常用,声明的时候可以加not null,但必须给初始值
--如果record类型一致可以相互赋值,如果类型不同,里面的字段恰好相同,不能互相赋值
declare
type t_first is record(
id number(3),
name varchar2(20)
);
v_first t_first;
begin
v_first.id:=1;
v_first.name:='ws';
dbms_output.put_line(v_first.id);
dbms_output.put_line(v_first.name);
end;
/
--考虑一下,oracle中赋值方式是拷贝还是引用方式
declare
--v_number1 number:=1;
--v_number2 number;
type t_first is record(
id number,
name varchar2(20)
);
v_first t_first;
v_second t_first;
begin
--v_number2:=v_number1;
--v_number1:=2;
--dbms_output.put_line(v_number1);
--dbms_output.put_line(v_number2);
v_first.id:=1;
v_first.name:='susu';
--v_second:=v_first;
v_second.id:=v_first.id;
v_second.name:=v_first.name;
v_first.id:=2;
v_first.name:='kettas';
dbms_output.put_line(v_first.id);
dbms_output.put_line(v_first.name);
dbms_output.put_line(v_second.id);
dbms_output.put_line(v_second.name);
end;
/
-------------------------
--table类型,相当于java中的map,就是一个可变长的数组,key必须是整数,可以是负数,value可以是标量,也可以是record
--可以不按顺序赋值,但必须先赋值后使用
declare
type t_tb is table of varchar2(20) index by binary_integer;
v_tb t_tb;
begin
v_tb(100):='hello';
v_tb(98):='world';
dbms_output.put_line(v_tb(100));
dbms_output.put_line(v_tb(98));
end;
declare
type t_rd is record(id number,name varchar2(20));
type t_tb is table of t_rd index by binary_integer;
v_tb2 t_tb;
begin
v_tb2(100).id:=1;
v_tb2(100).name:='hello';
--dbms_output.put_line(v_tb2(100).id);
--dbms_output.put_line(v_tb2(100).name);
dbms_output.put_line(v_tb2(100).id||' '||v_tb2(100).name);
end;
/
--%type 和 %rowtype 以及如何从数据库把数据取回来
create table student33(
id number,
name varchar2(20),
age number(3,0)
);
insert into student(id,name,age) values(1,'susu',23);
--查找一个字段的变量
declare
v_name varchar2(20);
v_name2 student.name%type;
begin
select name into v_name2 from student33 where rownum=1;
dbms_output.put_line(v_name2);
end;
/
--查找多个字段的变量
declare
v_id student33.id%type;
v_name student33.name%type;
v_age student33.age%type;
begin
select id,name,age into v_id,v_name,v_age from student33 where rownum=1;
dbms_output.put_line(v_id||' '||v_name||' '||v_age);
end;
/
--查找一个类型的变量,推荐用*
declare
v_student student33%rowtype;
begin
select * into v_student from student33 where rownum=1;
dbms_output.put_line(v_student.id||' '||v_student.name||' '||v_student.age);
end;
/
--也可以按字段查找,但是字段顺序必须一样,不推荐这样做
declare
v_student student33%rowtype;
begin
select id,name,age into v_student from student33 where rownum=1;
dbms_output.put_line(v_student.id||' '||v_student.name||' '||v_student.age);
end;
/
declare
v_student student33%rowtype;
begin
select id,name,age into v_student.id,v_student.name,v_student.age from student33 where id=1;
--select * into v_student.id,v_student.name,v_student.age from student33 where id=1;
dbms_output.put_line();
end;
/
--注意:insert,update,delete,select都可以,create table,drop table不行
--dpl,dml,和流程控制可以在pl/sql里用,ddl不行
declare
v_name student33.name%type:='wang';
begin
insert into student33(id,name,age) values(2,v_name,26);
end;
/
--下边这种方式也可以
begin
insert into student33(id,name,age) values(5,'hehe',25);
end;
/
declare
v_name student.name%type:='hexian';
begin
update student set name=v_name where id=1;
end;
/
begin
update student33 set name='qinaide' where id=2;
end;
/
--delete
begin
delete from student33 where id=5;
end;
/
--变量的可见空间
declare
v_i1 binary_integer:=1;
begin
declare
v_i2 binary_integer:=2;
begin
dbms_output.put_line(v_i1);
dbms_output.put_line(v_i2);
end;
dbms_output.put_line(v_i1);
--dbms_output.put_line(v_i2);
end;
/
------------------------流程控制
--if判断
declare
v_b boolean:=true;
begin if v_b then
dbms_output.put_line('ok');
end if;
end;
/
--if else
declare
v_b boolean:=true;
begin
if v_b then
dbms_output.put_line('ok');
else
dbms_output.put_line('false');
end if;
end;
/
--if elsif else
declare
v_name varchar2(20):='ws';
begin
if v_name='0701' then
dbms_output.put_line('0701');
elsif v_name='ws' then
dbms_output.put_line('ws');
else
dbms_output.put_line('false');
end if;
end;
/
--loop循环,注意推出exit是推出循环,而不是推出整个代码块
declare
v_i binary_integer:=0;
begin
loop
if v_i>10 then
exit;
end if;
v_i:=v_i+1;
dbms_output.put_line('hehe');
end loop;
dbms_output.put_line('over');
end;
/
--更简单的写法
declare
v_i binary_integer :=0;
begin
loop
exit when v_i>10;
v_i :=v_i+1;
dbms_output.put_line('hehe');
end loop;
dbms_output.put_line('over');
end;
/
--while循环
declare
v_i binary_integer:=0;
begin
while v_i<10 loop
dbms_output.put_line('hello'||v_i );
v_i:=v_i+1;
end loop;
dbms_output.put_line('over');
end;
/
--for循环,注意不需要声明变量
begin
for v_i in 0..10 loop
dbms_output.put_line('hello'||v_i);
end loop;
dbms_output.put_line('over');
end;
/
--练习1用循环往student里插入30条记录
--要求:id为0,1,2...
-- name为kettas0,kettas1,kettas2...
-- age为11,12,13...
--练习2,假设不知道数据库里的数据规则和数量,
--把所有的student33数据打印到终端
--问题1答案
declare
v_student student33%rowtype;
begin
delete from student33;
for v_i in 0..20 loop
insert v_student into student33(id,name,age) values(v_i,'kettas'||v_i,10+v_i);
end loop;
end;
/
--也可以这样
begin
delete from student33;
for v_i in 0..20 loop
insert into student33 values(v_i,'susu'||v_i,18+