Oracle: Как мне получить порядковый номер только что вставленной строки? - PullRequest
22 голосов
/ 12 декабря 2008

Как получить порядковый номер только что вставленной строки?

Ответы [ 3 ]

29 голосов
/ 12 декабря 2008

вставить ... возвращение.

declare
   s2 number;
 begin
   insert into seqtest2(x) values ('aaa') returning seq into s2;
   dbms_output.put_line(s2);
 end;

Здесь «seq» относится к имени столбца, значение которого вы хотите сохранить в переменной s2.

в питоне:

myseq=curs.var(cx_Oracle.NUMBER)
curs.prepare("insert into seqtest2(x) values('bbb') returning seq into :x")
curs.execute(None, x=myseq)
print int(myseq.getvalue())
9 голосов
/ 12 декабря 2008

Редактировать: , как отметил Марк Харрисон, это предполагает, что у вас есть контроль над тем, как создается идентификатор вашей вставленной записи. Если у вас есть полный контроль и ответственность за это, это должно работать ...


Используйте хранимую процедуру, чтобы выполнить вставку и вернуть идентификатор.

например: для таблицы имен с идентификаторами:

PROCEDURE insert_name(new_name    IN   names.name%TYPE, 
                      new_name_id OUT  names.id%TYPE)
IS
    new_id names.id%TYPE;
BEGIN
    SELECT names_sequence.nextVal INTO new_id FROM dual;
    INSERT INTO names(id, name) VALUES(new_id, new_name);
    new_name_id := new_id;
END;

Использование хранимых процедур для операций CRUD - хорошая идея, независимо от того, используете ли вы слой ORM, так как это делает ваш код более независимым от базы данных, помогает против атак внедрения и т. Д.

6 голосов
/ 30 марта 2012

Мой ответ в C #, учитывая, что таблица "testtable" имеет столбец "ID", так как PK с последовательностью автоинкенации, а поле "testname" является полем varchar.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Oracle.DataAccess.Client;
using System.Data;

namespace ConsoleApplication3
{
class Program
{

    public static void Main(string[] args)
    {

        OracleConnection cn = new OracleConnection("your connection string here");


        string sql = "INSERT INTO testtable(testname) VALUES('testing2') RETURNING id INTO :LASTID";
        OracleParameter lastId = new OracleParameter(":LASTID", OracleDbType.Int32);

        lastId.Direction = ParameterDirection.Output;

        using (OracleCommand cmd = new OracleCommand(sql, cn))
        {
            cn.Open();
            cmd.Parameters.Add(lastId);
            cmd.ExecuteNonQuery();
            Console.WriteLine("Last ID: " + lastId.Value.ToString());
            cn.Close();
        }
        Console.WriteLine();
        Console.ReadKey(false);


    }
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...