Перейти к содержимому

Exec sql что это

  • автор:

33.3. Запуск команд SQL

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

33.3.1. Выполнение операторов SQL

EXEC SQL CREATE TABLE foo (number integer, ascii char(16)); EXEC SQL CREATE UNIQUE INDEX num1 ON foo(number); EXEC SQL COMMIT;
EXEC SQL INSERT INTO foo (number, ascii) VALUES (9999, 'doodad'); EXEC SQL COMMIT;
EXEC SQL DELETE FROM foo WHERE number = 9999; EXEC SQL COMMIT;
EXEC SQL UPDATE foo SET ascii = 'foobar' WHERE number = 9999; EXEC SQL COMMIT;

Операторы SELECT, возвращающую одну строку результата, также могут выполняться непосредственно командой EXEC SQL. Чтобы обработать наборы результатов с несколькими строками, приложение должно использовать курсоры; см. Подраздел 33.3.2 ниже. (В отдельных случаях приложение может выбрать сразу несколько строк в переменную массива; см. Подраздел 33.4.4.3.1.)

Выборка одной строки:

EXEC SQL SELECT foo INTO :FooBar FROM table1 WHERE ascii = 'doodad';

Так же можно получить параметр конфигурации командой SHOW:

EXEC SQL SHOW search_path INTO :var;

Идентификаторы вида :имя воспринимаются как переменные среды, то есть они ссылаются на переменные программы C. Они рассматриваются в Разделе 33.4.

33.3.2. Использование курсоров

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

Выборка с использованием курсоров:

EXEC SQL DECLARE foo_bar CURSOR FOR SELECT number, ascii FROM foo ORDER BY ascii; EXEC SQL OPEN foo_bar; EXEC SQL FETCH foo_bar INTO :FooBar, DooDad; . EXEC SQL CLOSE foo_bar; EXEC SQL COMMIT;

Более подробно объявление курсора описывается в DECLARE, а команда FETCH описана в FETCH.

Замечание: Команда DECLARE в ECPG на самом деле не передаёт этот оператор серверу PostgreSQL. Курсор открывается на сервере (командой сервера DECLARE) в момент, когда выполняется команда OPEN.

33.3.3. Управление транзакциями

В режиме по умолчанию операторы фиксируются только когда выполняется EXEC SQL COMMIT. Интерфейс встраиваемого SQL также поддерживает автофиксацию транзакций (подобно libpq ); она включается аргументом командной строки -t программы ecpg (см. ecpg ) либо оператором EXEC SQL SET AUTOCOMMIT TO ON. В режиме автофиксации каждая команда фиксируется автоматически, если только она не помещена в явный блок транзакции. Этот режим можно выключить явным образом, выполнив EXEC SQL SET AUTOCOMMIT TO OFF.

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

EXEC SQL COMMIT

Зафиксировать текущую транзакцию. EXEC SQL ROLLBACK

Откатить текущую транзакцию. EXEC SQL SET AUTOCOMMIT TO ON

Включить режим автофиксации. SET AUTOCOMMIT TO OFF

Отключить режим автофиксации. По умолчанию он отключён.

33.3.4. Подготовленные операторы

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

Оператор подготавливается командой PREPARE. Вместо значений, которые ещё неизвестны, вставляются местозаполнители «?» :

EXEC SQL PREPARE stmt1 FROM "SELECT oid, datname FROM pg_database WHERE oid = ?";

Если оператор возвращает одну строку, приложение может вызвать EXECUTE после PREPARE для выполнения этого оператора, указав фактические значения для местозаполнителей в предложении USING:

EXEC SQL EXECUTE stmt1 INTO :dboid, :dbname USING 1;

Если оператор возвращает несколько строк, приложение может использовать курсор, объявленный на базе подготовленного оператора. Чтобы привязать входные параметры, курсор нужно открыть с предложением USING:

EXEC SQL PREPARE stmt1 FROM "SELECT oid,datname FROM pg_database WHERE oid > ?"; EXEC SQL DECLARE foo_bar CURSOR FOR stmt1; /* по достижении конца набора результатов прервать цикл while */ EXEC SQL WHENEVER NOT FOUND DO BREAK; EXEC SQL OPEN foo_bar USING 100; . while (1) < EXEC SQL FETCH NEXT FROM foo_bar INTO :dboid, :dbname; . >EXEC SQL CLOSE foo_bar;

Когда подготовленный оператор больше не нужен, его следует освободить:

EXEC SQL DEALLOCATE PREPARE имя;

Подробнее оператор PREPARE описан в PREPARE. Также обратитесь к Разделу 33.5 за дополнительными сведениями о местозаполнителях и входных параметрах.

Пред. Начало След.
Управление подключениями к базе данных Уровень выше Использование переменных среды

PDO::exec

Метод PDO::exec() запускает SQL-запрос на выполнение и возвращает количество строк, задействованных в ходе его выполнения.

Метод PDO::exec() не возвращает результат выборки оператором SELECT. Если нужно выбрать данные этим оператором единожды в ходе выполнения программы, используют метод PDO::query() . Если требуется запускать один и тот же запрос на выборку множество раз, лучше создать подготовленный запрос PDOStatement методом PDO::prepare() , а затем запускать его методом PDOStatement::execute() столько раз, сколько потребуется.

Список параметров

SQL-выражение, которое необходимо подготовить и запустить.

Данные внутри запроса должны быть правильно экранированы.

Возвращаемые значения

Метод PDO::exec() возвращает количество строк, которые были модифицированы или удалены в ходе его выполнения. Если таких строк нет, метод PDO::exec() вернёт значение 0 .

Внимание

Эта функция может возвращать как логическое значение false , так и значение не типа boolean, которое приводится к false . За более подробной информацией обратитесь к разделу Булев тип. Используйте оператор === для проверки значения, возвращаемого этой функцией.

В этом примере разработчик допустил ошибку, полагаясь на возвращаемый методом PDO::exec() результат. В результате, если запрос отработал без ошибок, но не модифицировал ни одной строки, работа скрипта будет завершена функцией die() :

$db -> exec () or die( print_r ( $db -> errorInfo (), true )); // неправильно
?>

Ошибки

Выдаёт ошибку уровня E_WARNING , если атрибуту PDO::ATTR_ERRMODE установлено значение PDO::ERRMODE_WARNING .

Выбрасывает исключение PDOException , если атрибуту PDO::ATTR_ERRMODE установлено значение PDO::ERRMODE_EXCEPTION .

Примеры

Пример #1 Выполнение запроса DELETE

Получение количества удалённых записей запросом DELETE без условий WHERE.

$dbh = new PDO ( ‘odbc:sample’ , ‘db2inst1’ , ‘ibmdb2’ );

/* Удаляем все записи из таблицы FRUIT */
$count = $dbh -> exec ( «DELETE FROM fruit» );

/* Получим количество удалённых записей */
print «Удалено $count строк.\n» ;
?>

Результат выполнения этого примера:

Удалено 1 строк.

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

  • PDO::prepare() — Подготавливает запрос к выполнению и возвращает связанный с этим запросом объект
  • PDO::query() — Подготавливает и выполняет выражение SQL без заполнителей
  • PDOStatement::execute() — Запускает подготовленный запрос на выполнение

User Contributed Notes 7 notes

17 years ago

This function cannot be used with any queries that return results. This includes SELECT, OPTIMIZE TABLE, etc.

17 years ago

It’s worth noting here, that — in addition to the hints given in docs up there — using prepare, bind and execute provides more benefits than multiply querying a statement: performance and security!

If you insert some binary data (e.g. image file) into database using INSERT INTO . then it may boost performance of parsing your statement since it is kept small (a few bytes, only, while the image may be several MiBytes) and there is no need to escape/quote the file’s binary data to become a proper string value.

And, finally and for example, if you want to get a more secure PHP application which isn’t affectable by SQL injection attacks you _have to_ consider using prepare/execute on every statement containing data (like INSERTs or SELECTs with WHERE-clauses). Separating the statement code from related data using prepare, bind and execute is best method — fast and secure! You don’t even need to escape/quote/format-check any data.

8 years ago

PDO::eval() might return `false` for some statements (e.g. CREATE TABLE) even if the operation completed successfully, when using PDO_DBLIB and FreeTDS. So it is not a reliable way of testing the op status.

PDO::errorInfo() can be used to test the SQLSTATE error code for ‘00000’ (success) and ‘01000’ (success with warning).

17 years ago

this function don’t execute multi_query
to get it see SQLITE_EXEC comments there is an pereg function that get all queries and execute all then an return the last one

1 year ago

Note that with MySQL you can detect a DUPLICATE KEY with INSERT (1 = INSERT, 2 = UPDATE) :

// MySQL specific INSERT UPDATE-like syntax
$sql = INSERT INTO customers
SET
> < $pdo ->quote ( $id )> ,
name = < $pdo ->quote ( $name )> ,
address = < $pdo ->quote ( $address )>
AS new
ON DUPLICATE KEY UPDATE
name = new.name,
address = new.address
SQL;

$result = $pdo -> exec ( $sql );

if ( $result === 1 ) // An INSERT of a new row has be done
> elseif ( $result === 2 ) // An UPDATE of an existing row has be done
>

13 years ago

For those that want an exec that handles params like prepare/execute does. You can simulate this with another function

class Real_PDO extends PDO <
public function execParams ( $sql , $params ) <
$stm = $this -> prepare ( $sql );
$result = false ;
if( $stm && $stm -> execute ( $params ) ) <
$result = $stm -> rowCount ();
while( $stm -> fetch ( PDO :: FETCH_ASSOC ) ) <
>
>
return $result ;
>
>
?>

Remember though, if you are doing a lot of inserts, you’ll want to do it the manual way, as the prepare statement will speed up when doing multiple executes(inserts). I use this so I can place all my SQL statements in one place, and have auto safe quoting against sql-injections.

If you are wondering about the fetch after, remember some databases can return data SELECT-like data from REMOVE/INSERTS. In the case of PostgreSQL, you can have it return you all records that were actually removed, or have the insert return the records after the insert/post field functions, and io trigger fire, to give you normalized data.

define ( «BLAH_INSERT» , «INSERT INTO blah (id,data) VALUES(. )» );
$pdo = new Real_PDO ( «connect string» );
$data = array( «1» , «2» );
$pdo -> execParams ( BLAH_INSERT , $data );
?>

16 years ago

You can’t use it not only with SELECT statement, but any statement that might return rows. «OPTIMIZE table» is such example (returns some rows with optimization status).

If you do, PDO will lock-up with the «Cannot execute queries while other unbuffered queries are active.» nonsense.

  • Copyright © 2001-2024 The PHP Group
  • My PHP.net
  • Contact
  • Other PHP.net sites
  • Privacy policy

Exec sql что это

EXECUTE — выполнить подготовленный оператор

Синтаксис

EXECUTE имя [ ( параметр [, . ] ) ]

Описание

EXECUTE выполняет подготовленный ранее оператор. Так как подготовленные операторы существуют только в рамках сеанса, они должны создаваться командой PREPARE , выполненной в текущем сеансе ранее.

Если команда PREPARE , создающая оператор, определяет некоторый набор параметров, команде EXECUTE должны быть переданы подходящие значения этих параметров; в противном случае возникнет ошибка. Заметьте, что подготовленные операторы (в отличие от функций) не перегружаются в зависимости от типа или числа параметров; имя подготовленного оператора должно быть уникальным в рамках текущего сеанса.

Чтобы узнать больше о создании и использовании подготовленных операторов, обратитесь к PREPARE .

Параметры

Имя подготовленного оператора, который будет выполнен. параметр

Фактическое значение параметра подготовленного оператора. Это может быть выражение, выдающее значение, совместимое с типом данных этого параметра, который был определён при создании подготовленного оператора.

Выводимая информация

Метка команды, возвращаемая EXECUTE , соответствует подготовленному оператору, а не оператору EXECUTE .

Примеры

Примеры приведены в разделе Примеры документации по оператору PREPARE .

Совместимость

В стандарте SQL есть оператор EXECUTE , но он предназначен только для применения во встраиваемом SQL. Эта версия оператора EXECUTE имеет также несколько другой синтаксис.

См. также

Пред. Наверх След.
END Начало EXPLAIN

Хранимая процедура sp_executesql (Transact-SQL)

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

Инструкции Transact-SQL, скомпилированные во время выполнения, могут предоставлять приложения вредоносным атакам.

Синтаксис

-- Syntax for SQL Server, Azure SQL Database, Azure Synapse Analytics, Parallel Data Warehouse sp_executesql [ @stmt = ] statement [ < , [ @params = ] N'@parameter_name data_type [ OUT | OUTPUT ][ . n ]' > < , [ @param1 = ] 'value1' [ . n ] >] 

Аргументы

[ @stmt= ] Заявление
Строка Юникода, содержащая инструкцию Transact-SQL или пакет. @stmt должен быть константой Юникода или переменной Юникода. Более сложные выражения Юникода, например объединение двух строк с помощью оператора +, недопустимы. Символьные константы недопустимы. Если указана константа Юникода, она должна быть префиксирована n . Например, допустима константа Юникода N’sp_who, но константа символа «sp_who» не является. Размер строки ограничивается только доступной серверу баз данных памятью. На 64-разрядных серверах размер строки ограничен 2 ГБ, максимальный размер nvarchar(max).

@stmt может содержать параметры с той же формой, что и имя переменной, например: N’SELECT * FROM HumanResources.Employee WHERE EmployeeID = @IDParameter’

Каждый параметр, включенный в @stmt, должен иметь соответствующую запись как в списке определений @params параметров, так и в списке значений параметров.

[ @params= ] N’@parameter_name data_type [ . n ] ‘
Одна строка, содержащая определения всех параметров, внедренных в @stmt. Строка должна быть либо константой Юникода, либо переменной Юникода. Определение каждого параметра состоит из имени параметра и типа данных. n — это заполнитель, указывающий дополнительные определения параметров. Каждый параметр, указанный в @stmt, должен быть определен в @params. Если инструкция Transact-SQL или пакет в @stmt не содержит параметров, @params не требуется. Этот аргумент по умолчанию принимает значение NULL.

[ @param1= ] «value1»
Значение для первого параметра, определенного в строке параметров. Это значение может быть константой или переменной в Юникоде. Для каждого параметра, включенного в @stmt, необходимо указать значение параметра. Значения не требуются, если инструкция Transact-SQL или пакет в @stmt не имеет параметров.

[ OUT | OUTPUT ]
Показывает, что параметр процедуры является выходным. Параметры текста, ntext и изображения можно использовать в качестве выходных параметров, если процедура не является процедурой clR. Выходным параметром с ключевым словом OUTPUT может быть заполнитель курсора, если процедура не является процедурой CLR.

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

Значения кода возврата

0 (успешное завершение) или ненулевое значение (неуспешное завершение)

Результирующие наборы

Возвращает результирующие наборы всех заданных инструкций SQL, встроенные в строку SQL.

Замечания

sp_executesql параметры должны быть введены в определенном порядке, как описано в разделе «Синтаксис» ранее в этом разделе. Если параметры вводятся не в этом порядке, будет выдано сообщение об ошибке.

Относительно пакетов инструкций, области имен и контекста базы данных процедура sp_executesql ведет себя аналогично инструкции EXECUTE. Инструкция Transact-SQL или пакет в параметре sp_executesql @stmt не компилируется до выполнения инструкции sp_executesql. Затем содержимое @stmt компилируется и выполняется как план выполнения отдельно от плана выполнения пакета, вызываемого sp_executesql. Пакет, содержащийся в процедуре sp_executesql, не может ссылаться на переменные, объявленные в пакете, вызвавшем sp_executesql. Локальные курсоры или переменные в пакете sp_executesql недоступны пакету, вызвавшему sp_executesql. Изменения в контексте базы данных длятся только до завершения выполнения инструкции sp_executesql.

sp_executesql можно использовать вместо хранимых процедур для выполнения инструкции Transact-SQL много раз, когда изменение значений параметров инструкции является единственным вариантом. Так как сама инструкция Transact-SQL остается константой и изменяется только значения параметров, оптимизатор запросов SQL Server, скорее всего, повторно использует план выполнения, который он создает для первого выполнения.

Для улучшения производительности используйте полные имена объектов в строке инструкции.

sp_executesql поддерживает параметр значений отдельно от строки Transact-SQL, как показано в следующем примере.

DECLARE @IntVariable INT; DECLARE @SQLString NVARCHAR(500); DECLARE @ParmDefinition NVARCHAR(500); /* Build the SQL string one time.*/ SET @SQLString = N'SELECT BusinessEntityID, NationalIDNumber, JobTitle, LoginID FROM AdventureWorks2022.HumanResources.Employee WHERE BusinessEntityID = @BusinessEntityID'; SET @ParmDefinition = N'@BusinessEntityID tinyint'; /* Execute the string with the first parameter value. */ SET @IntVariable = 197; EXECUTE sp_executesql @SQLString, @ParmDefinition, @BusinessEntityID = @IntVariable; /* Execute the same string with the second parameter value. */ SET @IntVariable = 109; EXECUTE sp_executesql @SQLString, @ParmDefinition, @BusinessEntityID = @IntVariable; 

Выходные параметры также могут быть использованы sp_executesql. В следующем примере извлекается название задания из HumanResources.Employee таблицы в AdventureWorks2022 примере базы данных и возвращается в выходном параметре @max_title .

DECLARE @IntVariable INT; DECLARE @SQLString NVARCHAR(500); DECLARE @ParmDefinition NVARCHAR(500); DECLARE @max_title VARCHAR(30); SET @IntVariable = 197; SET @SQLString = N'SELECT @max_titleOUT = max(JobTitle) FROM AdventureWorks2022.HumanResources.Employee WHERE BusinessEntityID = @level'; SET @ParmDefinition = N'@level TINYINT, @max_titleOUT VARCHAR(30) OUTPUT'; EXECUTE sp_executesql @SQLString, @ParmDefinition, @level = @IntVariable, @max_titleOUT=@max_title OUTPUT; SELECT @max_title; 

Возможность подставлять разные значения параметров в sp_executesql предоставляет следующие преимущества перед использованием инструкции EXECUTE.

  • Так как фактический текст инструкции Transact-SQL в строке sp_executesql не изменяется между выполнением, оптимизатор запросов, вероятно, соответствует инструкции Transact-SQL во втором выполнении с планом выполнения, созданным для первого выполнения. Поэтому SQL Server не должен компилировать вторую инструкцию.
  • Строка Transact-SQL создается только один раз.
  • Целочисленный параметр определен в собственном формате. Приведение к Юникоду не требуется.

Разрешения

Требуется членство в роли public.

Примеры

А. Выполнение простой инструкции SELECT

В следующем примере создается и выполняется простая инструкция SELECT , содержащая внедренный параметр с именем @level .

EXECUTE sp_executesql N'SELECT * FROM AdventureWorks2022.HumanResources.Employee WHERE BusinessEntityID = @level', N'@level TINYINT', @level = 109; 

B. Выполнение динамически построенной строки

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

CREATE TABLE May1998Sales (OrderID INT PRIMARY KEY, CustomerID INT NOT NULL, OrderDate DATETIME NULL CHECK (DATEPART(yy, OrderDate) = 1998), OrderMonth INT CHECK (OrderMonth = 5), DeliveryDate DATETIME NULL, CHECK (DATEPART(mm, OrderDate) = OrderMonth) ) 

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

Это простой пример использования процедуры sp_executesql. Пример не включает в себя проверку ошибок и бизнес-правил, которые, например гарантируют то, что номера заказов не будут дублироваться в разных таблицах.

CREATE PROCEDURE InsertSales @PrmOrderID INT, @PrmCustomerID INT, @PrmOrderDate DATETIME, @PrmDeliveryDate DATETIME AS DECLARE @InsertString NVARCHAR(500) DECLARE @OrderMonth INT -- Build the INSERT statement. SET @InsertString = 'INSERT INTO ' + /* Build the name of the table. */ SUBSTRING( DATENAME(mm, @PrmOrderDate), 1, 3) + CAST(DATEPART(yy, @PrmOrderDate) AS CHAR(4) ) + 'Sales' + /* Build a VALUES clause. */ ' VALUES (@InsOrderID, @InsCustID, @InsOrdDate,' + ' @InsOrdMonth, @InsDelDate)' /* Set the value to use for the order month because functions are not allowed in the sp_executesql parameter list. */ SET @OrderMonth = DATEPART(mm, @PrmOrderDate) EXEC sp_executesql @InsertString, N'@InsOrderID INT, @InsCustID INT, @InsOrdDate DATETIME, @InsOrdMonth INT, @InsDelDate DATETIME', @PrmOrderID, @PrmCustomerID, @PrmOrderDate, @OrderMonth, @PrmDeliveryDate GO 

Применение процедуры sp_executesql в этом случае более эффективно, чем использование инструкции EXECUTE для выполнения строки. При использовании процедуры sp_executesql формируется только 12 версий инструкции INSERT, по одной для таблицы каждого месяца. При использовании EXECUTE каждая инструкция INSERT должна быть уникальной, так как значения параметров будут различными. И хотя с помощью обоих методов будет создано одинаковое число пакетов, подобие инструкций INSERT, сформированных sp_executesql, увеличивает вероятность того, что оптимизатор запросов повторно использует планы выполнения.

C. Использование параметра OUTPUT

В следующем примере используется OUTPUT параметр для хранения результирующий набор, SELECT созданный инструкцией в параметре @SQLString . Затем выполняются две SELECT инструкции, использующие значение OUTPUT параметра.

USE AdventureWorks2022; GO DECLARE @SQLString NVARCHAR(500); DECLARE @ParmDefinition NVARCHAR(500); DECLARE @SalesOrderNumber NVARCHAR(25); DECLARE @IntVariable INT; SET @SQLString = N'SELECT @SalesOrderOUT = MAX(SalesOrderNumber) FROM Sales.SalesOrderHeader WHERE CustomerID = @CustomerID'; SET @ParmDefinition = N'@CustomerID INT, @SalesOrderOUT NVARCHAR(25) OUTPUT'; SET @IntVariable = 22276; EXECUTE sp_executesql @SQLString ,@ParmDefinition ,@CustomerID = @IntVariable ,@SalesOrderOUT = @SalesOrderNumber OUTPUT; -- This SELECT statement returns the value of the OUTPUT parameter. SELECT @SalesOrderNumber; -- This SELECT statement uses the value of the OUTPUT parameter in -- the WHERE clause. SELECT OrderDate, TotalDue FROM Sales.SalesOrderHeader WHERE SalesOrderNumber = @SalesOrderNumber; 

Примеры: Azure Synapse Analytics и система платформы аналитики (PDW)

D. Выполнение простой инструкции SELECT

В следующем примере создается и выполняется простая инструкция SELECT , содержащая внедренный параметр с именем @level .

-- Uses AdventureWorks2022 EXECUTE sp_executesql N'SELECT * FROM AdventureWorksPDW2012.dbo.DimEmployee WHERE EmployeeKey = @level', N'@level TINYINT', @level = 109; 

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

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