Sql for do возврат

Как выполнить вставку и возврат вставленной идентичности с помощью Dapper?

Как выполнить вставку в базу данных и вернуть вставленную личность с помощью Dapper?

Я пробовал что-то вроде этого:

Но это не сработало.

@Marc Gravell благодарит, за ответ. Я пробовал ваше решение, но еще одна трассировка исключений ниже

Он поддерживает параметры ввода/вывода (включая значение RETURN ), если вы используете DynamicParameters , но в этом случае более простой вариант:

KB: 2019779:» При использовании SCOPE_IDENTITY() и @@IDENTITY вы можете получать неправильные значения, Предложение OUTPUT является самым безопасным механизмом:

Не уверен, что это было потому, что я работаю против SQL 2000 или нет, но я должен был сделать это, чтобы заставить его работать.

Полученное вами InvalidCastException связано с тем, что SCOPE_IDENTITY является Decimal (38,0).

Вы можете вернуть его как int, выполнив его следующим образом:

Если вы используете Dapper.SimpleSave:

Вот альтернатива ответам SCOPE_IDENTITY() , которые мы закончили с помощью: OUTPUT INSERTED

Возвращает только идентификатор вставленного объекта:

Он позволяет получить все или некоторые атрибуты вставленной строки:

Возвращенный вставленный объект с идентификатором:

Если вы хотите, вы можете получить Phone и Email или даже всю вставленную строку:

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

Столбцы, возвращаемые из OUTPUT, отражают данные, как и после Инструкция INSERT, UPDATE или DELETE завершена, но до запуска выполняются.

Для триггеров INSTEAD OF возвращаемые результаты генерируются так, как если бы INSERT, UPDATE или DELETE на самом деле произошло, даже если нет изменения происходят в результате операции триггера. Если оператор, который включает предложение OUTPUT, используется внутри тела триггер, псевдонимы таблицы должны использоваться для ссылки на введенный триггер и удаленные таблицы, чтобы избежать дублирования ссылок столбцов с помощью INSERTED и DELETED, связанные с OUTPUT.

qaru.site

Рефакторинг функции PL/pgSQL для возврата результатов различных запросов SELECT

Я написал функцию, которая выводит запрос PostgreSQL SELECT , хорошо сформированный в текстовой форме. Теперь я больше не хочу выводить текст, но фактически запускаю сгенерированный оператор SELECT по базе данных и возвращаю результат — точно так же, как сам запрос.

Что я до сих пор:

sensors содержит список имен столбцов для таблицы type . Они объявляются и заполняются в ходе выполнения функции. В конце концов, они содержат такие значения, как:

sensors : ‘column1, column2, column3’
За исключением Datahora ( timestamp ) все столбцы имеют тип double precision .

type : ‘myTable’
Может быть именем одной из четырех таблиц. Каждый из них имеет разные столбцы, за исключением общего столбца Datahora .

Переменная sensors будет содержать все столбцы, отображаемые здесь для соответствующей таблицы в type . Например: Если type — pcdmet , тогда sensors будет ‘datahora,dirvento,precipitacao,pressaoatm,radsolacum,tempar,umidrel,velvento’

Переменные используются для сборки оператора SELECT , который хранится в result . Как:

В настоящее время моя функция возвращает это выражение как text . Я копирую-вставляю и выполняю его в pgAdmin или через psql. Я хочу автоматизировать это, запустить запрос автоматически и вернуть результат. Как я могу это сделать?

Динамический SQL и RETURN тип

(я сохранил лучшее для последнего, продолжаю читать!)
Вы хотите выполнить динамический SQL. В принципе, это просто в plpgsql с помощью EXECUTE . Вам не нужен курсор — на самом деле, большую часть времени вам лучше без явных курсоров.
Найдите примеры SO с поиском.

Проблема, с которой вы столкнулись: вы хотите вернуть записи еще undefined типа. Функция должна объявлять возвращаемый тип с помощью RETURNS (или с помощью OUT или INOUT параметры). В вашем случае вам придется вернуться к анонимным записям, потому что число, имена и типы возвращаемых столбцов различаются. Как:

Однако это не особенно полезно. Таким образом, вам нужно будет предоставить список определений столбцов при каждом вызове функции. Как:

Но как бы вы это сделали, когда заранее не знаете столбцы?
Вы можете использовать менее структурированные типы данных документа, такие как json , jsonb , hstore или xml :

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

Простое решение с фиксированным обратным типом

Столбец datahora представляется заданным, я буду считать тип данных timestamp и что всегда есть еще два столбца с переменным именем и типом данных.

Имена, которые мы оставим в пользу имен общих типов в возвращаемом типе.
Типы, которые мы также оставим, и набросим все на text , так как каждый тип данных может быть добавлен к text .

Как это работает?

Вместо переменных _sensors и _type могут быть введены параметры.

Обратите внимание на RETURNS TABLE .

Обратите внимание на использование RETURN QUERY EXECUTE . Это один из самых элегантных способов возврата строк из динамического запроса.

Я использую имя для параметра функции, просто чтобы сделать предложение USING RETURN QUERY EXECUTE менее запутанным. $1 в SQL-строке не ссылается на параметр функции, а на значение, переданное с предложением USING . (В этом простом примере оба варианта $1 находятся в соответствующей области.)

Обратите внимание на примерное значение для _sensors : для каждого столбца используется тип text .

Этот код очень уязвим для SQL-инъекции. Я использую quote_ident() для защиты от него. Объединение пары имен столбцов в переменной _sensors предотвращает использование quote_ident() (и обычно это плохая идея!). Убедитесь, что никакие плохие вещи не могут быть там каким-либо другим способом, например, индивидуально управляя именами столбцов через quote_ident() . Параметр VARIADIC приходит на ум.

Упрощение с PostgreSQL 9.1 +

С версией 9.1 или новее вы можете использовать format() для дальнейшего упрощения:

Снова, отдельные имена столбцов могут быть экранированы правильно и будут чистым способом.

Переменная количество столбцов, имеющих один и тот же тип

После того, как ваш вопрос будет обновлен, похоже, что ваш тип возврата имеет

  • переменное количество столбцов
  • но все столбцы одного и того же типа double precision (псевдоним float8 )

Как мы должны определить тип RETURN функции, я прибегаю к типу ARRAY в этом случае, который может содержать переменное число значений. Кроме того, я возвращаю массив с именами столбцов, чтобы вы могли также анализировать имена из результата:

Различные полные типы таблиц

Если вы действительно пытаетесь вернуть все столбцы таблицы (например, одну из таблиц на связанной странице, затем используйте это простое, очень мощное решение с полиморфным типом:

Замените pcdmet в вызове любым другим именем таблицы.

Как это работает?

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

PostgreSQL автоматически определяет тип строки (составной тип данных) для каждой созданной таблицы, поэтому для каждой таблицы есть четко определенный тип. Это включает временные таблицы, которые удобны для ad-hoc-использования.

Любой тип может быть NULL . Таким образом, мы передаем значение NULL , отбрасываем тип таблицы.

Теперь функция возвращает четко определенный тип строки, и мы можем использовать SELECT * FROM data_of(. ) для разложения строки и получения отдельных столбцов.

pg_typeof(_tbl_type) возвращает имя таблицы как тип идентификатора объекта regtype . При автоматическом преобразовании в text идентификаторы автоматически дублируются и имеют сертификат, если необходимо. Поэтому SQL-инъекция не является возможной. Это может даже иметь дело с табличными именами где quote_ident() не работает.

qaru.site

Как создать функцию SQL Server для возврата int?

Я пытаюсь создать SQL-функцию, которая проверяет, начинается ли параметр с определенного термина или содержит этот термин, но не начинается с него.

В принципе, если параметр начинается с термина, функция возвращает 0. В противном случае он возвращает 1.

Это кости функции, которые у меня есть, которую я пытаюсь адаптировать из другой функции, которую я нашел:

Вы не указываете имя переменной для возвращаемого значения, только его тип, а парны не нужны;

Не будет работать, вам понадобится динамический SQL, чтобы выбрать из объекта, имя которого находится в переменной.

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

Im принимает следующее:

  • @fieldName — это фактически имя таблицы (судя по вашей попытке использования).
  • @searchterm — это термин, который вы ищете
  • Data — столбец в таблице @fieldName

Если какой-либо из вышеперечисленных правил неверен, этот ответ является бесполезным.

Вам нужно будет использовать динамический sql, поскольку таблица в выбранном запросе не может быть параметризована. Вам понадобятся две разные версии динамического sql, которые вы хотите проверить «начинается с» и более общие «содержит». Для определения результата вызова вам понадобится выходная переменная из динамического sql.

Как утверждают, INT представляет собой полный избыток по размеру. Если у вас всего 2 состояния (что я сомневаюсь), вы хотите BIT , если у вас есть 3 состояния (как я подозреваю), вы хотите TINYINT . Я буду придерживаться int для того, чтобы оставаться рядом с вашим оригинальным примером, но подумайте об изменении.

qaru.site

SQL INSERT INTO SELECT и возврат данных SELECT для создания подсчетов строк

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

Я решил, что наиболее эффективным способом было бы создать таблицу MEMORY, в которой я использую INSERT INTO, чтобы вытащить идентификаторы строк, а затем выполнить функцию cron, которая выполняется регулярно, чтобы агрегировать количество идентификаторов просмотра и очищает память таблицы, обновляя оригинал с последним количеством просмотров. Это позволяет избежать постоянного обновления таблицы, которая, скорее всего, будет получать доступ больше всего, поэтому я не блокирую 150 строк за каждый запрос (или всю таблицу, если я использую MyISAM).

В принципе, метод объяснил здесь.

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

Есть ли способ SELECT набора данных, вернуть этот набор данных и одновременно вставить один столбец из этого набора данных в другую таблицу?

Похоже, PostgreSQL может иметь что-то похожее на то, что я хочу, с ключевым словом RETURNING, но я использую MySQL.

Прежде всего, я бы не добавил столбец счетчика в таблицу Main . Я бы создал отдельную таблицу Audit , которая удерживала бы ID элемента в таблице Main плюс, по крайней мере, метку времени, когда запрос ID был запрошен. По сути, таблица Audit хранит историю запросов. В этом подходе вы можете легко создавать гораздо более интересные отчеты. Вы всегда можете рассчитать суммарные суммы за каждый элемент, а также вы можете рассчитывать сводки по дням, неделям, месяцам и т.д. На предмет или по всем пунктам. В зависимости от объема данных вы можете периодически удалять записи аудита старше определенного порога (месяц, год и т.д.).

Кроме того, вы можете легко хранить дополнительную информацию в таблице Audit по мере необходимости, например, идентификатор пользователя для расчета статистики для каждого пользователя.

Чтобы заполнить таблицу Audit «автоматически», я бы создал хранимую процедуру. Клиентский код вызовет эту хранимую процедуру вместо выполнения оригинала SELECT . Сохраненная процедура возвращает точно такой же результат, как и исходный SELECT , но также будет добавлять необходимые данные в таблицу Audit прозрачно к клиентскому коду.

Итак, допустим, что таблица Audit выглядит так:

и ваш основной SELECT выглядит так:

Для выполнения как INSERT , так и SELECT в одном из операторов SQL Server я бы использовал предложение OUTPUT в предложении Postgres — RETURNING в MySQL -. Я не думаю, что у него есть что-то вроде этого. Таким образом, процедура MySQL будет содержать несколько отдельных операторов.

MySQL

Сначала сделайте SELECT и вставьте результаты в таблицу временную (возможно, память). Затем скопируйте идентификаторы элементов из временной таблицы в таблицу Audit . Затем SELECT из временной таблицы, чтобы вернуть результат клиенту.

SQL Server (просто для того, чтобы дразнить вас. Этот единственный оператор делает как INSERT , так и SELECT )

Вы можете оставить таблицу Audit такой, какой она есть, или вы можете настроить cron, чтобы суммировать его периодически. Это действительно зависит от объема данных. В нашей системе мы сохраняем отдельные строки в течение недели, а также суммируем статистику в час и сохраняем ее в течение 6 недель, плюс мы сохраняем ежедневное резюме в течение 18 месяцев. Но важной частью все эти сводки являются отдельные таблицы Audit , мы не сохраняем информацию аудита в таблице Main , поэтому нам не нужно ее обновлять.

Joe Celko очень хорошо объяснил это в Привычки стиля SQL: атака Skeuomorphs:

Теперь перейдите на любой текстовый поиск в текстовом формате SQL Forum. Ты найдешь тысячи сообщений с DDL, которые включают столбцы с именем createdby , createddate , modifiedby и modifieddate с этим конкретным метаданные в конце объявления строки. Это старая магнитная лента заголовок, написанный на новом языке! Дежа Ву!

Записи заголовков появлялись только один раз на ленте. Но эти метаданные значения появляются снова и снова в каждой строке таблицы. Один из главных Причины использования баз данных (а не только SQL) заключались в устранении избыточности из данных; это просто добавляет больше избыточности. Но теперь подумайте о что происходит с аудитом при удалении строки? Что происходит с контрольная цепочка при обновлении строки? Тропа разрушена. данные аудита должны быть отделены от схемы. Вы поместили бы журнал файл на том же диске, что и база данных? Будет ли бухгалтер тот же человек одобряет и получает платеж?

qaru.site

Sql for do возврат








Справочное руководство по MySQL

8.2.2 Интерфейс DBI
  • 8 Интерфейсы для MySQL
    • 8.2 Интерфейс Perl API для MySQL
      • 8.2.1 DBI с помощью DBD::mysql
      • 8.2.2 Интерфейс DBI
      • 8.2.3 Больше информации по DBI / DBD

8.2.2 Интерфейс DBI

Унифицированные методы DBI

Методы, определенные только для MySQL

Более детально методы Perl DBI описаны в следующих разделах. Возвращаемые переменные: $dbh Дескриптор базы данных $sth Дескриптор выражения $rc Код возврата (часто статус) $rv Возвращенное значение (часто количество строк)

Унифицированные методы DBI

connect($data_source, $username, $password) Метод connect используется для подсоединения к источнику данных (СУБД). Строка $data_source должна начинаться с DBI:имя драйвера: . Примеры вызова connect с драйвером DBD::mysql : Если не определены имя пользователя либо пароль, DBI использует значения переменных окружения DBI_USER и DBI_PASS . Если не указано имя хоста, используется значение по умолчанию — localhost . Если не указан номер порта, также используется значение по умолчанию (3306). Начиная с Msql-Mysql-modules версии 1.2009, доступны следующие модификаторы $data_source : mysql_read_default_file=file_name Читать файл `file_name' как файл настроек. За более подробной информацией о файлах настройки обращайтесь к разделу See section 4.1.2 Файлы параметров `my.cnf'. mysql_read_default_group=group_name По умолчанию используется группа [client] файла настроек. Опцией mysql_read_default_group , группа по умолчанию устанавливается в [group_name] . mysql_compression=1 Использовать сжатие при обмене клиента и сервера (MySQL версий 3.22.3 и выше). mysql_socket=/path/to/socket Указывает путь к Unix-сокету, который будет использоваться для соединения с сервером. (MySQL версии 3.21.15 и более поздние). Можно указывать не один модификатор, а несколько; при этом каждый должен предваряться точкой с запятой. Например, если вы не хотите явно указывать имя пользователя и пароль в программе, использующей DBI , можно внести эту информацию в файл `

/.my.cnf', написав вызов connect . Это делается следующим образом: Данный пример считает настройки из группы [client] файла `

/.my.cnf'. Чтобы выполнить те же действия, но с настройками, взятыми из группы [perl] , нужно использовать следующую форму записи: disconnect Метод disconnect разрывает соединение с базой данных. Это стоит делать перед выходом из программы. Пример: prepare($statement) Подготавливает SQL-запрос $statement к исполнению сервером. Возвращает дескриптор выражения ( $sth ), который затем используется для вызова метода execute . Обычно работа с запросами типа SELECT (так же, как и аналогичными, такими как SHOW , DESCRIBE , EXPLAIN ) сводится к вызову методов prepare и execute . Пример: execute Метод execute выполняет приготовленный запрос. Если запрос не SELECT , метод возвращает количество строк, которые были подверглись воздействию запроса. Если таковых нет, execute возвращает «0E0″ , что Perl интерпретирует как нуль, но воспринимает как значение «истина» (true). Если возникает ошибка, execute возвращает undef . Для запросов SELECT метод только инициирует выполнение запроса SQL-сервером и для получения данных необходимо использовать один из методов fetch_* . Пример: do($statement) Метод do готовит SQL-запрос к выполнению, выполняет его и возвращает количество строк, подвергшихся воздействию. Если нет ни одной такой строки, как результат возвращается значение «0E0″ , что Perl интерпретирует как нуль, но воспринимает как значение «истина» (true).. Этот метод обычно используется для выражений, не являющихся операторами SELECT , которые не могут быть подготовлены заранее (из-за ограничений драйвера) или же выполняются только один раз (операции вставки, удаления и т.д.). Например: Обычно использование ‘do’ существенно быстрей (и предпочтительней) для запросов без параметров, чем пара prepare / execute . quote($string) Метод quote используется для экранирования специальных символов в запросе символами экранирования, а также заключения данных в необходимые внешние символы цитирования (например кавычки). Пример: fetchrow_array Этот метод выбирает очередную строку данных и возвращает ее как массив значений полей. Пример: fetchrow_arrayref Этот метод выбирает очередную строку данных и возвращает ссылку на массив значений полей. Пример: fetchrow_hashref Этот метод выбирает строку данных и возвращает ссылку на хеш, содержащий пары имя/значение. Данный метод намного менее эффективен, чем использование пописанных выше ссылок на массивы. Пример: fetchall_arrayref Этот метод выдает все данные (все строки), получаемые как результат SQL-запроса. Он возвращает ссылку на массив ссылок на массивы отдельных строк. Соответственно, для обращения к этим данным нужно использовать вложенный цикл. Пример: finish Указывает, что данные этого дескриптора запроса больше не нужны. После вызова этого метода программа освобождает дескриптор запроса и все системные ресурсы, которые используются для работы с ним. Пример: rows Возвращает число измененных/удаленных последней командой ( UPDATE , DELETE и т.д.) строк. Это обычно требуется после выполнения метода execute над запросами, не являющимися запросами SELECT . Например: NULLABLE Возвращает ссылку на массив булевых значений; для каждого элемента массива значение TRUE обозначает, что соответствующий столбец (поле) может содержать значение NULL . Например: NUM_OF_FIELDS Значение этого атрибута равно числу полей в результате запроса ( SELECT или SHOW FIELDS ). Его можно использовать его для проверки, возвращает ли запрос результат вообще: нулевое значение соответствует запросам типа INSERT , DELETE , UPDATE — т.е. всем, кроме SELECT . Например: data_sources($driver_name) Этот метод возвращает массив с именами баз данных, доступных на локальном MySQL-сервере (на localhost ). Пример: ChopBlanks Этот атрибут определяет, будут ли методы fetchrow_* убирать начальные и оконечные пробелы из результатов. Пример: trace($trace_level) trace($trace_level, $trace_filename) Метод trace разрешает или запрещает трассировку. Если он вызывается как метод класса DBI , он влияет на разрешение трассировки всех дескрипторов. В случае же обращения к нему как к методу дескриптора запроса либо базы данных он разрешает/запрещает трассировку для этой базы данных или этого запроса (и всех будущих потомков). $trace_level указывает уровень детализации трассировочной информации, так установка $trace_level в 2 включает детализированную трассировку. Установка $trace_level в 0 запрещает трассировку. По умолчанию вывод трассировочной информации осуществляется на стандартное устройство вывода ошибок ( stderr ). Если указан параметр $trace_filename , его значение используется как имя файла, в который выводится трассировочная информация ВСЕХ дескрипторов, для которых разрешена трассировка. Пример: Трассировку DBI можно также включить при помощи переменной окружения DBI_TRACE . Присвоение числового значения эквивалентно вызову DBI->trace(значение) . Строковое значение (имя файла) эквивалентно вызову DBI->trace(2,значение) .

Методы, специфичные для MySQL

Описанные здесь методы специфичны для MySQL и не являются частью стандарта DBI . Сейчас считается, что часть из них использовать не стоит: is_blob , is_key , is_num , is_pri_key , is_not_null , length , max_length и table . Ниже указаны возможные стандартные альтернативы, если они существуют:

insertid Если вы используете специфичную для MySQL функцию AUTO_INCREMENT , здесь будут сохраняться автоматически увеличенные значения. Пример: В качестве альтернативы можно использовать $dbh -> <'mysql_insertid'>. is_blob Возвращает ссылку на массив булевых значений; для каждого элемента массива значение «истина» указывает, что соответствующий столбец имеет тип BLOB . Например: is_key Возвращает ссылку на массив булевых значений; для каждого элемента массива значение «истина» указывает, что соответствующий столбец является ключом. Пример: is_num Возвращает ссылку на массив булевых значений; для каждого элемента массива, значение «истина» указывает, что соответствующий столбец содержит числовые значения. Например: is_pri_key Возвращает ссылку на массив булевых значений; для каждого элемента массива, значение «истина» указывает, что соответствующий столбец является первичным ключом. Пример: is_not_null Возвращает ссылку на массив б булевых значений; для каждого элемента массива значение «ложь» указывает на то, что столбец может содержать значения NULL . Например: is_not_null не рекомендуется к применению; предпочтительно использование NULLABLE (описан ранее), поскольку это стандартный для DBI метод. length max_length Каждый из этих методов возвращает ссылку на массив размеров столбцов. Массив, соответствующий length , содержит максимальные допустимые размеры каждого столбца (из описания таблицы). Массив max_length содержит максимальные размеры элементов, присутствующих в результирующей таблице. Например: NAME Возвращает ссылку на массив имен столбцов. Например: table Возвращает ссылку на массив названий таблиц. Например: type Возвращает ссылку на массив типов столбцов. Пример:

www.mysql.ru

Смотрите так же:

  • Сибай юристы Юристы в Сибае 9 специалистов Цены: от 299 до 2000 / усл. Цены: от 1000 до 10 000 / усл. Цены: от 500 до 7000 / усл. Цены: от 3000 до 10 000 / усл. Цены: от 2999 до 10 000 / усл. Юристы — широкая база специалистов Проверенные отзывы […]
  • Проведение совещания правила Проведение совещания правила Как часто ты сидел на совещаниях, которые, перевалив по длительности за 2 часа, пытались решить одновременно все проблемы на свете? Когда люди, красные от духоты, теряя самообладание от усталости, начинают […]
  • Возврат из функции php Совет: возврат нескольких значений из функции Вообще говоря PHP не даёт нам возможности вернуть несколько значений из функции. В то же время мы можем вернуть массив данных и разобрать его различными способами. В данном примере функция […]
  • Школьный правила на английском Сочинение на английском языке Школьные правила/ School Rules с переводом на русский язык бесплатно Представлено сочинение на английском языке Школьные правила/ School Rules с переводом на русский язык. School is the place where we meet […]
  • Was made время залог Английский по красному Мёрфи TEST ПАССИВ (passive voice ['pæsɪv vɔɪs] страдательный залог, делается с помощью вспомогательного глагола BE + V 3 (past participle — прошедшее причастие "Какой уже?">, 3-я форма глагола): — The room is […]
  • Заявление о выборе медицинской организации образец севастополь Заявление о выборе медицинской организации образец севастополь ГБУЗ ЯНАО «Ноябрьская ЦГБ» г. Ноябрьск, ул. Муравленко, 42 б Тел.: регистратура (3496) 35-51-11, 39-84-84 справка (3496) 34-19-46 e-mail: […]

Обсуждение закрыто.