2010-09-07 69 views
2

我是PL/SQL的新手,我需要插入语句后在数据表中插入最后一个id。Oracle中的SELECT IDENT_CURRENT('tablename')

像MS SQL SELECT IDENT_CURRENT( '表名')

+0

在SQL Server中,想要插入的行的ID应该使用'scope_identity'。 'ident_current'返回所有会话和所有范围内的最后一个身份值。因此,您可能会在另一个会话中获得插入值。 http://msdn.microsoft.com/en-us/library/ms175098.aspx – 2010-09-07 22:10:41

回答

4

没有内置在Oracle中自动增量领域,创建它使用序列:

CREATE TABLE some_tab(
     rec_id  INTEGER, 
     some_data VARCHAR2(300) 
); 

CREATE SEQUENCE some_tab_seq; 

CREATE OR REPLACE TRIGGER trig_BI 
    BEFORE INSERT 
    ON some_tab 
    FOR EACH ROW 
BEGIN 
    IF :NEW.rec_id IS NULL 
    THEN 
     :NEW.rec_id := some_tab_seq.NEXTVAL ; 
    END IF; 
END; 

然后在PL/SQL,你可以通过

your_var := some_tab_seq.CURRVAL

此外,在旧版本的Oracle的读取序列的当前值,你不能直接读取NEXTVAL/CURRVAL我n要var和必须做的:

SELECT some_tab_seq.CURRVAL 
    INTO your_var 
    FROM DUAL; 
+3

CURRVAL仅适用于我们之前从会话序列中选择了NEXTVAL的情况。 – APC 2010-09-07 10:28:15

+0

typo:rec_id <> id_rec – 2010-09-07 11:55:50

+0

您也可以查看select_sequence_name,last_number from user_sequences,但并发性和缓存(特别是在RAC上)使这不精确。 – 2010-09-07 23:26:28

8

您可以使用返回的条款:

insert into mytable(x,y) values (1,2) returning id into v_id; 

这种运作良好,当有填充ID列触发,所以你不需要“从双“事物中选择seq.currval。

2

Oracle不实现标识列。它使用序列生成唯一的数字,可以在任何表格中用作PK值。

因此,IDENT_CURRENT('my_table')表达式最好转换为给表格PK的序列的MySequence.CURRVAL。

通常情况下,你会找回在MS SQL插入的PK值:

INSERT INTO MyTable ... 
SELECT @PK = SCOPE_IDENTITY() 

在Oracle中,使用INSERT RETURNING子句,如果你要实现类似的功能

DECLARE PK ...; 
INSERT INTO MyTable 
RETURNING TableID INTO PK;