Oracle 变量 之 define variable declare 用法及区别

1 扯蛋

Oracle 提供了几种不同的定义变量的方式: def(ine) ,var(iable), declare 分别适用于不同的环境.

define
sqlplus 环境(command窗口) 中用于定义变量, 适用于人机交互处理,或者sql脚本。
variable
plsql 匿名块中使用。非匿名块中不能使用。
declare
plsql 块中使用,适用于匿名块或者非匿名块。

2 define和accept

define 可以定义一个变量,在调用该变量时使用符号 & . 人机交互给变量赋值时使用acc(ecpt)命令。

  • 作为查询值示例

    define abc=1;
    select * from dual where rownum=&abc;

    执行结果如下:

    SQL>   define abc=1;
    SQL> select * from dual where rownum=&abc;
    old 1: select * from dual where rownum=&abc
    new 1: select * from dual where rownum=1 D
    -
    X
  • 作为变量传入匿名块示例
    • 与declare配合使用

      set serveroutput on
      define abc=1;
      declare abc varchar(2);
      begin
      select &abc into abc from dual;
      dbms_output.put_line(abc);
      end;
      /

      执行结果如下:

       SQL>  set serveroutput on
      SQL> define abc=1;
      SQL> declare abc varchar(2);
      2 begin
      3 select &abc into abc from dual;
      4 dbms_output.put_line(abc);
      5 end;
      6 /
      old 3: select &abc into abc from dual;
      new 3: select 1 into abc from dual;
      1
    • 与variable 配合使用

            set serveroutput on
      define abc=1;
      variable abc varchar2(10);
      begin
      :abc := &abc;
      dbms_output.put_line(:abc);
      end;
      /

      执行结果如下:

            SQL>  set serveroutput on
      SQL> define abc=1;
      SQL> variable abc varchar2(10);
      SQL> begin
      2 :abc := &abc;
      3 dbms_output.put_line(:abc);
      4 end;
      5 /
      old 2: :abc := &abc;
      new 2: :abc := 1;
      1 PL/SQL procedure successfully completed.
  • 人机交互赋值示例 通过人机交互给变量赋值,需要使用acc(ept)

        SQL> acc i number prompt "Please input a number:"
    Please input a number:4
    SQL> select &i from dual;
    old 1: select &i from dual
    new 1: select 4 from dual 4
    ----------
    4

3 variable

 

3.1 variable 特点

通过variable 定义变量,变量作用域为当前sqlplus环境。需要通过 : 来标记为变量。比如:

variable a varchar2(10);    -- 此时定义了变量,:a 代表了变量,而 a 并不是变量,只是字母 a
var current_scn number;
begin
select DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER into :current_scn from dual;
dbms_output.put_line(' '||:current_scn);
end;
/

执行结果如下:

  SQL> var current_scn number;
SQL> begin
2 select DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER into :current_scn from dual;
3 dbms_output.put_line(' '||:current_scn);
4 end;
5 /
13934393999029 PL/SQL procedure successfully completed.

下面的示例表明variable定义的变量在当前sqlplus环境中都可用。

  SQL> var a number;
SQL> begin
2 select DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER into :a from dual;
3 end;
4 / PL/SQL procedure successfully completed. SQL> select :a from dual; :A
----------
1.3947E+13

3.2 variable 与define配合使用

col scn for 9999999999999999999999
var a number; -- 通过variable 定义变量
begin
-- 在匿名块中给 :a 变量赋值
select DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER into :a from dual;
end;
/
define current_scn = :a
select &current_scn as scn from dual;
  • 执行结果

      SQL> col scn for 9999999999999999999999
    SQL> var a number;
    SQL> begin
    2 select DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER into :a from dual;
    3 end;
    4 / PL/SQL procedure successfully completed. SQL> define current_scn = :a
    SQL> select &current_scn as scn from dual;
    old 1: select &current_scn as scn from dual
    new 1: select :a as scn from dual SCN
    -----------------------
    13946807321486

4 declare

declare 定义变量后,变量标识符在整个块结构内部都代表变量,在结构块外部不可用, 也就是说 declare的作用域只是结构体内部。这点与variable定义变量不同。变量的调用方式也不一样, declare定义的变量, 不需要添加任何额外的标记,而variable 定义的变量需要和冒号配合使用。

  • 示例

    set serveroutput on
    declare current_scn number;
    begin
    -- 注意: into 后面的变量就是declare定义的变量
    select DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER into current_scn from dual;
    dbms_output.put_line(current_scn);
    end;
    /
  • 执行结果

    SQL> set serveroutput on
    SQL> declare current_scn number;
    2 begin
    3 -- 注意: into 后面的变量就是declare定义的变量
    4 select DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER into current_scn from dual;
    5 dbms_output.put_line(current_scn);
    6 end;
    7 /
    13946807319270 PL/SQL procedure successfully completed.

Author: halberd.lee

Created: 2019-07-04 Thu 15:03

Validate

Oracle 变量 之 define variable declare 用法及区别的更多相关文章

  1. ORACLE中声明变量:define variable declare

    在sqlplus 环境中,声明变量的关键字:define variable declare 一.define关键字(host变量) host变量的作用是一个替换作用,是主机环境与oracle进行交互的 ...

  2. 分组函数group by和Oracle中分析函数partition by的用法以及区别

    1.分组函数group by和Oracle中分析函数partition by的用法以及区别 2.开窗函数.

  3. shell变量/环境变量和set/env/export用法_转

    转自:shell环境变量以及set,env,export的区别 一.shell环境变量的分类以及set env export的区别: set:显示(设置)shell变量,包括的私有变量以及用户变量.不 ...

  4. 变量隐藏Accidental Variable Shadowing

    6.5 - Variable shadowing (name hiding) | Learn C++ https://www.learncpp.com/cpp-tutorial/variable-sh ...

  5. typedef和#define的用法与区别

    typedef和#define的用法与区别 typedef和#define的用法与区别 一.typedef的用法 在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程 ...

  6. #ifndef#define#endif的用法

    在网上看到了感觉作者总结得很好,作者辛苦了! #ifndef#define#endif的用法 文件中的#ifndef 头件的中的#ifndef,这是一个很关键的东西.比如你有两个C文件,这两个C文件都 ...

  7. Oracle数据库中序列(SEQUENCE)的用法详解

    Oracle数据库中序列(SEQUENCE)的用法详解   在Oracle数据库中,序列的用途是生成表的主键值,可以在插入语句中引用,也可以通过查询检查当前值,或使序列增至下一个值.本文我们主要介绍了 ...

  8. #ifndef#define#endif的用法(整理)

    [转] #ifndef#define#endif的用法(整理)    原作者:icwk  文件中的#ifndef 头件的中的#ifndef,这是一个很关键的东西.比如你有两个C文件,这两个C文件都in ...

  9. 【转】typedef和#define的用法与区别

    typedef和#define的用法与区别 一.typedef的用法 在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像: ...

随机推荐

  1. 20、linux启动流程和救援模式

    1.Linux启动流程 2.Linux运行级别 1.什么是运行级别,运行级别就是操作系统当前正在运行的功能级别 System V init运行级别 systemd目标名称 作用 0 runlevel0 ...

  2. deep_learning_Function_ lambda函数详解

    这里总结了关于 Python 中的 lambda 函数的“一个语法,三个特性,四个用法”. 一个语法: 在 Python 中,lambda 函数的语法是唯一的.其形式如下: lambda argume ...

  3. python面向对象、类、socket网络编程

    类和对象 python3统一了类与类型的概念:类==类型:从一组对象中提取相似的部分就是类:特征与技能的结合体就叫做对象: 类的功能: 初始实例化: 属性引用: 1.数据属性: 2.函数属性: 对于一 ...

  4. Hive动态分区和分桶(八)

    Hive动态分区和分桶 1.Hive动态分区 1.hive的动态分区介绍 ​ hive的静态分区需要用户在插入数据的时候必须手动指定hive的分区字段值,但是这样的话会导致用户的操作复杂度提高,而且在 ...

  5. 8.Dropout

    import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data #载入数据集 mnist = in ...

  6. SQL Server中四类事务并发问题的实例再现(转)

    本篇文章将用实例再现数据库访问中四类并发问题,希望能让初学者能对事务的并行性有进一步的理解. 首先,让我们先来了解一下并行问题以及事务隔离级别这两个概念.在数据库中,假设如果没有锁定且多个用户同时访问 ...

  7. JQuery实现简单的服务器轮询效果

    很多论坛都有进入后,弹出提示,说有多少封邮件没有看,或者是一个oa系统,进入后,提示有多少个任务没有做.每隔一段时间会提示一次,但是如何实现呢.其实,利用jquery的话,会比较简单,核心元素就是js ...

  8. 运行别人的Vue项目

    步骤一:先 安装 cnpm cmd命令下 输入  npm install -g cnpm --registry=http://registry.npm.taobao.org (由于npm有些资源被屏蔽 ...

  9. es6 模块编译 *** is not function

    今天学习vuejs,里面用到了es6的写法,遇到了一个很怪的问题,不知道有人遇到么. 安装的模块引用:import Vue from 'vue';(注意,Vue处没有{},如果加上这个就报错Uncau ...

  10. redis配置主从备份以及主备切换方案配置(转)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/gsying1474/article/de ...