PL/SQL0.1——块嵌套与变量范围

简介: 在开始plsql编程之前,我们先对plsql变量的作用范围看一下: 应该是和一般的编程语言是一样的,可能我们对这个图看上去不能理解,我们通过下面一条sql语句来进行全面理解: SQL> BEGIN   2       3    DECLARE  ...

在开始plsql编程之前,我们先对plsql变量的作用范围看一下:


应该是和一般的编程语言是一样的,可能我们对这个图看上去不能理解,我们通过下面一条sql语句来进行全面理解:

SQL> BEGIN
  2    <<outer>>
  3    DECLARE
  4        v_sal     NUMBER(7, 2) := 60000;
  5        v_comm    NUMBER(7, 2) := v_sal * 0.20;
  6        v_message VARCHAR2(255) := ' eligible for commission';
  7    BEGIN
  8      <<inner>>
  9      DECLARE
 10        v_sal        NUMBER(7, 2) := 50000;
 11        v_comm       NUMBER(7, 2) := 0;
 12        v_total_comp NUMBER(7, 2) := v_sal + v_comm;
 13      BEGIN
 14        v_message    := ' CLERK not' || v_message;
 15        outer.v_comm := v_sal * 0.30;
 16    
   DBMS_OUTPUT.PUT_LINE('m is '||v_message||' v_comm '||v_comm||' OUTER '||outer.v_comm);
 17      END;--<<inner>>
 18      v_message := 'SALESMAN' || v_message;
 19      DBMS_OUTPUT.PUT_LINE('v_total_comp is '||'v_total_comp/null'||' v_comm is  '||v_comm||' v_mess is '||v_message);
 20    END;--<<outer>>
 21   END;
 22  /
 
m is  CLERK not eligible for commission v_comm 0 OUTER 15000
v_total_comp is v_total_comp/null v_comm is  15000 v_mess is SALESMAN CLERK not eligible for commission
 
PL/SQL procedure successfully completed
 
SQL> 

我们通过看这两条红色的输出结果集,就能理解变量的控制范围了:

第16行:v_message结果为:CLERK not eligible for commission 内部块的CLERK not  然后加外部的eligible for commission 。外部的v_comm引用了内部的v_sal=5000*0.3

第19行:v_total_comp是不能得出结果的,所以输出了字符串,因为是在outer的语句。即使我写成:  DBMS_OUTPUT.PUT_LINE('v_total_comp is '||inner.v_total_comp||' v_comm is  '。。。。

也是报错:ORA-06550: line 20, column 52:
                  PLS-00219: label 'INNER' reference is out of scope

继续看v_comm 因为plsql是顺序向下执行的,inner部分结束时outer.v_comm=15000,现在还是这个值。为什么v_message的值变成了SALESMAN CLERK not eligible for commission也就是说加上了inner 部分?刚开始可能会晕,但是你只要注意到,在inner部分根本就没有再次声明这个变量,也就是说从头到尾这个变量就声明了一次,所以他会一直使用。


2、plsql中null值的与或非







 

相关文章
|
6月前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL隐式游标:数据的“自动导游”与“轻松之旅”
【4月更文挑战第19天】Oracle PL/SQL中的隐式游标是自动管理的数据导航工具,简化编程工作,尤其适用于简单查询和DML操作。它自动处理数据访问,提供高效、简洁的代码,但不适用于复杂场景。显式游标在需要精细控制时更有优势。了解并适时使用隐式游标,能提升数据处理效率,让开发更加轻松。
|
10天前
|
SQL 数据采集 监控
局域网监控电脑屏幕软件:PL/SQL 实现的数据库关联监控
在当今网络环境中,基于PL/SQL的局域网监控系统对于企业和机构的信息安全至关重要。该系统包括屏幕数据采集、数据处理与分析、数据库关联与存储三个核心模块,能够提供全面而准确的监控信息,帮助管理者有效监督局域网内的电脑使用情况。
12 2
|
3月前
|
SQL Oracle 关系型数据库
SQL与PL/SQL:数据库编程语言的比较
【8月更文挑战第31天】
62 0
|
4月前
|
SQL 运维 分布式计算
DataWorks产品使用合集之ODPPS中如何使用SQL查询从表中获取值并将其赋值给临时变量以供后续使用
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
5月前
|
SQL 存储 分布式计算
MaxCompute产品使用问题之odps sql如何定义变量
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
170 0
|
5月前
|
SQL 数据库 Perl
PL/SQL中执行按钮变为灰色后如何恢复【已解决】
PL/SQL中执行按钮变为灰色后如何恢复【已解决】
471 0
|
5月前
|
SQL 缓存 Oracle
SQL调优之绑定变量用法简介
SQL调优之绑定变量用法简介
|
6月前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL游标属性:数据的“导航仪”与“仪表盘”
【4月更文挑战第19天】Oracle PL/SQL游标属性如同车辆的导航仪和仪表盘,提供丰富信息和控制。 `%FOUND`和`%NOTFOUND`指示数据读取状态,`%ROWCOUNT`记录处理行数,`%ISOPEN`显示游标状态。还有`%BULK_ROWCOUNT`和`%BULK_EXCEPTIONS`增强处理灵活性。通过实例展示了如何在数据处理中利用这些属性监控和控制流程,提高效率和准确性。掌握游标属性是提升数据处理能力的关键。
|
6月前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL游标自定义异常:数据探险家的“专属警示灯”
【4月更文挑战第19天】Oracle PL/SQL中的游标自定义异常是处理数据异常的有效工具,犹如数据探险家的警示灯。通过声明异常名(如`LOW_SALARY_EXCEPTION`)并在满足特定条件(如薪资低于阈值)时使用`RAISE`抛出异常,能灵活应对复杂业务规则。示例代码展示了如何在游标操作中定义和捕获自定义异常,提升代码可读性和维护性,确保在面对数据挑战时能及时响应。掌握自定义异常,让数据管理更从容。
|
6月前
|
SQL Oracle 安全
Oracle的PL/SQL游标异常处理:从“惊涛骇浪”到“风平浪静”
【4月更文挑战第19天】Oracle PL/SQL游标异常处理确保了在数据操作中遇到的问题得以优雅解决,如`NO_DATA_FOUND`或`TOO_MANY_ROWS`等异常。通过使用`EXCEPTION`块捕获并处理这些异常,开发者可以防止程序因游标问题而崩溃。例如,当查询无结果时,可以显示定制的错误信息而不是让程序终止。掌握游标异常处理是成为娴熟的Oracle数据管理员的关键,能保证在复杂的数据环境中稳健运行。