При использовании подготовленного оператора вы можете использовать ?
в качестве маркера параметра везде, где вы можете использовать переменную хоста в статическом операторе.Из ваших четырех подготовленных утверждений первые 3 должны сработать, хотя третье не вернет то, что вы ожидаете, так как оно эквивалентно:
SELECT 'FLD02' FROM testpf WHERE fld01 = 3
Я ожидаю получить значение 'FLD02'
как результат, а не значение в столбце FLD02.Это связано с тем, что ?
является не маркером замены строки, а маркером поля параметра.Вы не можете использовать его для выбора столбца, но вы можете использовать его для предоставления значения для сравнения или константы для вывода.
Четвертый пример - допустимый SQL, но он эквивалентен:
SELECT 'FLD02' FROM testpf WHERE 'FLD01' = '4'
Это ничего не вернет, поскольку 'FLD01'
не равно '4'
.
Другим следствием этого является то, что ?
может использоваться для предоставления числового значения подготовленному оператору.Таким образом, вы можете сделать это:
dcl-s seqno Packed(5:0);
exec sql declare c2 cursor for s2;
stm = 'SELECT fld02 FROM testpf WHERE fld01 = ?';
exec sql prepare s2 from :stm;
seqno = 2;
exec sql open c2 using :seqno;
Также обратите внимание, что я удалил объявление курсора куда-то за пределами логического потока, так как объявление не является исполняемым оператором.Я вижу программы, в которых объявление находится в подпрограмме, которая вызывается перед отдельной подпрограммой, содержащей открытие для курсора.Это семантически неверно.Оператор DECLARE CURSOR
более правильно эквивалентен оператору RPGLE dcl-
.Но поскольку прекомпилятор SQL обрабатывает источник линейно, в основном без учета подпрограмм или подпроцессов, требуется, чтобы DECLARE CURSOR
был физически перед OPEN
в источнике.
Как правило, я хотел бы поместить свои объявления SQL в заголовок программы сразу после оператора SET OPTION
, который должен быть первым SQL, встроенным в программу.Это где я помещаю объявления, когда я использую подготовленные заявления.Я также объявляю имя заявления, хотя это не является строго необходимым.Однако для этого есть небольшая хитрость, которая существует при использовании статического SQL с локальными переменными хоста.Чтобы справиться с этим, я объявляю статические курсоры немного по-другому при использовании подпроцедур.Прекомпилятор SQL распознает, что в подпроцедурах используются переменные локальной области видимости, поэтому, если вы объявляете статический курсор с переменными хоста локальной области действия, переменные хоста и объявление курсора должны находиться в одной области видимости.Это означает, что я должен объявить свои статические курсоры в той же подпроцедуре, что и open.Я по-прежнему объявляю курсор вверх около операторов RPGLE dcl-
, чтобы сохранить объявления вместе.