• Главная
  • Карта сайта
Не найдено

EXECUTE STATEMENT [Словничок по FireBird]

  1. версії сервера
  2. доступно в
  3. Друга редакція синтаксису оператора
  4. опис
  5. Опис до другої редакції
  6. приклад
  7. Див. також

Оператор EXECUTE STATEMENT має дві редакції. Вперше оператор EXECUTE STATEMENT з'явився у версії 1.5.3, в наслідку в альфа релізі версії 2.5 синтаксис оператора був змінений з метою підтримки Cross-Database і параметризованих запитів таким чином, що синтаксис версії 1.5.3 є окремим випадком синтаксису версії 2.5.

версії сервера

Перша редакція синтаксису оператора

0.9 1.0 1.5.3 1.5.4 1.5.5 2.0 2.0.3 2.0.4 2.1 2.5 3.0 - - Так Так Так Так Так Так Так Окремий випадок Окремий випадок

Друга редакція синтаксису оператора

0.9 1.0 1.5.3 1.5.4 1.5.5 2.0 2.0.3 2.0.4 2.1 2.5 3.0 - - - - - - - - - Так Так

доступно в

Перша редакція синтаксису оператора

Значення <sql_statement_string> Рядок, що містить правильний SQL-запит, або це може бути <SQL_STMT_VARIABLE> змінна, значенням якої присвоюється правильний SQL-запит <VARIABLE_1> Змінна або змінні, перераховані через кому, куди необхідно повернути значення в разі селективного запиту. <Sql_operator> SQL-оператор, який необхідно виконувати в разі циклічного виконання селективного запиту. Оператор може бути як простий, так і складовою - що складається з декількох операторів, укладених в операторні дужки BEGIN ... END.

Друга редакція синтаксису оператора

Значення <sql_statement_string> Рядок, що містить правильний SQL-запит, або це може бути <SQL_STMT_VARIABLE> змінна, значенням якої присвоюється правильний SQL-запит. На відміну від першої редакції синтаксису оператора, у другій редакції синтаксису SQL-запит може містити параметри. <Input_parameters> Присвоєння значень параметрам в разі параметризованих SQL-запиту. <Connection_string> Рядок підключення до бази даних в форматі, використовуваному в API-функції сервера isc_attach_database (). AUTONOMOUS або COMMON Вказує, виконувати оператор в поточної або автономної транзакції. Якщо не заданий явно, виконання оператора відбувається в поточної транзакції. <User_name> Ім'я користувача, від імені якого буде виконаний SQL-оператор. Як значення можна передавати контекстну змінну CURRENT_USER . Якщо параметр не заданий явно, то використовується поточний користувач. <Password> Рядок або змінна, що містить пароль користувача, від імені якого буде виконаний SQL-оператор, для підключення до бази даних. Якщо не вказано параметр <user_name> або значення параметра <user_name> одно CURRENT_USER , То вказівка ​​пароля можна пропустити при виконанні оператора. <VARIABLE_1> Змінна або змінні, перераховані через кому, куди необхідно повернути значення в разі селективного запиту. <Sql_operator> SQL-оператор, який необхідно виконувати в разі циклічного виконання селективного запиту. Оператор може бути як простий, так і складовою - що складається з декількох операторів, укладених в операторні дужки BEGIN ... END.

опис

Опис до першої редакції

Опис до першої редакції синтаксису оператора відноситься і до другої на увазі вертикальної сумісності версій сервера.

Оператор дозволяє виконати правильний SQL-запит в PSQL-блоках , тригерах і процедурах .

SQL-запит повинен бути тривіальним або атомарним SQL-запит повинен бути тривіальним або атомарним. Тобто Ви не можете виконати кілька SQL-запитів, перерахувавши їх через роздільник в рамках одного оператора EXECUTE STATEMENT. Для того, щоб виконати кілька SQL-запитів, Вам необхідно викликати EXECUTE STATEMENT для кожного з них.

SQL-запит може бути:

  • DML-запитом, що містить оператори додавання, зміни або видалення записів з таблиць.

  • запитом, що зберігають вихідний код PSQL-блоку .

У першій редакції синтаксису оператора EXECUTE STATEMENT SQL-запит не може містити ніяких параметрів У першій редакції синтаксису оператора EXECUTE STATEMENT SQL-запит не може містити ніяких параметрів!

EXECUTE STATEMENT потенційно небезпечний: EXECUTE STATEMENT потенційно небезпечний:

  1. Чи не робиться ніякої перевірки запиту на виконання. Так само не може бути перевірений результат запиту і успішність його виконання.

  2. Не може бути виконана перевірка залежностей в разі виконання DML-оператора для гарантії того, що об'єкти, зазначені в рядку SQL операторів не видаляються з бази даних або не змінюються таким чином, який порушить функціонування вашого завдання. Наприклад, допускається виконання команди DROP TABLE для таблиці, яка використовується в відкомпільованих процедурах або тригерах, що спричинить за собою збій їх роботи.

  3. В основному операції з EXECUTE STATEMENT більш повільно так як не робиться підготовка (prepared) запиту і, соответствено, підготовка відбувається кожного разу при виконанні.

Це не означає що ви не повинні використовувати цю можливість, але використовуйте її тільки в тому випадку якщо інші варіанти неможливі.

Для полегшення пошуку багів в коді, або для їх виключення, які повертаються параметри жорстко перевіряються на відповідність оголошеним типам даних Для полегшення пошуку багів в коді, або для їх виключення, які повертаються параметри жорстко перевіряються на відповідність оголошеним типам даних. Це допомагає уникнути помилок, коли приведення типів може як викликати помилку, так і не викликати. Наприклад, рядок '1234' може бути сконвертовано в ціле число 1234, а рядок 'abc' в ціле число сконвертовано бути не може.

У першій редакції синтаксису оператора EXECUTE STATEMENT якщо PSQL-блок, збережена процедура або тригер, що викликає EXECUTE STATEMENT, має особливі права на об'єкт бази даних, то SQL-запит виконується в EXECUTE STATEMENT не матиме таких прав, а тільки права користувача під яким виконується ця процедура У першій редакції синтаксису оператора EXECUTE STATEMENT якщо PSQL-блок, збережена процедура або тригер, що викликає EXECUTE STATEMENT, має особливі права на об'єкт бази даних, то SQL-запит виконується в EXECUTE STATEMENT не матиме таких прав, а тільки права користувача під яким виконується ця процедура. (прім.переводчіка: у другій редакції синтаксису оператора дане обмеження зняте введенням розділу WITH CALLER PRIVILEGES)

Опис до другої редакції

В описі до другої редакції синтаксису оператора слід враховувати зауваження до першої редакції на увазі вертикальної сумісності версій сервера.

Порядок проходження наступних розділів оператора EXECUTE STATEMENT Порядок проходження наступних розділів оператора EXECUTE STATEMENT

....... [ON EXTERNAL [DATA SOURCE] <connection_string>] [WITH {AUTONOMOUS | COMMON} TRANSACTION] [AS USER <user_name> [PASSWORD <password>]] [WITH CALLER PRIVILEGES] .......

не є жорстким, тобто розділи можуть перераховуватися в довільному порядку. При цьому повторне використання розділів оператора в рамках одного оператора EXECUTE STATEMENT заборонено!

У другій редакції синтаксису оператора дозволено використовувати параметризовані запити при дотриманні наступних умов: У другій редакції синтаксису оператора дозволено використовувати параметризовані запити при дотриманні наступних умов:

1) Якщо ви бажаєте використовувати параметризованих запит, то Ви зобов'язані укласти рядок або змінну, що містить текст Вашого параметризованих запиту в круглі дужки. наприклад:

EXECUTE STATEMENT (: P_SQL_STMT) (P1: = 'abc', P2: =: MY_VARIABLE);

2) В параметризованих запитах підтримуються обидва типи параметрів: іменовані і безіменні. наприклад:

EXECUTE BLOCK AS DECLARE S VARCHAR (255); BEGIN - Іменовані параметри запиту S = 'INSERT INTO TTT VALUES (: A,: B,: A)'; EXECUTE STATEMENT (: S) (A: = CURRENT_TRANSACTION, B: = CURRENT_CONNECTION) - Безіменні параметри запиту S = 'INSERT INTO TTT VALUES (?,?)'; EXECUTE STATEMENT (: S) (CURRENT_TRANSACTION, CURRENT_CONNECTION) END

При цьому:

  • одночасне використання іменованих і безіменних параметрів в одному і тому ж запиті заборонено.

  • передача значень безіменним параметрам повинна відбуватися в тому ж порядку, в якому вони зустрічаються в тексті запиту.

  • присвоювання значень параметрів має здійснюватися за допомогою спеціального оператора «: =», аналогічного оператору присвоювання в мові Паскаль.

  • якщо при присвоєнні значення параметру передається вираз (наприклад, «P1: = GEN_ID (MY_GENERATOR, 1)» або «P1: =: I + 1»), то значення цього виразу обчислюється тільки один раз!

Розділ оператора ON EXTERNAL DATA SOURCE дозволяє виконувати cross-database запити, тобто  запити до інших баз даних з поточного підключення при дотриманні наступних умов: Розділ оператора ON EXTERNAL DATA SOURCE дозволяє виконувати cross-database запити, тобто запити до інших баз даних з поточного підключення при дотриманні наступних умов:

  • якщо при виклику оператора EXECUTE STATEMENT пропущений розділ ON EXTERNAL DATA SOURCE і пропущений розділ AS USER, то викликається SQL-оператор виконується в контексті поточного підключення і від імені поточного користувача.

  • якщо при виклику оператора EXECUTE STATEMENT пропущений розділ ON EXTERNAL DATA SOURCE, але при цьому присутній розділ AS USER і параметр дорівнює імені поточного користувача CURRENT_USER , То викликається SQL-оператор виконується в контексті поточного підключення і від імені поточного користувача.
  • якщо при виклику оператора EXECUTE STATEMENT пропущений розділ ON EXTERNAL DATA SOURCE, але при цьому присутній розділ AS USER і параметр не дорівнює імені поточного користувача CURRENT_USER , То викликається SQL-оператор виконається в контексті окремого підключення до поточної базі даних. Тобто для виконання SQL-оператора сервер створить окреме підключення до поточної базі даних. Дана особливість може бути корисна при необхідності виконання SQL-операторів від імені іншого користувача, аналогічно як використовується команда sudo командних оболонок операційних систем сімейства UNIX / LINUX / FreeBSD.
  • Параметр розділу ON EXTERNAL DATA SOURCE повинен бути в форматі, використовуваному в API-функції сервера isc_attach_database (), у вигляді: [[/]:]. Наприклад, «localhost: /mnt/sda1/bases/db.fdb», «192.168.0.1/3052:MAIN_CORPORATE_DATABASE», «D: \ DB \ MY_DATABASE.FDB».
  • У разі підключення до зовнішніх баз даних, нове підключення використовує ту ж кодування, що і у поточного підключення до бази даних. У деяких випадках ця поведінка сервера може служити джерелом помилок, якщо у Вас кодування символів, зазначених при створення баз даних , Відрізняються.

Розділ WITH {AUTONOMOUS |  COMMON} TRANSACTION дозволяє виконувати SQL-оператор, відповідно, в рамках автономної або поточної транзакції при дотриманні наступних умов: Розділ WITH {AUTONOMOUS | COMMON} TRANSACTION дозволяє виконувати SQL-оператор, відповідно, в рамках автономної або поточної транзакції при дотриманні наступних умов:

  • якщо оператор EXECUTE STATEMENT виконується в контексті автономної транзакції, то автономна транзакція буде примусово завершена при завершенні поточної транзакції.

  • якщо оператор EXECUTE STATEMENT виконується в контексті автономної транзакції, то автономна транзакція буде підтвердженням (commit) в разі успішного виконання SQL-запиту або буде скасована (rollback) в разі не успішного виконання SQL-запиту.

  • якщо оператор EXECUTE STATEMENT виконується в контексті автономної транзакції, то автономна транзакція стартує з тим же рівнем ізоляції даних, що і поточна, в контексті якої викликається оператор EXECUTE STATEMENT.

  • якщо розділ при виклику оператора EXECUTE STATEMENT пропущений, то оператор виконується в рамках поточної транзакції.

Розділ AS USER дозволяє задавати ім'я користувача, від імені якого буде виконаний SQL-запит Розділ AS USER дозволяє задавати ім'я користувача, від імені якого буде виконаний SQL-запит. Якщо розділ при виклику оператора EXECUTE STATEMENT пропущений, то буде використовуватися поточний користувач CURRENT_USER .

Розділ WITH CALLER PRIVILEGES можна використовувати в тому випадку, коли оператор EXECUTE STATEMENT виконується для поточного підключення до бази даних (розділ оператора ON EXTERNAL DATA SOURCE пропущений) Розділ WITH CALLER PRIVILEGES можна використовувати в тому випадку, коли оператор EXECUTE STATEMENT виконується для поточного підключення до бази даних (розділ оператора ON EXTERNAL DATA SOURCE пропущений). Він дозволяє виконати SQL-запит з привілеями доступу до даних викликає EXECUTE STATEMENT PSQL-блоку , збереженої процедури або тригера . (прім.переводчіка: нагадаємо, що в першій редакції синтаксису оператора EXECUTE STATEMENT SQL-запит цього оператора виконувався з привілеями користувача, від імені якого був запущений PSQL-блок, але при цьому не враховувалися привілеї самого PSQL-блоку, процедури, що або тригера. У деяких випадках це змушувало давати додаткові права користувачам на об'єкт бази даних, що ставило під загрозу безпеку).

приклад

1. Виконання простого, не- селективного запиту.

CREATE PROCEDURE DynamicSampleOne (Q_NAME VARCHAR (100)) AS DECLARE VARIABLE P_SQL_STMT VARCHAR (1024); DECLARE VARIABLE PAR INTEGER; BEGIN SELECT MIN (T1 .SOME_FIELD) FROM SOME_TABLE T1 INTO: PAR; P_SQL_STMT = 'EXECUTE PROCEDURE' || : Q_NAME || '(' || CAST (: PAR AS VARCHAR (20)) || ')'; EXECUTE STATEMENT: P_SQL_STMT; END

2. Виконання простого, селективного запиту, повертає одну запис.

CREATE PROCEDURE DynamicSampleTwo (Q_TABLE_NAME VARCHAR (100)) AS DECLARE VARIABLE PAR INTEGER; BEGIN EXECUTE STATEMENT 'SELECT MAX (T1.CHECKFIELD) FROM' || : Q_TABLE_NAME || 'T1' INTO: PAR; IF (: PAR> 100) THEN EXCEPTION EX_OVERFLOW 'Overflow in' || : Q_TABLE_NAME; END

3.Виполненіе селективного запиту, повертає набір даних

CREATE PROCEDURE DynamicSampleThree (Q_FIELD_NAME VARCHAR (100), Q_TABLE_NAME VARCHAR (100)) RETURNS (LINE VARCHAR (32000)) AS DECLARE VARIABLE P_ONE_LINE VARCHAR (100); BEGIN LINE = ''; FOR EXECUTE STATEMENT 'SELECT T1.' || : Q_FIELD_NAME || 'FROM' || : Q_TABLE_NAME || 'T1' INTO: P_ONE_LINE DO IF (: P_ONE_LINE IS NOT NULL) THEN LINE =: LINE || : P_ONE_LINE || ''; SUSPEND; END

4.Прімер роботи з метаданими.

Оновити статистику для всіх індексів в базі даних:

EXECUTE BLOCK AS DECLARE VARIABLE P_INDEX_NAME TYPE OF COLUMN RDB $ INDICES .RDB $ INDEX_NAME; BEGIN FOR SELECT I .RDB $ INDEX_NAME FROM RDB $ INDICES I WHERE (I. RDB $ SYSTEM_FLAG = 0) INTO: P_INDEX_NAME DO EXECUTE STATEMENT 'SET STATISTICS INDEX' || : P_INDEX_NAME; END

5.Прімер роботи з метаданими. Нехай є база даних, в якій існує наступні суворі правила створення об'єктів.

  • імена всіх таблиць починається на 'TABL $';
  • імена всіх таблиць -довідник починається на 'TABL $ R_';
  • імена всіх тригерів починається на 'TRIG $' і містить в кінці імені буквене позначення типу ({BEFORE | AFTER} {DELETE || INSERT || UPDATE}) тригера, наприклад: '_BI', '_BIU', '_ADIU', '_AD';
  • ім'я тригера , Наступне після службового позначення 'TRIG $' і перед позначенням його типу '_BI', '_BIU' збігається з ім'ям таблиці, до якої він належить, наступним за службовим позначенням 'TABL $'.

Потрібно: створити для всіх довідників тригери, що посилають події після вставки, зміни або видалення даних з таблиць-довідників. Текстом посилається повідомлення буде ім'я таблиці, в якій відбулася зміна.

EXECUTE BLOCK RETURNS (CNT INTEGER) AS DECLARE VARIABLE P_RELATION_NAME VARCHAR (32); DECLARE VARIABLE P_TRIGGER_NAME VARCHAR (32); DECLARE VARIABLE P_SQL BLOB SUB_TYPE 1; BEGIN CNT = 0; FOR SELECT R .RDB $ RELATION_NAME FROM RDB $ RELATIONS R WHERE (R. RDB $ VIEW_BLR IS NULL) - відсікаємо перегляди VIEW AND (R. RDB $ SYSTEM_FLAG = 0) - відсікаємо системні таблиці AND (R. RDB $ RELATION_NAME STARTING WITH 'TABL $ R_') - вибираємо тільки таблиці-довідники ORDER BY R .RDB $ RELATION_NAME - впорядкуємо за алфавітом INTO: P_RELATION_NAME DO BEGIN P_TRIGGER_NAME = SUBSTRING (: P_RELATION_NAME FROM 5); - прибираємо з імені таблиці початкові символи 'TABL' P_TRIGGER_NAME = 'TRIG' || : P_TRIGGER_NAME; - додаємо в початок 'TRIG' IF (CHAR_LENGTH (: P_TRIGGER_NAME)> 26) THEN - ім'я тригера не може бути більше 31-го символу, - а до поточного імені нам потрібно ще додати '_ADIU' P_TRIGGER_NAME = SUBSTRING (: P_TRIGGER_NAME FROM 1 FOR 26); - отже, "хвостові" символи відсікаємо P_SQL = - формуємо DDL оператор створення тригера 'CREATE OR ALTER TRIGGER' || : P_TRIGGER_NAME || '_ADIU FOR' || : P_RELATION_NAME || '' || ASCII_CHAR (13) || ASCII_CHAR (10) || 'ACTIVE AFTER INSERT OR UPDATE OR DELETE POSITION 255' || ASCII_CHAR (13) || ASCII_CHAR (10) || 'AS' || ASCII_CHAR (13) || ASCII_CHAR (10) || 'BEGIN' || ASCII_CHAR (13) || ASCII_CHAR (10) || 'POST_EVENT' '' || : P_RELATION_NAME || '' '; '|| ASCII_CHAR (13) || ASCII_CHAR (10) || 'END' || ASCII_CHAR (13) || ASCII_CHAR (10); EXECUTE STATEMENT: P_SQL WITH AUTONOMOUS TRANSACTION; - створюємо тригер CNT =: CNT + 1; END SUSPEND; END

Див. також

джерело

($ Firebird) /doc/sql.extensions/README.execute_statement.txt

($ Firebird) /doc/sql.extensions/README.execute_statement2.txt

execute_statement.txt · Останні зміни: 2013/06/18 15:27 - 80.252.147.23

Провайдеры:
  • 08.09.2015

    Batyevka.NET предоставляет услуги доступа к сети Интернет на территории Соломенского района г. Киева.Наша миссия —... 
    Читать полностью

  • 08.09.2015
    IPNET

    Компания IPNET — это крупнейший оператор и технологический лидер на рынке телекоммуникаций Киева. Мы предоставляем... 
    Читать полностью

  • 08.09.2015
    Boryspil.Net

    Интернет-провайдер «Boryspil.net» начал свою работу в 2008 году и на данный момент является одним из крупнейших поставщиков... 
    Читать полностью

  • 08.09.2015
    4OKNET

    Наша компания работает в сфере телекоммуникационных услуг, а именно — предоставлении доступа в сеть интернет.Уже... 
    Читать полностью

  • 08.09.2015
    Телегруп

    ДП «Телегруп-Украина» – IT-компания с 15-летним опытом работы на рынке телекоммуникационных услуг, а также официальный... 
    Читать полностью

  • 08.09.2015
    Софтлинк

    Высокая скоростьМы являемся участником Украинского центра обмена трафиком (UA — IX) с включением 10 Гбит / сек... 
    Читать полностью