Вернуть значение автоинкремента в операторе Oracle SQL Insert? - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть оператор вставки, который должен возвращать значение столбца автоинкремента. Вот пример моей вставки:

myQuery = new query();
myQuery.name = "insertRec";
myQuery.setDatasource("db");
mySQL = "
    INSERT INTO myTable (
        First, Last, Email, ActionDate 
    )VALUES(
        :first, :last, :email, :actiondt
    )
";

myQuery.setSQL(mySQL);
myQuery.addParam(name="first", cfsqltype="cf_sql_varchar", value="#trim(form.first)#", maxlength="50");
myQuery.addParam(name="last", cfsqltype="cf_sql_varchar", value="#trim(form.last)#", maxlength="50");
myQuery.addParam(name="email", cfsqltype="cf_sql_varchar", value="#trim(form.email)#", maxlength="320");
myQuery.addParam(name="actiondt", cfsqltype="cf_sql_timestamp", value="#now()#");
myQuery.execute().getResult();
//result = myQuery.execute().getResult(); This line is commented because I was getting error message that test variable is not defined. Not sure why since test is declared and equals to myQuery.execute().getResult();

После запуска этого кода запись появится в таблице. Набор результатов выглядит так:

RecordID  First  Last       Email        ActionDt
   7      John   Woss   jwoss@gmail.com  16-NOV-18

Как видите, RecordID (автоинкремент) есть. Я хотел бы получить это значение после завершения myQuery. Как этого добиться?

1 Ответ

0 голосов
/ 16 ноября 2018

Как указано в https://stackoverflow.com/a/34894454/432681,, вы можете получить автоматически увеличенный идентификатор с помощью SELECT для связанной последовательности.

Итак, ваш запрос должен выглядеть примерно так:

mySQL = "
    INSERT INTO myTable (
        First, Last, Email, ActionDate 
    )VALUES(
        :first, :last, :email, :actiondt
    );
    SELECT "sequenceForMyTable".currval from dual;
";

Как получить имя последовательности также описано в связанном ответе выше.

Существует второй способ, описанный в https://stackoverflow.com/a/25268870/432681, а также , упомянутый в документации CFML , который говорит, что вы можете использовать функцию getPrefix(), чтобы иметь доступ к сгенерированному ключу.Обратите внимание, что в этом случае result - это объект, возвращаемый методом execute(), а не getResult() (поскольку запрос не возвращает набор результатов).Итак, для вашего примера вот как вы можете получить идентификатор:

result = myQuery.execute();
newID = result.getPrefix().generatedKey;
...