Oracle-PLSQL

2024-01-07 18:00:33

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;
??
??

?

文章来源:https://blog.csdn.net/ly121862/article/details/135377925
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。