Size: a a a

2020 July 17

ПА

Попов Алексей... in ru_mysql
CREATE PROCEDURE sp_Test ( IN @ myvar VARCHAR )
BEGIN
SELECT @ myvar;
END

Пробел убрать (из-за телеграмм бота).
Будет всегда null, если убрать собаку, будет норм
источник

ПА

Попов Алексей... in ru_mysql
Просто работал до этого с ms sql, немного странным кажется поведение  mysql
источник

M

Mb1W@ in ru_mysql
источник

В

Вячеслав in ru_mysql
Nickolay Ihalainen
там в pdf строчка была, я поэтому и скинул, через mysqlbinlog
да, есть такая

mysqlbinlog --base64-output=DECODE-ROWS --verbose /var/log/mysql/mysql-bin.00000* | grep 7678bb24-c757-11ea-9790-080027f645a4:1 -A6

Но я не могу понять что здесь не так

SET @@SESSION.GTID_NEXT= '7678bb24-c757-11ea-9790-080027f645a4:1'/*!*/;
# at 31392
#200716 16:00:08 server id 3  end_log_pos 31470 CRC32 0x5152a761        Query   thread_id=13699 exec_time=0     error_code=0
SET TIMESTAMP=1594915208/*!*/;
SET @@session.sql_mode=0/*!*/;
FLUSH TABLES
/*!*/;
--
# 7678bb24-c757-11ea-9790-080027f645a4:1
# at 275
#200716 16:00:01 server id 2  end_log_pos 361 CRC32 0x0fb1f90e  GTID    last_committed=0        sequence_number=1       rbr_only=yes    original_committed_timestamp=1594915201539227   immediate_commit_timestamp=1594915211144332     transaction_length=336
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
# original_commit_timestamp=1594915201539227 (2020-07-16 16:00:01.539227 UTC)
# immediate_commit_timestamp=1594915211144332 (2020-07-16 16:00:11.144332 UTC)
/*!80001 SET @@session.original_commit_timestamp=1594915201539227*//*!*/;
источник

В

Вячеслав in ru_mysql
А FLUSH TABLES разве должен попадать в бинлог?
источник

ПА

Попов Алексей... in ru_mysql
CREATE DEFINER=`root`@`%` PROCEDURE SP_CreateOrUpdateProduct`( IN  `sp_CrmId VARCHAR(40) )
BEGIN
DECLARE @SelectId BIGINT(20);
SELECT Id INTO  @SelectId FROM  Products  WHERE  CrmId = sp_CrmId;
SELECT @SelectId;
END
Короче су
ть, если в таблице есть запись с sp_CrmId тогда он ее ID-шник выведет, если я передам левый ID-щник которого не существует, он мне за место NULL выводит ИДшкий какойто записи, как будто нету WHERE
источник

ПА

Попов Алексей... in ru_mysql
Что не так?
источник

SS

Sergei Solomatov in ru_mysql
видать сессионная переменная виновна, попробуй так
CREATE DEFINER=`root`@`%` PROCEDURE SP_CreateOrUpdateProduct`( IN  `sp_CrmId VARCHAR(40) )
BEGIN
SELECT Id FROM  Products  WHERE  CrmId = sp_CrmId;
END
источник

SS

Sergei Solomatov in ru_mysql
Попов Алексей
Что не так?
забыл что null надо вернуть. тогда попробуй без @
CREATE DEFINER=`root`@`%` PROCEDURE SP_CreateOrUpdateProduct`( IN  `sp_CrmId VARCHAR(40) )
BEGIN
DECLARE SelectId BIGINT(20);
SELECT Id INTO  SelectId FROM  Products  WHERE  CrmId = sp_CrmId;
SELECT SelectId;
END
источник

ПА

Попов Алексей... in ru_mysql
Sergei Solomatov
забыл что null надо вернуть. тогда попробуй без @
CREATE DEFINER=`root`@`%` PROCEDURE SP_CreateOrUpdateProduct`( IN  `sp_CrmId VARCHAR(40) )
BEGIN
DECLARE SelectId BIGINT(20);
SELECT Id INTO  SelectId FROM  Products  WHERE  CrmId = sp_CrmId;
SELECT SelectId;
END
Спасибо... получается без @ работает как надо..
источник

ПА

Попов Алексей... in ru_mysql
я думал @ в названии переменной - это просто как в SQL Server обычное название
источник

ПА

Попов Алексей... in ru_mysql
Я понял, короче лучше не использовать собаку в переменных при работе с mariadb/mysql
источник

ПА

Попов Алексей... in ru_mysql
А то я настрочил процедуру в 280 строк и сижу туплю че не так
источник

ПА

Попов Алексей... in ru_mysql
Sergei Solomatov
забыл что null надо вернуть. тогда попробуй без @
CREATE DEFINER=`root`@`%` PROCEDURE SP_CreateOrUpdateProduct`( IN  `sp_CrmId VARCHAR(40) )
BEGIN
DECLARE SelectId BIGINT(20);
SELECT Id INTO  SelectId FROM  Products  WHERE  CrmId = sp_CrmId;
SELECT SelectId;
END
👍Блин, спасибо. Такая мелочь. Но все сразу заработало. Теперь процедура работает по все логике как надо.
источник

SS

Sergei Solomatov in ru_mysql
)) да, тут есть тонкость. используй @ только если нужно сохранить состояние между разными вызовами
источник

ПА

Попов Алексей... in ru_mysql
Sergei Solomatov
)) да, тут есть тонкость. используй @ только если нужно сохранить состояние между разными вызовами
Понял, спасибо. Да я сперва про INTO гуглил. Т.к. обычно в SQL Server просто хватает сделать SELECT VarId = Id ....  ; Select VarId.
Короче разница коласальная не смотря на схожий синтаксис)
Я сегодня пытался поднапрячь коллег, но все только с SQL Server работают, этих тонкостей не знают совсем, хотя программируют на t-SQL годы
источник

ПА

Попов Алексей... in ru_mysql
я как то раньше всю логику на backend перекладывал в скрипты (python, js, php, java), сейчас проект небольшой хочется как то оптимизировать что ли. SQL Server - очень дорого, поэтому maria)
источник

М

Марк in ru_mysql
Всем привет) Подскажите,пжл, по такому нубскому вопросу)

Например, в одной таблице у меня клиенты (clients), в другой их заказы (orders). Соединяются по client_id. Мне нужно взять из первой таблицы id и имя клиента, а из второй его последний заказ. Я делаю это через двойное объединение:

SELECT c.id, c.name, o.id as 'последний заказ'
FROM clients c
LEFT JOIN (SELECT o.client_id, MAX(o.id) as max_order_id
FROM orders o GROUP BY client_id) as tb1 ON tb1.client_id = c.id
LEFT JOIN orders o ON o.id = tb1. max_order_id
источник

М

Марк in ru_mysql
Наверняка же есть более красивый и производительный способ сделать это?
источник

ls

løst søul in ru_mysql
скалярным подзапросом в select - from можно сделать
источник