Динамические инструкции SQLDynamic SQL

Несмотря на то, что статический SQL работает также во многих ситуациях, имеется класс приложений, в которых доступ к данным не удается определить заранее.Although static SQL works well in many situations, there is a class of applications in which the data access cannot be determined in advance. Например предположим, что электронную таблицу позволяет пользователю ввести запрос, который электронную таблицу отправляет СУБД для получения данных.For example, suppose a spreadsheet allows a user to enter a query, which the spreadsheet then sends to the DBMS to retrieve data. Содержимое этого запроса очевидно, что не может быть известен программист при записи в электронную.The contents of this query obviously cannot be known to the programmer when the spreadsheet program is written.

Чтобы решить эту проблему, электронной таблицы используется форма embedded SQL, под названием динамического SQL.To solve this problem, the spreadsheet uses a form of embedded SQL called dynamic SQL. В отличие от статическими инструкциями SQL, которые жестко закодированы в программе, можно создать во время выполнения динамических инструкций SQL и поместить в строковой переменной узла.Unlike static SQL statements, which are hard-coded in the program, dynamic SQL statements can be built at run time and placed in a string host variable. Затем они отправляются для СУБД для обработки.They are then sent to the DBMS for processing. Поскольку СУБД необходимо создать план доступа во время выполнения для динамических инструкций SQL, динамического SQL обычно медленнее, чем статического SQL.Because the DBMS must generate an access plan at run time for dynamic SQL statements, dynamic SQL is generally slower than static SQL. При компиляции программы, содержащей динамические инструкции SQL, динамических инструкций SQL не удаляются из программы, как и статического SQL.When a program containing dynamic SQL statements is compiled, the dynamic SQL statements are not stripped from the program, as in static SQL. Вместо этого они заменяются вызов функции, которая передает инструкцию для СУБД; обычно обрабатываются статическими инструкциями SQL в одной программе.Instead, they are replaced by a function call that passes the statement to the DBMS; static SQL statements in the same program are treated normally.

Самый простой способ выполнения динамической инструкции SQL — с помощью инструкции НЕМЕДЛЕННОЕ выполнение.The simplest way to execute a dynamic SQL statement is with an EXECUTE IMMEDIATE statement. Эта инструкция передает СУБД для компиляции и выполнения инструкции SQL.This statement passes the SQL statement to the DBMS for compilation and execution.

Одним из недостатков НЕМЕДЛЕННОЕ выполнение инструкции является то, что СУБД должен проходить через каждый из пяти шагов обработки инструкции SQL каждый раз при выполнении инструкции.One disadvantage of the EXECUTE IMMEDIATE statement is that the DBMS must go through each of the five steps of processing an SQL statement each time the statement is executed. Накладные расходы на этот процесс может быть значительно, если многие операторы выполняются динамически, и слишком затратно, если эти операторы похожи.The overhead involved in this process can be significant if many statements are executed dynamically, and it is wasteful if those statements are similar. Чтобы решить эту проблему, динамического SQL предоставляет оптимизированной формой выполнением, которые называются подготовленное выполнение, который выполняет указанные ниже действия:To address this situation, dynamic SQL offers an optimized form of execution called prepared execution, which uses the following steps:

  1. Программа создает инструкцию SQL в буфере, так же, как для НЕМЕДЛЕННОГО ВЫПОЛНЕНИЯ инструкции.The program constructs an SQL statement in a buffer, just as it does for the EXECUTE IMMEDIATE statement. Вместо хост-переменных знак вопроса (?) может быть заменен для константы в любом месте текста инструкции, чтобы указать, что значение для константы предоставляемого позже.Instead of host variables, a question mark (?) can be substituted for a constant anywhere in the statement text to indicate that a value for the constant will be supplied later. Вопросительный знак вызывается как маркер параметра.The question mark is called as a parameter marker.

  2. Программа передает инструкции SQL в СУБД с помощью инструкции PREPARE, какие запросы, что СУБД синтаксический анализ, проверка и оптимизировать инструкцию и создание выполнения планирование.The program passes the SQL statement to the DBMS with a PREPARE statement, which requests that the DBMS parse, validate, and optimize the statement and generate an execution plan for it. Затем программа использует инструкцию EXECUTE (не ВЫПОЛНЯТЬ НЕМЕДЛЕННОЕ инструкции) для выполнения инструкции PREPARE позже.The program then uses an EXECUTE statement (not an EXECUTE IMMEDIATE statement) to execute the PREPARE statement at a later time. Он передает значения параметров для инструкции через специальную структуру данных называется SQLDA или области данных SQL.It passes parameter values for the statement through a special data structure called the SQL Data Area or SQLDA.

  3. Программа может использовать инструкцию EXECUTE, указав различными значениями параметров, каждый раз при выполнении динамической инструкции.The program can use the EXECUTE statement repeatedly, supplying different parameter values each time the dynamic statement is executed.

    Подготовленное выполнение по-прежнему не является таким же, как статического SQL.Prepared execution is still not the same as static SQL. Статический SQL первые четыре шага обработки инструкции SQL выполняются во время компиляции.In static SQL, the first four steps of processing an SQL statement take place at compile time. В подготовленное выполнение эти действия по-прежнему выполняются во время выполнения, но они выполняются только один раз; выполнение плана происходит только в том случае, когда вызывается EXECUTE.In prepared execution, these steps still take place at run time, but they are performed only once; execution of the plan takes place only when EXECUTE is called. Это позволяет исключить некоторые недостатки производительности неотъемлемой частью архитектуры динамического SQL.This helps eliminate some of the performance disadvantages inherent in the architecture of dynamic SQL. Следующий рисунок показывает различия между статическим SQL, динамического SQL и немедленное выполнение и динамического SQL с помощью подготовленного выполнения.The next illustration shows the differences between static SQL, dynamic SQL with immediate execution, and dynamic SQL with prepared execution.