栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 软件开发 > 后端开发 > Java

PL/SQL语法之匿名块语法(一)--变量类型及其操作、判断、循环

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

PL/SQL语法之匿名块语法(一)--变量类型及其操作、判断、循环

PL/SQL是在SQL语句的基础上,增加了一些过程化的语句。

过程化的语句包括:类型定义、判断、循环、游标。

PL/SQL代码分为两部分:匿名块和有名块。

匿名块语法:

匿名块的语法
[DECLARE] --声明部分 
声明的内容;
BEGIN  --执行部分 
  要执行的语句;
  [EXCEPTION] --异常处理
  要执行的语句;
END;

注:每一部分的语句后面都要加分号,end之后也要加,赋值使用  :=    判断相等使用  = ;

一、声明变量及其类型 1、声明变量
--声明变量的语法:变量名  类型长度 
DECLARE
  V_B  CHAr(2);
  V_C  EMP.EMPNO%TYPE;
BEGIN
  ...
END;

可以在声明的同时为其赋值。

2、变量类型
数值型number、int
字符型char、varchar2
日期型date、timestamp
布尔型boolean返回值对或错,不能打印,只能用来判断
表.列%type和某张表的某个列的数据类型一致
表%rowtype和某张表的表结构一致 

        %type的特性:
        (1)、引用的数据库列的类型可以不知道
        (2)、引用的数据库列的类型可以实时改变  

3、输入与输出

PL/SQL使用 ‘&’符号接收键盘输入的值

declare
v_a number:=&a;
v_b char(5):='&b';   --字符类型可以先使用单引号括起来
v_c date:=date'&c';  --日期类型同样如此
begin
...
end;

打印输出函数:dbms_output.put_line(值) 换行打印 
                         dbms_output.put(值) 不换行打印(必须配合换行打印一起使用)

declare
v_a varchar2:='hello';
v_b varchar2:='world';
begin
  dbms.output.put_line(v_a||' '||v_b);
end;
4、变量的赋值

(1)、直接赋值常量

(2)、将变量赋值给变量,变量可以重复赋值,新值会替换旧值

(3)、也可以将计算的值或函数赋值给变量,以及读取键盘输入的值直接赋值

(4)、select 。。。into  赋值   将select查询到的值(只能为单行,可以多列)赋值给变量,通常贝赋值的变量声明时使用  表.列%type 或者 表%rowtype这两种方法来赋值。

(5)returning  into   把dml的值赋给变量 (只能为单行,可以多列)

DECLARE
V_A NUMBER:=123; --在声明部分直接赋值 
V_B NUMBER;
V_C DATE:=DATE'&日期';
V_S EMP.SAL%TYPE;
V_J EMP.JOB%TYPE;
BEGIN 
  V_B:=V_A; --将变量赋值给变量
  SELECT SAL,JOB INTO V_S,V_J FROM EMP WHERe ENAME='SMITH';  --将emp表中名字为SMITH的工资和职位分别赋值为V_S,V_J
  DBMS_OUTPUT.put(V_A); --只是用不换行打印不会出结果
  DBMS_OUTPUT.put_line(V_B);  --换行先打印再换行
END; 
--创建emp_1 数据通emp
CREATE TABLE EMP_1 AS SELECt * FROM EMP;
--删除SMITH所在的行  打印删除的姓名和工资
--插入一条数据 打印插入的姓名和工资
--更新KING的的名字为小写 工资加一万 打印更新后的名字和工资
DECLARE 
V_E VARCHAr2(10);
V_S NUMBER;
BEGIN 
  DELETe FROM EMP_1 WHERe ENAME='SMITH' RETURNING ENAME,SAL 
  INTO V_E,V_S; --返回刚才操作数据中的属性给变量 
  DBMS_OUTPUT.put_line('删除的是:'||V_E||'她的工资是:'||V_S);
------------------------------------
  INSERT INTO EMP_1(ENAME,SAL)VALUES('张三',5000) RETURNING ENAME,SAL
  INTO V_E,V_S;
  DBMS_OUTPUT.put_line('插入的是:'||V_E||'她的工资是:'||V_S);
------------------------------------
  UPDATE EMP_1 SET ENAME=LOWER(ENAME),SAL=SAL+10000 WHERe ENAME='KING'
  RETURNING ENAME,SAL INTO V_E,V_S;
   DBMS_OUTPUT.put_line('更新的是:'||V_E||'她的工资是:'||V_S);
END;

        注:变量赋值用 ':=' 号,判断相等用 '=' 号; 变量的声明,宁滥勿缺。

        在命令窗口中写plsql语句   最终end之后要加上/表示结束
        注:在命令窗口中执行plsql语句 需要开启打印服务
               开启:SET SERVEROUTPUT ON 
              关闭:                  OFF

二、判断 1、IF判断 
      语法:IF 条件1  THEN 执行的语句;
      ELSIF 条件2  THEN 执行的语句;
      ELSIF 条件3 THEN ......;
      [ELSE 执行的语句;]
      END IF;   2、--CASE WHEN  
     CASE WHEN 条件1  THEN 执行的语句;
     WHEN 条件2  THEN 执行的语句;
     WHEN 条件3  THEN 执行的语句;
     .........
     ELSE  执行的语句;
     END CASE; 

例:

--键盘输入一个数字  大于0打印整数  小于0打印负数 0 打印0 
DECLARE 
V_A NUMBER:=&数;
begin 
  IF V_A>0 THEN 
    DBMS_OUTPUT.put_line('这是一个正数');
    ELSIF V_A<0 THEN 
      DBMS_OUTPUT.put_line('这是一个负数');
      ELSE 
        DBMS_OUTPUT.put_line('等于0');
      END IF;
END;

--键盘输入一个字母  如果大写 就打印大写 小写就打印小写
--其他打印我不认识 
DECLARE 
V_A CHAr(1):='&字符';
BEGIN 
  CASE WHEN V_A BETWEEN 'A' AND 'Z' THEN 
       DBMS_OUTPUT.put_line('大写');
       WHEN V_A BETWEEN 'a'  AND 'z' THEN 
       DBMS_OUTPUT.put_line('小写');
       ELSE 
       DBMS_OUTPUT.put_line('我不认识');
       END CASE;
END;

        sql的case when和plsql中的case when的区别?
        1、sql中的可以加列    plsql中只能加条件 
        2、sql中的不加分号    plsql中每个语句后面都要加分号
        3、sql中以end结尾     plsql中以end case结尾
        4、sql中的不能加dml语句   plsql中的后面可以加dml语句 

三、循环--普通循环、while循环、for循环 

1、普通循环

语法:
loop
  执行的语句;
  EXIT WHEN 中途退出的条件;
  [执行的语句;]  
END LOOP;
--循环打印1-10 
DECLARE 
V_A NUMBER:=1;
BEGIN 
  LOOP
    DBMS_OUTPUT.put_line(V_A);
    EXIT WHEN V_A=10;
    V_A:=V_A+1;
  END LOOP;
END;

2、while循环

语法:while 条件   --进入循环的条件 
     LOOP 
       执行的语句;
       [EXIT WHEN 中途退出的条件;]
     END LOOP;
--输入一个整数,打印它阶乘的式子,如输入3 打印 3x2x1=6
DECLARE
V_A NUMBER:=&a;
V_JI NUMBER:=1;
V_B  VARCHAr2(30);
BEGIN
  WHILE V_A >= 2
      LOOP
        V_JI:=V_JI*V_A;
        V_B:=V_B||V_A||'x';
        V_A:=V_A-1;
      END LOOP;
  DBMS_OUTPUT.put_line(V_B||V_A||'='||V_JI);
END;

 3、for循环

--FOR 循环 
语法:for  变量  IN [REVERSE] 小值 .. 大值 --reverse是从大值到小值循环递减
       LOOP
         执行的语句;
         [EXIT WHEN 中途退出的条件;]
       END LOOP;
--九九乘法表
declare
V_A CHAr(7);
begin
  for i in 1..9 
    loop
    for j in 1..9
      loop
      if i>=j then 
        V_A:=j||'x'||i||'='||j*i||' ';
        dbms_output.put(V_A);
      end if;
      end loop;
    dbms_output.put_line('');
    end loop;
end;

转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/1041147.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号