在SQL中本地包含代码块

时间:2009-07-14 14:35:44

标签: sql sql-server

在Java中,您可以执行以下操作以在方法中本地范围变量:

public void blah() {
    {
        int a = 1;
        int b = 2;
    }
    {
        int a = 3;
        int b = 4;
    }
}

我甚至不知道这种技术的名称是什么,我只需要使用一次或两次。在我目前的情况下,这可能会对这个SQL项目派上用场。

这在SQL中是否可行?


我正在使用MS SQL Server ... 为了给出更多情况:

我们将几个sql脚本存储为文件,以帮助对数据库执行各种操作。这些脚本相当大,旨在独立运行。有时,我们需要将这些脚本中的几个一起运行并在单个文件中传递。

由于这些脚本中的大多数都有公共变量,因此在将这些脚本连接在一起时会遇到冲突。当然,很容易将所有变量声明移动到文件的开头,但目标是让这个过程自动化。

4 个答案:

答案 0 :(得分:0)

在MySQL中,变量声明必须出现在子程序/存储过程的开头,就像C函数的变量一样。

答案 1 :(得分:0)

尝试编译您提供的Java代码示例(包含在class helo中)##标题##产生:

$ javac helo.java 
helo.java:7: a is already defined in blah()
        int a = 3;
            ^
helo.java:8: b is already defined in blah()
        int b = 4;
            ^
2 errors

所以,不,你不能在Java中这样做(C,是的; C ++,是的; Java,不)。

SQL本身没有词法作用域,虽然嵌入在关系数据库中的一些存储过程方言肯定可能(但很难帮助不知道确切的方言)。在SQL中,您使用tablename.前缀限定其他同名字段。

答案 2 :(得分:0)

在SQL Server中,不能以块为单位。只要DECLARE在SET之前就可以了。 DECLARE不必是批处理或代码的开头

BEGIN
    DECLARE @a int
END
BEGIN
    SET @a = 1
END
IIRC,这同样适用于Sybase。

答案 3 :(得分:0)

SQL是一种声明性语言(即关注'什么是'而不是'怎么')。因此,它的定义(ansi)不包含程序和块。

大多数供应商实现通过嵌入他们自己的过程语言填充这个空白 - 在Microsoft的情况下为TSQL,在Oracle的情况下为PL / SQL等(不确定Mysql和SQLlite等) - 甚至他们也没有进行确切的功能匹配使用Java(无匿名代码块)。

每个SQL操作都在一个集合上运行,并返回一个集合。

因此“mytable”是一个集合,“select from mytable”是一个集合,而“select from(select from mytable)”是一个集合。

所以它不可能深入到较低的粒度级别,也许“列”或伪列是'变量'

Oracle定义了一个“从双重选择”操作来保证'循环'为1(即一个只返回1行的select语句)