Как записать результат запроса в переменную sql
Перейти к содержимому

Как записать результат запроса в переменную sql

  • автор:

Как записать результат запроса в переменную sql

Через переменные мы можем передавать данные в запросы. И также мы можем получать данные, которые являются результатом запросов, в переменные. Например, при выборке из таблиц с помощью команды SELECT мы можем извлекать данные в переменную с помощью следующего синтаксиса:

SELECT @переменная_1 = спецификация_столбца_1, @переменная_2 = спецификация_столбца_2, . @переменная_N = спецификация_столбца_N

Кроме того, в выражении SET значение, присваиваемое переменной, также может быть результатом команды SELECT.

Например, пусть у нас будут следующие таблицы:

CREATE TABLE Products ( Id INT IDENTITY PRIMARY KEY, ProductName NVARCHAR(30) NOT NULL, Manufacturer NVARCHAR(20) NOT NULL, ProductCount INT DEFAULT 0, Price MONEY NOT NULL ); CREATE TABLE Customers ( Id INT IDENTITY PRIMARY KEY, FirstName NVARCHAR(30) NOT NULL ); CREATE TABLE Orders ( Id INT IDENTITY PRIMARY KEY, ProductId INT NOT NULL REFERENCES Products(Id) ON DELETE CASCADE, CustomerId INT NOT NULL REFERENCES Customers(Id) ON DELETE CASCADE, CreatedAt DATE NOT NULL, ProductCount INT DEFAULT 1, Price MONEY NOT NULL );

Используем переменные при извлечении данных:

DECLARE @maxPrice MONEY, @minPrice MONEY, @dif MONEY, @count INT SET @count = (SELECT SUM(ProductCount) FROM Orders); SELECT @minPrice=MIN(Price), @maxPrice = MAX(Price) FROM Products SET @dif = @maxPrice - @minPrice; PRINT 'Всего продано: ' + STR(@count, 5) + ' товарa(ов)'; PRINT 'Разница между максимальной и минимальной ценой: ' + STR(@dif)

В данном случае переменная @count будет содержать сумму всех значений из столбца ProductCount таблицы Orders, то есть общее количество проданных товаров.

Переменные @min и @max хранят соответственно минимальное и максимальное значения столбца Price из таблицы Products, а переменная @dif — разницу между этими значениями. И подобно простым значениям, переменные также могут участвовать в операциях.

Переменные в запросах в T-SQL

DECLARE @sum MONEY, @id INT, @prodid INT, @name NVARCHAR(20); SET @id=2; SELECT @sum = SUM(Orders.Price*Orders.ProductCount), @name=Products.ProductName, @prodid = Products.Id FROM Orders INNER JOIN Products ON ProductId = Products.Id GROUP BY Products.ProductName, Products.Id HAVING Products.Id=@id PRINT 'Товар ' + @name + ' продан на сумму ' + STR(@sum)

Здесь извлекаемые данные из двух таблиц Products и Orders группируются по столбцам Id и ProductName из таблицы Products. Затем данные фильтруются по столбцу Id из Products. А извлеченные данные попадают в переменные @sum, @name, @prodid.

Присвоить переменной результат запроса sql

Как переменной присвоить результат select-а
есть вот такой select. select add_months(trunc(sysdate,’MM’),-1) + level -1 x from dual connect.

Инициализация переменной через результат запроса
Здравствуйте. Можно ли в PL/SQL задать значение переменной через запрос? Например как-то так.

Как строке присвоить результат запроса
Есть запрос QueryClientsALLMan который возвращает одно значение поля Name из таблицы В VBA.

SQL. узнать результат выполнения запроса
Дана реляционная модель базы данных Таблица Customer содержит информацию о клиентах.

761 / 662 / 195
Регистрация: 24.11.2015
Сообщений: 2,158

Во-первых, запрос должен возвращать только id
Во-вторых, запрос должен возвращать ровно одну строку.
В-третьих, нужно читать синтаксис языка, а не изобретать самопальные конструкции
В-четвертых, нужно определить переменную, желательно, типа поля id
Правильный синтаксис при соблюдении перечисленных выше условий такой:

1 2 3 4
SELECT a.id INTO var_id FROM vdealpersonloan_all a , vcontragent c WHERE dealno LIKE '%'||:dealno||'%' AND c.id = a.contragentid

Регистрация: 20.02.2015
Сообщений: 170
AGK
ошибка ora-00905 missing keyword
761 / 662 / 195
Регистрация: 24.11.2015
Сообщений: 2,158

А если запрос возвращает несколько строк, то нужно действовать как-то иначе, например, присваивать переменной значения в цикле. Или передавать значения в коллекцию. Или писать их в другую таблицу. Все зависит от поставленной задачи. Ниже приводится вывод значений в переменную в цикле через неявный курсор.

1 2 3 4 5 6 7 8 9 10 11 12 13
DECLARE var_id NUMBER; v_deal varchar2(100) := :dealno; BEGIN FOR vv IN (SELECT REPLACE(a.dealno,'_KI','') dealno , a.id FROM vdealpersonloan_all a , vcontragent c WHERE dealno LIKE '%'||v_deal||'%' AND c.id = a.contragentid) loop var_id := vv.id; -- любые нужные вам операторы END loop; END;

Добавлено через 4 минуты

ЦитатаСообщение от sergey23031978 Посмотреть сообщение

ошибка ora-00905 missing keyword

Насколько я понимаю, вместо :dealno нужно подставить значение. Поскольку это варчар, что будет что-то типа ‘ABCDE’ (строка в апострофах)

Регистрация: 20.02.2015
Сообщений: 170

AGK
после етого скрипта нужно разместить другой скрипт которий возьмет в работу переменную var_id
подскажите как ето сделать

761 / 662 / 195
Регистрация: 24.11.2015
Сообщений: 2,158

Обычно все пишут в одном блоке. Или делают процедуру, которая выполняет все действия. Очень неопределенный вопрос.
Если есть два блкока, из них всегда можно сделать один блок

1 2 3 4 5 6 7
BEGIN . END; BEGIN . END;

превращается в

1 2 3 4
BEGIN . . END;

Добавлено через 2 минуты
Или, например, из первого блока сделать функцию, которая возвращает значение переменной, а из второго блока — процедуру, которая принимает и обрабатывает это значение

Регистрация: 20.02.2015
Сообщений: 170
етот код находит var_id

1 2 3 4 5 6 7 8 9 10 11
DECLARE var_id NUMBER; BEGIN FOR vv IN (SELECT REPLACE(a.dealno,'_KI','') dealno , a.id FROM vdealpersonloan_all a , vcontragent c WHERE dealno LIKE '%'||:dealno||'%' AND c.id = a.contragentid) loop var_id := vv.id; END loop; END;

затем значение var_id нужно подставить в

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
SELECT rownum , a.* FROM (SELECT SUM(v.summa/100) SUM , d.valuedate valuedate FROM vdealpersonloan_all a , vcontragent c , varc_document v , dealdoctransaction d WHERE a.id=var_id AND c.id = a.contragentid AND (v.accountano LIKE '2620%' OR v.accountano LIKE '2909%' OR v.accountano LIKE '3720%' OR v.accountano LIKE '1207%') AND a.corraccountno = v.accountbno AND a.currencyid = v.currencyid AND d.documentid = v.id AND d.valuedate BETWEEN '19.05.2016' AND '01.08.2017' AND v.platpurpose NOT LIKE 'Сторно%' GROUP BY d.valuedate UNION ALL SELECT SUM(v.summa/100) SUM , v.arcdate valuedate FROM vdealpersonloan_all a , vcontragent c , varc_document v WHERE a.id=var_id AND c.id = a.contragentid AND (v.accountano LIKE '2620%' OR v.accountano LIKE '2909%' OR v.accountano LIKE '3720%' OR v.accountano LIKE '1207%') AND a.corraccountno = v.accountbno AND a.currencyid = v.currencyid AND v.id NOT IN (SELECT documentid FROM dealdoctransaction WHERE DEALID = var_id) AND v.arcdate BETWEEN '19.05.2016' AND '01.08.2017' AND v.platpurpose NOT LIKE 'Сторно%' GROUP BY v.arcdate ORDER BY valuedate) a )

как ето сделать?
a.id и DEALID должни подставлятся(константа которая определяется в начале), чтоби не подвисала база

761 / 662 / 195
Регистрация: 24.11.2015
Сообщений: 2,158

ЦитатаСообщение от sergey23031978 Посмотреть сообщение

как ето сделать?

Селект, обычно, не может вызываться просто так в анонимном блоке.
Его надо либо вызывать интерактивно (в каком-то средстве разработки или просмотра БД), и тогда Вы видите результат на экране, либо его результат надо вставлять в какую-то другую таблицу. Если объем информации выводимых записей мал, его можно вывести в спул (на экран компьютера в Вашей сесии), но на это лучше не ориентироваться.
Ваш второй селект написан с ошибками.
1. Нельзя использовать служебные слова (например, SUM) в качестве алиасов. При попытке запустить селект будет ошибка.
2. Очень дурной тон использовать неявное преобразование типов. У Вас дата задается в виде строки, а ее надо задать в виде даты, иначе правильность селекта будет зависеть от NLS-настроек компьютера. Например, у меня Ваш селект просто не пройдет.

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

Регистрация: 20.02.2015
Сообщений: 170

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

761 / 662 / 195
Регистрация: 24.11.2015
Сообщений: 2,158

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
WITH xx AS (SELECT REPLACE(a.dealno,'_KI','') dealno , a.id FROM vdealpersonloan_all a , vcontragent c WHERE dealno LIKE '%'||'значение переменной :dealno'||'%' AND c.id = a.contragentid) SELECT rownum , a.* FROM ( SELECT SUM(v.summa/100) sss, d.valuedate valuedate FROM vdealpersonloan_all a , vcontragent c , varc_document v , dealdoctransaction d, xx WHERE a.id=xx.id AND c.id = a.contragentid AND (v.accountano LIKE '2620%' OR v.accountano LIKE '2909%' OR v.accountano LIKE '3720%' OR v.accountano LIKE '1207%') AND a.corraccountno = v.accountbno AND a.currencyid = v.currencyid AND d.documentid = v.id AND d.valuedate BETWEEN to_date('19.05.2016','dd.mm.yyyy') AND to_date('01.08.2017','dd.mm.yyyy') AND v.platpurpose NOT LIKE 'Сторно%' GROUP BY d.valuedate UNION ALL SELECT SUM(v.summa/100) sss , v.arcdate valuedate FROM vdealpersonloan_all a , vcontragent c , varc_document v, xx WHERE a.id=xx.id AND c.id = a.contragentid AND (v.accountano LIKE '2620%' OR v.accountano LIKE '2909%' OR v.accountano LIKE '3720%' OR v.accountano LIKE '1207%') AND a.corraccountno = v.accountbno AND a.currencyid = v.currencyid AND v.id NOT IN (SELECT documentid FROM dealdoctransaction d WHERE d.DEALID = xx.id) AND v.arcdate BETWEEN to_date('19.05.2016','dd.mm.yyyy') AND to_date('01.08.2017','dd.mm.yyyy') AND v.platpurpose NOT LIKE 'Сторно%' GROUP BY v.arcdate ORDER BY valuedate) a

А вообще неплохо бы пойти в школу и выучить элементарные вещи, прежде чем задавать вопросы для первоклассников

как передать результат запроса в переменную

(1)Выбираем в запросе курс по параметру курс. Масло масленное получается:)
Может быть параметр это Валюта?

4. tusv 208 06.06.19 17:16 Сейчас в теме

Выборка = Запрос.Выполнить().Выбрать(); Если ВЫборка.Следующий() Тогда Возврат Выборка.Курс; КонецЕсли; Возврат 0;

5. user1155564 06.06.19 17:21 Сейчас в теме
(4) как это потом передать на клиент?
6. tusv 208 06.06.19 17:32 Сейчас в теме

&НаСервере Функция Курс(ВыбКурс ) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 | ВалютаСрезПоследних.Курс |ИЗ | РегистрСведений.Валюта.СрезПоследних КАК ВалютаСрезПоследних |ГДЕ | ВалютаСрезПоследних.Курс = &Курс"; Запрос.УстановитьПараметр("Курс",ВыбКурс); Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда Возврат Выборка.Курс; КонецЕсли; Возврат 0; КонецФункции &НаКлинте Процедура ЗапЗапчастьПриИзменении(Элемент) Ку=Курс(Курс); Сообщить(Ку); КонецПроцедуры

7. user1155564 06.06.19 17:33 Сейчас в теме
(6) оно на клиент ругается
: Переменная не определена (Курс)
Ку=>Курс; (Проверка: Тонкий клиент)
8. tusv 208 06.06.19 17:37 Сейчас в теме

(7)А что вы хотите то получить то? Я Вам пример кода показал. Сказал, что Вы из Курса курс получаете. Подставьте правильный параметр в функцию

9. user1155564 06.06.19 17:41 Сейчас в теме
(8) я хочу получить из регистра данные курс(это число)
и в клиенте занести его в переменную
10. tusv 208 06.06.19 18:48 Сейчас в теме
(9) Так наверное Вам надо валюту в параметр пихать

&НаСервере Функция Курс(Валюта) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 | ВалютаСрезПоследних.Курс |ИЗ | РегистрСведений.Валюта.СрезПоследних(,&Валюта) КАК ВалютаСрезПоследних "; Запрос.УстановитьПараметр("Валюта",Валюта); Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда Возврат Выборка.Курс; КонецЕсли; Возврат 0; КонецФункции &НаКлинте Процедура ЗапЗапчастьПриИзменении(Элемент) Ку=Курс(Объект.ВалютаДокумента); Сообщить(Ку); КонецПроцедуры

14. user1155564 06.06.19 21:08 Сейчас в теме
(10) а нельзя его передать никуда не запихивая?
15. user1155564 06.06.19 21:15 Сейчас в теме
(10) возвращает пустое значение
может все таки в запросе ошиблась
18. catena 110 07.06.19 10:37 Сейчас в теме
я хочу получить из регистра данные курс(это число)
и в клиенте занести его в переменную

В вашем запросе написано: дай мне курс, который равен &курс .
Может все-таки нужно было: дай мне курс от валюты &Валюта ?

12. user613191_olgargor 06.06.19 19:54 Сейчас в теме

(5) передача на клиент производится с помощью инструкции Возврат Переменная;
При вызове на клиенте пишется:
ПеременнаяНаша = Курс(ПараметрыВызываемойФункции);

в в функции «Курс» в конце пишете Возврат Результат; или Возврат Выборка.Курс при переборе выборки, это уже зависит от того, что нужно возвращать, Вам виднее.

Вы просто не написали на клиенте вызов функции своей

Грубо говоря надо так:

&НаСервере Функция Курс(ВыбКурс ) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 | ВалютаСрезПоследних.Курс |ИЗ | РегистрСведений.Валюта.СрезПоследних КАК ВалютаСрезПоследних |ГДЕ | ВалютаСрезПоследних.Курс = &Курс"; Запрос.УстановитьПараметр("Курс",ВыбКурс); Результат = Запрос.Выполнить(); Если Не Результат.Пустой() Тогда возврат Результат.Выгрузить()[0][0]; КонецЕсли; возврат ""; КонецФункции &НаКлиенте Процедура ЗапЗапчастьПриИзменении(Элемент) Параметр = 25; //для примера так Ку=Курс(Параметр); //это вызов вашей функции с параметром Сообщить(Ку); КонецПроцедуры

Как записать результат запроса в переменную sql

Для создания сложных запросов, выполняемых в несколько этапов, в SQL предусмотрены переменные.

В переменных могут сохраняться результаты вычисления встроенных функций и констант.

Для использования переменной, ее надо предварительно « объявить » , выполнив команду DECLARE языка SQL. Команда DECLARE имеет следующий формат: DECLARE , где — это название объявляемой переменной, а — тип данных, хранимых в ней. Названия переменных начинаются с символа « @ » , после которого могут использоваться буквы латинского алфавита, цифры и знаки « @ » , « $ » , « % » , « & » , « ~ » , « _ » .

Поддерживаются следующие основные типы данных:

  • Geometry — пространственный объект;
  • BigInt — целочисленное значение в диапазоне от -2 63 -1 до 2 63 (от — 9,223,372,036,854,775,808 по +9,223,372,036,854,775,807 );
  • Int — целочисленное значение в диапазоне от -2 31 ( -2,147,483,648 ) to 2 31 -1 ( 2,147,483,647 );
  • SmallInt — целочисленное значение в диапазоне от -2 15 ( -32,768 ) to 2 15 -1 ( 32,767 );
  • Double , Float , Real — число с плавающей точкой;
  • char , varchar — строковое значение.

Переменным можно присваивать только значения соответствующего типа данных. Для задания значения переменной используется команда SET языка SQL, имеющая формат SET = , где — выражение составленное из числовых и строковых функций и констант, соединенных знаками сложения, вычитания, умножения и деления, и сгруппированных с помощью скобок.

Использование переменных

DECLARE @i Int; SET @i = 2+2; SELECT @i*3

В примере объявляется переменная @g типа Int . Для переменной задается значение — результат вычисления выражения 2+2 , после чего значение переменной умноженной на 3 выводится в область ответа с помощью ключевого слова SELECT .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *