PREPARE <refpurpose>prepare a statement for execution</refpurpose> — 実行のためにSQL文をプリペアします。
PREPAREprepared_name
FROMstring
<command>PREPARE</command> prepares a statement dynamically
specified as a string for execution. This is different from the
direct SQL statement <xref linkend="sql-prepare"/>, which can also
be used in embedded programs. The <xref linkend="sql-execute"/>
command is used to execute either kind of prepared statement.
PREPARE
は実行用に文字列として動的に指定されたSQL文をプリペアします。
これは、埋め込みプログラム内でも使用することができる、直接的なPREPARE SQL文とは異なります。
EXECUTEコマンドを使用して、どちらの種類のプリペアド文を実行することができます。
prepared_name
#An identifier for the prepared query. プリペアド問い合わせ用の識別子です。
string
#
A literal string or a host variable containing a preparable
SQL statement, one of SELECT, INSERT, UPDATE, or DELETE.
Use question marks (<literal>?</literal>) for parameter values
to be supplied at execution.
リテラル文字列、または、プリペア可能なSQL文であるSELECT/INSERT/UPDATE/DELETEの1つを含むホスト変数、のいずれかです。
実行時に提供されるパラメータ値には疑問符(?
)を使ってください。
In typical usage, the <replaceable>string</replaceable> is a host
variable reference to a string containing a dynamically-constructed
SQL statement. The case of a literal string is not very useful;
you might as well just write a direct SQL <command>PREPARE</command>
statement.
典型的な使い方では、string
は動的に構成されたSQL文を含む文字列へのホスト変数参照です。
リテラル文字列の場合はあまり有用ではありません。単に直接SQL PREPARE
文を書くこともできるからです。
If you do use a literal string, keep in mind that any double quotes
you might wish to include in the SQL statement must be written as
octal escapes (<literal>\042</literal>) not the usual C
idiom <literal>\"</literal>. This is because the string is inside
an <literal>EXEC SQL</literal> section, so the ECPG lexer parses it
according to SQL rules not C rules. Any embedded backslashes will
later be handled according to C rules; but <literal>\"</literal>
causes an immediate syntax error because it is seen as ending the
literal.
どうしてもリテラル文字列を使う場合には、SQL文に含める二重引用符は、通常のCのイディオムである\"
ではなく、8進エスケープ(\042
)として書かなければならないことを心に留めておいてください。
これは文字列がEXEC SQL
内にあるからで、そのためECPG字句解析器はCの規則ではなくSQLの規則に従って解析します。
埋め込まれたバックスラッシュは後でCの規則に従って扱われます。ですが、\"
はリテラルの終了とみなされますので、すぐに文法エラーを引き起こします。
char *stmt = "SELECT * FROM test1 WHERE a = ? AND b = ?"; EXEC SQL ALLOCATE DESCRIPTOR outdesc; EXEC SQL PREPARE foo FROM :stmt; EXEC SQL EXECUTE foo USING SQL DESCRIPTOR indesc INTO SQL DESCRIPTOR outdesc;
<command>PREPARE</command> is specified in the SQL standard.
PREPARE
は標準SQLで規定されています。