Локально заключить блок кода в SQL - PullRequest
0 голосов
/ 14 июля 2009

В Java вы можете сделать следующее для локального изменения области в методе:

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

Я даже не знаю, как называется эта техника, мне нужно было использовать ее только один или два раза. В моей текущей ситуации это может действительно пригодиться в этом проекте SQL.

Возможно ли это даже в SQL?


Я использую MS SQL Server ... Чтобы дать больше контекста ситуации:

У нас есть несколько SQL-скриптов, которые хранятся в виде файлов, которые помогают выполнять различные операции с базой данных. Эти скрипты довольно большие и предназначены для запуска независимо. Иногда нам нужно запустить несколько этих сценариев вместе и доставить их в одном файле.

Поскольку большинство этих сценариев имеют общие переменные, мы сталкиваемся с конфликтом при объединении этих сценариев вместе. Конечно, все объявления переменных легко переместить в начало файла, но цель состоит в том, чтобы автоматизировать этот процесс.

Ответы [ 4 ]

0 голосов
/ 14 июля 2009

SQL является декларативным языком (то есть фокусируется на «что», а не «как»). Следовательно, его определение (ansi) не содержит процедурных процедур и блоков.

Большинство реализаций поставщиков заполняют этот пробел, встраивая свой собственный процедурный язык - TSQL в случае Microsoft, PL / SQL в случае Oracle и т. Д. (Не уверен в Mysql, SQLlite и т. Д.) - и даже они не выполняют точного соответствия функций. с Java (без анонимных кодовых блоков).

Каждая операция SQL работает с набором и возвращает набор.

Таким образом, «mytable» - это набор, «select from mytable» - это набор, а «select from (select from mytable)» - это набор.

Так что это своего рода невозможно углубиться в более низкий уровень детализации, возможно, «столбцы» или псевдостолбцы являются «переменными»

Oracle определяет операцию «выбрать из двойного», чтобы гарантировать «цикл», равный 1 (т. Е. Оператор выбора, который возвращает ровно 1 строку)

0 голосов
/ 14 июля 2009

Попытка скомпилировать приведенный вами пример кода 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. префиксами.

0 голосов
/ 14 июля 2009

В SQL Server вы не можете охватывать в блоках. Пока DECLARE до SET, все в порядке. ЗАЯВЛЕНИЯ не обязательно должны быть в начале пакета или код

BEGIN
    DECLARE @a int
END
BEGIN
    SET @a = 1
END

IIRC, то же самое относится и к Sybase.

0 голосов
/ 14 июля 2009

В MySQL объявления переменных должны приходить в начале подпрограммы / хранимой процедуры, как переменные функции C должны быть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...