Oracle-PLSQL

plsql

sql: 结构化查询语言,

只注重 结果,不关心过程,

优点:

交互强,

数据库操纵能力强(DML DQL)

只需要发送命令,不需要关心如何实现

容易调试

plsql: 为了弥补sql的不足

在sql的基础上添加了一些过程化控制语句 (if,while)

plsql 强调过程,

要求 每一条语句的结束 都要以 分号 ; (英文) 结束

语法:
        
       [declare  变量名 类型:=初值;]  -- 声明变量
             begin
               
                   --语句序列;
                    [exception]   -- 发生错误时处理 
              
             end;

注意事项:
        a. 要求 所有的语句 必须以 英文分号 结束
        b. 如果 需要声明变量,则使用declare  然后 先写 变量名 变量类型:=初值;  如果 没有初值 则不用写 :=值
        c. begin   end;  必须 都存在 注意 end 后面要有 分号
        d. 变量 赋值 需要使用  变量名:=值,     :=   :=
        e. 在plsql中 字符串连接 使用 ||
  

简单输出

 -- plsql   简单输出
 begin
   
     -- 输出语句
      dbms_output.put_line('hello plsql');
       
      dbms_output.put_line('你好 plsql');
 end;
 ​
 ​

定义变量

 -- plsql  定义变量  ,需要指定变量的类型
 --          先写变量名  变量类型
 ​
 ​
 declare 
 sname varchar2(40);  -- 定义变量
    
 begin
 sname:='李四';   -- 给变量赋值  :=
     dbms_output.put_line(sname); -- 输出变量值
     dbms_output.put_line('你好,'||sname);  -- 你好,李四
      
 end;
 ​
 ​

 --  练习 , 请定义2个变量, 输出 
      我叫XXX, 我的年龄是XXX岁
 ​
 declare 
     myname VARCHAR2(30):='张丽丽';
     myage  number;
 begin
     myage := 20;
     dbms_output.put_line('我叫'||myname||',  我的年龄是'||myage||'岁'); 
 end;
 ​
 ​

 -- 输出 员工编号为 1001的 员工姓名及薪资
 ​
 --select ename,salary from emp where eno=1001;
 ​
 -- 解题思路:  先查询 ,再输出
 ​
 ​
 ​
 declare
    myname varchar2(50);
      mysal number;
 begin
 ​
     -- 查询 sql
           select ename,salary into myname,mysal
             from emp 
             where eno=1001;
 ​
       dbms_output.put_line(myname  || ',    '||mysal); 
             
             -- 当没有查询到数据时,显示 无此数据信息  no_data_found
             exception  when no_data_found 
                         then  
                             dbms_output.put_line('查无此人或找不到相关数据');
                                        
 end;
 ​

if

IF语句实现条件分支逻辑。

IF语句有三种风格:

  • IF THEN END IF;
  • IF THEN ELSE END IF;
  • IF THEN ELSIF ELSE END IF;
 -- plsql 中 if语句
 ​
 -- 如果 sex 值 0  输出 男
 ​
    /*
      语法:
        if 条件  then 条件成立时执行语句 ;       --当条件成立时 执行then 后面的语句
             else  条件不成立的执行语句;
          end if;                --结束if 
      
      */
 ​
  declare 
      bsex VARCHAR2(2):='0';
  begin
      
          if bsex='1' 
             then   
               dbms_output.put_line('女');
                 else
                   dbms_output.put_line('男');
          end if;
  end;
 ​
 -- 定义一个变量, 判断变量值 是否为 李四, 如果相等输出 就是李四
 ​
 ​
  declare 
      myname VARCHAR2(30):='22四';
  begin
      
          if myname='李四' 
             then   
               dbms_output.put_line('就是李四');
               else
                   dbms_output.put_line('不是李四');
          end if;
  end;
  
  --  显示 今天是 星期几?  是 工作日还是休息日
  
  --select to_char(sysdate,'day') from dual;
  
  
 declare 
     myday varchar2(20);  --声明变量
 begin
     
         select to_char(sysdate,'day') into myday   --查询,并为变量赋值
         from dual; 
          dbms_output.put_line('今天是'||myday);
         
       -- 对 myday进行判断
         if myday in ('星期六','星期日')
            then
                  dbms_output.put_line('今天是休息日');
              else
                  dbms_output.put_line('今天是工作日');
          end if;
 ​
 end;
 ​
 ​
 ​
 ​
 select to_char(sysdate,'yyyy') from dual;
 ​
 select EXTRACT(year from sysdate)from dual;
 ​

case

CASE 选择器表达式

指定一个表达式,此表达式的值的数据类型与每个 匹配表达式 兼容。如果 选择器表达式 的值与第一个 匹配表达式 匹配,那么将执行相应 THEN 子句中的语句。如果没有匹配项,那么将执行相应 ELSE 子句中的语句。如果没有匹配项,并且没有 ELSE 子句,那么将抛出异常。

WHEN 匹配表达式

指定要在 CASE 语句中进行求值的表达式。如果 选择器表达式 与某个 匹配表达式 匹配,那么将执行相应 THEN 子句中的语句。

THEN

此关键字引入要在相应布尔表达式求值为 TRUE 时执行的语句。

statement

指定一个或多个 SQL 或 PL/SQL 语句,每个语句都以分号终止。

ELSE

此关键字引入 CASE 语句的缺省情况。

 /*
   语法:
    case      
         when  条件1  then  语句1;
             when  条件2  then  语句2;
             when  条件3  then  语句3;
             else 
                 语句4; 
      end case;
 */
 ​
 declare
     mynum number:=20; -- 成绩
         info varchar2(50); -- 优良中差
 begin
 ​
    case
         when mynum>90  
                  then info:='优秀';
             when mynum>80  
                  then info:='良好';
             when mynum>60 
                then info:='中等';
             else 
                     info:='不及格';                    
      end case;
     dbms_output.put_line(info);
 end;
         
 --  定义一个变量,   如果变量 等于2  输出 2月,   9  9月  
 ​

loop

在PL/SQL中可以使用LOOP语句对数据进行循环处理,利用该语句可以循环执行指定的语句序列。常用的LOOP循环语句包含3种形式:基本的LOOP、WHILE...LOOP和FOR...LOOP。

 -- 定义 plsql 输出 1-100之间的 每一个数  101
 ​
 declare 
      i number :=1;
 begin
     
     while i<=100
      loop
         dbms_output.put_line(i);
             i:=i+1;
     
      end loop;
      
 end;
 ​
 /*
 plsql 中 循环的语法:
 ​
  1. while 循环
     while 循环条件      ---- 这里不能写 分号
         loop
             -- 重复的语句  (循环体) ,
         end loop;
 ​
 ​
  2.loop 循环  
         loop
             exit  when 条件;  -- 满足条件时 结束   ,  这里 一定要有分号
            --循环体
         end loop;
  3.for 循环
     
         for i in 初始值 .. 结束值
         loop
           --循环体
         end loop;
         
 ​
 */
 ​
  
 -- 循环输出 1-100 之间所有的奇数, 循环结束了   --- while 循环
 ​
 declare 
      i number :=1;
 begin
     
     while i<=100
      loop
         dbms_output.put_line(i);
             i:=i+2;
         
      end loop;
       dbms_output.put_line('while循环结束了');
 end;
 ​
 ​
 --循环输出 1-100 之间所有的奇数, 循环结束了  -- loop循环
 declare 
    i number:=1;
 begin
    loop
         exit when i>100;
         dbms_output.put_line(i);
             i:=i+2;
      end loop;
      
    dbms_output.put_line('loop循环结束了');
 end;
 ​
 ​
 -- 利用循环 输出 50次  ' 这是第50次 的  select * from  emp  '  (利用2中 循环来做)
 ​
 ​
 declare 
    
       num number:=0;
 begin
 ​
     for num  in 1 .. 50
     loop
            dbms_output.put_line('这是第'||num||'次的 xxxxxxx');
         end loop;
 ​
 end;
 ​
 ​
 select * from dept;
 ​
 --  循环 往 dept 表 插入 10条数据
 ​
 declare  
     num number:=1;
 begin
     while num<11
     loop
            -- 
              --dbms_output.put_line(num);
              insert into dept(depid,depname)
              values(num*10+num,'测试循环数据'||num);
              num:=num+1;
         end loop;
         
 end;
 ​
 -- 循环 删除dept表里的 10条数据  delete  drop
 ​
 declare 
   num number:=1;
 begin
    loop
        exit when num>10;
           -- 删除
             delete from dept where depid=(num*10+num);
             dbms_output.put_line('成功删除'|| num);
             num:=num+1;
              
      end loop;
       dbms_output.put_line('成功删除');
 end;
 ​
 ​
 ​
 ​
 --   1+2+3+4+5+6+....+100  =  5050   ?
 /*
    sum=0;
      放1 ,  sum= 0+1=1;
      放2 ,  sum= 1+2=3;
      放3 ,  sum= 3+3=6;
      放4 ,  sum= 6+4=10; 
    放5 ,  sum= 10+5=15;
      
      放i,    sum =  sum+i;  
 */
 ​
 declare 
    i number:=1;
      psum number:=0;   -- 不能用sum
 begin
    loop
        exit when i>100; 
          psum:=psum+i;   -- 计算和
          i:=i+1;    -- 自增1
      end loop;
    dbms_output.put_line('结果为'||psum);
    
 end;
 ​
 ​
 ​
 begin
 ​
   for r in 1..100 loop
 ​
        if mod(r,2)=0 then
 ​
                  dbms_output.put_line('结果为'||r);
                             
 ​
         end if;
 ​
     end loop;
 ​
    end;
 ​
 ​

 

你可能感兴趣的:(oracle,oracle,数据库)