zoukankan      html  css  js  c++  java
  • Oracle数据库中的变量

    Oracle数据库中的变量

    来源:https://blog.csdn.net/wahaa591/article/details/46772769

    1、define(即host变量)

    define variable_name = value

    显示指定的DEFINE变量值和类型

    //使用define def_name命令显示指定DEFINE变量的值和类型(DEFINE变量类型都为char)
    SQL> define num;
    DEFINE num              = "1" (CHAR)
    

    2、Variable(即绑定变量)

    绑定变量主要是在sql中使用,达到sql解析一次,执行多次,从而提高效率的目的。绑定变量和host变量一样,也有定义的,也有临时性的。(临时性的在动态sql或动态plsql中通过占位符和using使用),其他的如sql会自动使用绑定变量的情况,此处不专门讨论。定义的绑定变量也是在当前session中有效。 绑定变量以下特点:

    绑定变量在sql和plsql中直接引用必须加前缀 :。如要引用绑定变量a,则是 :a;

    在真正运行的PLSQL程序中,比如自动运行,有自己的一套机制;

    初始化和应用绑定变量,初始化定义的绑定变量,可以使用过程和函数,其中过程可以内部给绑定变量赋值、也可以参数是绑定变量,参数模式为out返回。使用函数和过程差不多,还可以使用call
    函数来赋值。

    sqlplus中可以使用大于等于3个字符表示一个命令,这里我们用var,var命令是声明一个绑定变量,只能给予名称和类型,定义的时候不能赋值,赋值可以在plsql中或者采用函数赋值(而host变量定义的时候必须赋值)。
    (1).语法:

    var var_name type
    (2).声明绑定变量

    //使用var声明两number类型的变量num1、num2
    SQL> var num1 number;
    SQL> var num2 number;

    (3).显示指定绑定变量

    //var num1命令显示指定绑定变量名称、数据类型
    SQL> var num1
    variable num1
    datatype NUMBER

    SQL>

    还有一类SQLPLUS中的变量叫substitution variables,直接翻译过来是替代变量。一个使用替代变量的例子(来源:https://docs.oracle.com/cd/F49540_01/DOC/server.815/a66736/ch33.htm):

    SQL> CLEAR BUFFER
    SQL> INPUT
     1  SELECT   &GROUP_COL,
     2           MAX(&NUMBER_COL) MAXIMUM
     3  FROM     &TABLE
     4  GROUP BY &GROUP_COL
     5
    SQL> SAVE STATS
    Created file STATS
    

    Now run the command file STATS and respond as shown below to the prompts for values:

    SQL>  @STATS
    Enter value for group_col: JOB
    old   1: SELECT   &GROUP_COL,
    new   1: SELECT   JOB,
    Enter value for number_col: SAL
    old   2:          MAX(&NUMBER_COL) MAXIMUM
    new   2:          MAX(SAL) MAXIMUM
    Enter value for table: EMP
    old   3: FROM     &TABLE
    new   3: FROM     EMP
    Enter value for group_col: JOB
    old   4: GROUP BY &GROUP_COL
    new   4: GROUP BY JOB
    

    这类我之前在笔记中也写过:https://www.cnblogs.com/jiading/p/11578484.html。但是这类还有更多的文章可做,这也是我看了Oracle的官方文档才知道的。

    如果上面的例子中,我们不仅要求最大值,还要求最小值、平均值,那么SQL脚本写出来应该是这样的:

    select &Group_col,
    max(&number_col1)maximun,min(&number_col1)minimum,avg(&number_col1)average
    from &table
    group by &group_col
    

    这里我试的时候给number_col改了个名,原因后面见。

    那么实际输入的时候是:

    Enter value for group_col: JOB
    old   1: select &Group_col,
    new   1: select JOB,
    Enter value for number_col1: SAL
    Enter value for number_col1: SAL
    Enter value for number_col1: SAL
    old   2: max(&number_col1)maximun,min(&number_col1)minimum,avg(&number_col1)average
    new   2: max(SAL)maximun,min(SAL)minimum,avg(SAL)average
    Enter value for table: EMP
    old   3: from &table
    new   3: from EMP
    Enter value for group_col: JOB
    old   4: group by &group_col
    new   4: group by JOB
    

    可以看到,number_col1输入了三次。

    为了简化操作,SQLPLUS提供了另外一种方式,如果将声明中的&变成&&,它就变成了一个变量(鉴于官方文档也没有给它起名字,我这里也就不起了吧):

    select &Group_col,
    max(&&number_col1)maximun,min(&&number_col1)minimum,avg(&&number_col1)average
    from &table
    group by &group_col
    

    之后输入变成了这样:

    Enter value for group_col: JOB
    old   1: select &Group_col,
    new   1: select JOB,
    Enter value for number_col1: SAL
    old   2: max(&&number_col1)maximun,min(&&number_col1)minimum,avg(&&number_col1)average
    new   2: max(SAL)maximun,min(SAL)minimum,avg(SAL)average
    Enter value for table: EMP
    old   3: from &table
    new   3: from EMP
    Enter value for group_col: JOB
    old   4: group by &group_col
    new   4: group by JOB
    
    

    可以看到,number_col1只需要输入一次了。

    这里声明的变量在当前回话一直有效,再次运行STATS就会发现,&&number_col1不需要输入,而是自动填充了。这就是为什么我上面举例子为什么要改名的原因。

    消除这一个变量声明的方法也很简单,退出现在的SQLPLUS进程再进入就没有了。

  • 相关阅读:
    poj2823单调队列认知
    有关二叉树的三序遍历的题目
    hdu4757 可持续字典树
    ZOJ2532判断边是否是割集中的边
    poj2455 k条路最小化最长边
    乘法逆元模板
    poj1699 KMP+壮压DP
    Innodb存储引擎——非聚集索引
    java集合框架笔记
    jvm垃圾回收
  • 原文地址:https://www.cnblogs.com/jiading/p/11758922.html
Copyright © 2011-2022 走看看