PL/SQL学习笔记

来源:互联网 发布:ibeer free软件可乐 编辑:程序博客网 时间:2024/05/22 06:59
PL/SQL程序是按照块结构进行划分
块是PL/SQL程序的基本单位


declare:用于声明变量,游标
v_name varchar2(30):='jack';
v_weekday constant number(10):=7;
begin:表示程序的开始
Dbms_output.put_line(v_name);
Dbms_output.put_line('常量'|| v_weekday);
||表示两个变量相连接
select 列名 into 变量 from 表名
exception:表示异常
exception when others then
dbms_output.put_line('出现异常了'||sqlerrm);
end; :表示程序结束,分号结尾


流程控制:
if condition then
   Statements
end if;


if condition1 then
   Statements1
elsif condition2 then
   Statements1
end if;


declare 
 v_num number(2) :=&请输入数字
begin
 if v_num=1 then
 dbms_output.put_line('优秀');
 elsif 
 end if;
end;




declare
v_num number;
begin 
loop
//产生一个随机数字
v_num:=mod(dbms_Random.random(),10);
dbms_output.put_line('数字是'||v_num);
if v_num>100 then
exit;
endif;
endloop;
end;




declare
v_sum number(8):=0;
begin
for i in 1..100
loop
v_sum:=v_sum+i;
end loop;
dbms_output.put_line(v_sum);
end;


动态SQL:
在运行的时候执行一个建表的语句,建立的表结构由用户来决定
declare
v_sql varchar2(300):='&请输入建表的SQL语句';
begin
execute immediate v_sql;
dbms_output.put_line('创建成功');
exception when others then
dbms_output.put_line('执行有异常');
end;


declare
  v_id number(6):=&请输入id;
  v_name varchar2(90);
  v_sql varchar2(100):='select xueyuanminzi from xueshenbiao where xueyuanid=:1';
begin
  execute immediate v_sql into v_name using v_id;
  dbms_output.put_line(v_name);
end;




using:给语句中的点位符赋值
v_name xueshengbiao.xuiyuanmingzi%type;//声明这个变量类型和这个表的列的数据类型一样
v_xuesheng xueshengbiao%rowtype;//一个学员信息表的行类型,表示存储学员信息表的所有列
v_name:=dbms_random.string('i',10);//随机产生一个长度为10的字符串


---------------------------------------------------
创建一张表userinfo(usid number,uname varchar2(50),upass varchar2(50));
declare 


v_sql varchar2(100):='create table userinfo(uuid number(9),uname varchar2(30),upass varchar2(30))';
v_sqlname userinfo.uname%type:=dbms_random.string('u',10);
v_sqlpass userinfo.upass%type:=dbms_random.string('u',10);
v_tablecount number(3);
begin
  select count(*) into v_tablecount from user_tables where table_name='USERINFO';
  if v_tablecount=1 then 
    execute immediate 'drop table userinfo';
  end if;
  execute immediate v_sql;
  for i in 1..100
   loop 
  execute immediate 'insert into userinfo values(:a,:b,:c)'using i,v_sqlname,v_sqlpass;
end loop;
commit;
exception when others then
  dbms_output.put_line('出错了'||sqlerrm);
end;
----------------------------------------------------------


                     --------赌局游戏------
declare 
v_sqll varchar2(200):='create table duju(dujuid number(18),dujukaibao number(2),dujuxiazhu number(2),jieguo number(2),benjin number(5))';
v_sum number:=100;
v_kaibao number;
v_xiazhu number;
v_jieguo number;
v_tablecount number;
begin
   select count(*) into v_tablecount from user_tables where table_name='DUJU';
  if v_tablecount=1 then 
    execute immediate 'drop table duju';
  end if;
  execute immediate v_sqll;
  for i in 1..1000
    loop
      select trunc(dbms_random.value(0,2)) into v_kaibao from dual;
      if v_kaibao=0 then
        v_kaibao:=-1;
      end if;
      if i=1 then
       execute immediate 'insert into duju(dujuid,dujukaibao,jieguo,benjin) values(:a,:b,:c,:d)' using i,v_kaibao,0,v_sum;
      else
        if v_xiazhu=v_kaibao then
          v_jieguo:=1;
          v_sum:=v_sum+1;
        else
          v_jieguo:=-1;
          v_sum:=v_sum-1;
         end if;
          execute immediate 'insert into duju values(:a,:b,:c,:d,:e)' using i,v_kaibao,v_xiazhu,v_jieguo,v_sum;
      end if;
       v_xiazhu:=v_kaibao;
      commit;
    end loop;
    dbms_output.put_line('结果是:' || v_sum);
   exception when others when
      dbms_output.put_line(sqlerrm);
end;
-----------------------------------------------------------


--游标:常用于保存查询的结果
 
declare 


begin 
       update banji set banjimincheng='bj'
       dbms_output.put_line(sql%rowcount);  
       
end;


--显示游标的使用
--声明游标
--打开游标
--摘取游标
--关闭游标
-------------------
--查询一列的游标
declare
       cursor c_cur is select banjimingcheng from hanji;
       v_banjimingcheng banji.banjimingcheng%type;--定义banjimingcheng这个类型的变量
begin
        open c_cur;
         loop
       fetch c_cur into v_banjimingcheng;
        if c_cur%notfound then
         exit;
       end if;
       dbms_output.put_line('班级名称'||v_banjimingcheng);
    end loop;
       close c_cur;
end;




------------------
--查询一行的游标
declare 
       cursor c_topicname is select * from topid;
       v_topicname topid%rowtype;--定义topid表的一行类型的变量
begin
       open c_topicname;
       fetch c_topicname into v_topicname;
       dbms_output.put_line('主题ID'||v_topicname.topicid||'主题名称'||v_topicname.topicname||'父主题'||v_topicname.parentid);
       close c_topicname;
end;


---------------
--用for循环的游标
declare 
       cursor c_topicname is select * from topid;
begin
       for i in c_topicname
        loop
         dbms_output.put_line('主题ID'||v_topicname.topicid||'主题名称'||v_topicname.topicname||'父主题'||v_topicname.parentid);
         end loop;
end;




-----------------------
--带参数的游标
declare 
cursor c_topicname(v number) is select * from topid;
i topid%rowtype;
begin
  open c_topicname(1);
  loop
  fetch c_topicname into i;
     if i%notfound then
         exit;
     end if;
    dbms_output.put_line(i.topicid||'    '||i.topicname);
   end loop;
end;


----------------------------------
--动态游标:一个游标用于多个表查询
declare 
   TYPE MYCURTYPE is ref cursor;--声明了一个自己的游标类型
   c_cur MyCURTYPE;--声明该游标类型的变量
   v_flag number:=&请选择查询的信息1班级表2用户表
   v_banji banji%rowtype;
   v_userinfo userinfo%rowtype;
   
begin
  if v_flag=1 then
    open c_cur for select * from banji;
    loop
      fetch c_cur into v_banji;
      if c_cur%notfound then
        exit
      end if;
      dbms_output.put_line('班级名称'|| v_banji.banjimingcheng);
    end loop;
    elsif v_flag=2 then
      open c_cur for select * from userinfo;
          loop
      fetch c_cur into v_userinfo;
      if c_cur%notfound then
        exit
      end if;
      dbms_output.put_line('用户名称'|| v_userinfo.uname);
    end loop;
  close c_cur;
end;
0 0