草庐IT

Oracle学习笔记十九:PL/SQL流程控制语句

缥缈的尘埃 2023-03-28 原文

一、引言

• PL/SQL 程序可通过条件或循环结构来控制命令执行的流程。

• PL/SQL 提供了丰富的流程控制语句,与 Java 一样也有三种控制结构:

  • 顺序结构

  • 选择结构

  • 循环结构

二、选择结构

2.1、IF-THEN

1)IF-THEN

该结构先判断一个条件是否为 TRUE,条件成立则执行对应的语句块,与 Java 中的 if 语句很相似。

declare
    newsal emp.sal%type;
begin
    select sal into newsal from emp where ename='James';
    if newsal>=1500 then
        update emp set comm=1000 where ename='James';
    end if;
    commit;
end;

2)IF-THEN-ELSE

declare
    newsal emp.sal%type;
begin
    select sal into newsal from emp where ename='James';
    if newsal>=1500 then
        update emp set comm=1000 where ename='James';
    else
        update emp set comm=100 where ename='James';
    end if;
    commit;
end;

3)IF-THEN-ELSIF

declare
    newsal emp.sal%type;
begin
    select sal into newsal from emp where ename='James';
    if newsal>=1500 then
        update emp set comm=1000 where ename='James';
    elsif newsal>=1000 then
        update emp set comm=800 where ename='James';
    else
        update emp set comm=400 where ename='James';
    end if;
    commit;
end;

2.2、CASE

CASE 是一种选择结构的控制语句,可以根据条件从多个执行分支中选择相应的执行动作。也可以作为表达式使用,返回一个值。类似 Java 中的 switch 语句:

declare
    v_grade char(1) := upper('&p_grade');
begin
    case v_grade
        when 'A' then
            dbms_output.put_line('A');
        when 'B' then
            dbms_output.put_line('B');
        when 'C' then
            dbms_output.put_line('C');
        else
            dbms_output.put_line('not found char!');
    end case;
end;

三、循环结构

Oracle PL/SQL提供的循环类型有:

  • 无条件循环 LOOP-END LOOP 语句

  • WHILE 循环语句

  • FOR 循环语句

除了以上循环结构外,PL/SQL中还提供了EXIT用于强制退出循环,类似于 Java 中的 break 语句。

3.1、LOOP

LOOP 循环是最简单的循环,也称为无限循环,LOOP 和 END LOOP 是关键字。

declare
    v_sum number(10) :=0;
    i number(10) :=1;
begin
    loop
        v_sum:=v_sum+i;
        i:=i+1;
        if i>100 then
            exit;
        end if;
    end loop;
    dbms_output.put_line(v_sum);
end;

3.2、WHILE

WHILE 循环与 Java 中的 while 循环很类似。先判断条件,条件成立再执行循环体。

declare
    v_sum number(10) :=0;
    i number(10) :=1;
begin
    while i<=100 loop
        v_sum:=v_sum+i;
        i:=i+1;
    end loop;
    dbms_output.put_line(v_sum);
end;

3.3、FOR

FOR 循环需要预先确定的循环次数,可通过给循环变量指定下限和上限来确定循环的次数,然后循环变量在每次循环中递增(或者递减)。

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

四、动态SQL

• 在 PL/SQL 程序开发中,可以使用 DML 语句和事务控制语句,但是还有很多语句(比如 DDL 语句)不能直接在 PL/SQL 中执行,这些语句可以使用动态 SQL 来实现。

• PL/SQL 块先编译然后执行,动态 SQL 语句在编译时不能确定,只有在程序执行时把 SQL 语句作为字符串的形式由动态 SQL 命令来执行。

• 在编译阶段 SQL 语句作为字符串存在,程序不会对字符串中的内容进行编译,在运行阶段再对字符串中的 SQL 语句进行编译和执行。

语法格式:动态 SQL

  EXECUTE IMMEDIATE 动态语句字符串

  [INTO 变量列表]

  [USING 参数列表]

  • 如果动态语句是 SELECT 语句,可以把查询的结果保存到 INTO 后面的变量中。如果动态语句中存在参数,USING 为语句中的参数传值。

  • 动态 SQL 中的参数格式是:[:参数名],参数在运行时需要使用 USING 传值。

declare
    v_sql varchar2(128);
    v_sal emp.sal%type;
    v_empno emp.empno%type := '1001';
begin
    --执行动态查询
    execute immediate 'create table loginuser (id varchar2(10) primary key,name varchar2(20) not null)';
    v_sql:='select sal from emp where empno=''1001''';
    execute immediate v_sql into v_sal;
    dbms_output.put_line(v_sal);
    
    --执行带参查询
    v_sql:='select sal from emp where empno=:1';
    execute immediate v_sql into v_sal using v_empno;
    dbms_output.put_line(v_sal);
end;

 

有关Oracle学习笔记十九:PL/SQL流程控制语句的更多相关文章

  1. Ruby Readline 在向上箭头上使控制台崩溃 - 2

    当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby​​安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少

  2. ruby-on-rails - 带 Spring 锁的 Rails 4 控制台 - 2

    我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.

  3. ruby-on-rails - openshift 上的 rails 控制台 - 2

    我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新ruby​​gems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems

  4. ruby - 如何在 Ruby 中向现有方法定义添加语句 - 2

    我注意到类定义,如果我打开classMyClass,并在不覆盖的情况下添加一些东西我仍然得到了之前定义的原始方法。添加的新语句扩充了现有语句。但是对于方法定义,我仍然想要与类定义相同的行为,但是当我打开defmy_method时似乎,def中的现有语句和end被覆盖了,我需要重写一遍。那么有什么方法可以使方法定义的行为与定义相同,类似于super,但不一定是子类? 最佳答案 我想您正在寻找alias_method:classAalias_method:old_func,:funcdeffuncold_func#similartoca

  5. C51单片机——实现用独立按键控制LED亮灭(调用函数篇) - 2

    说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时

  6. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  7. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  8. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  9. Hive SQL 五大经典面试题 - 2

    目录第1题连续问题分析:解法:第2题分组问题分析:解法:第3题间隔连续问题分析:解法:第4题打折日期交叉问题分析:解法:第5题同时在线问题分析:解法:第1题连续问题如下数据为蚂蚁森林中用户领取的减少碳排放量iddtlowcarbon10012021-12-1212310022021-12-124510012021-12-134310012021-12-134510012021-12-132310022021-12-144510012021-12-1423010022021-12-154510012021-12-1523.......找出连续3天及以上减少碳排放量在100以上的用户分析:遇到这类

  10. sql - 查询忽略时间戳日期的时间范围 - 2

    我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时

随机推荐