我是PL/SQL的新手,我需要插入语句后在数据表中插入最后一个id。Oracle中的SELECT IDENT_CURRENT('tablename')
像MS SQL SELECT IDENT_CURRENT( '表名')
我是PL/SQL的新手,我需要插入语句后在数据表中插入最后一个id。Oracle中的SELECT IDENT_CURRENT('tablename')
像MS SQL SELECT IDENT_CURRENT( '表名')
没有内置在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;
CURRVAL仅适用于我们之前从会话序列中选择了NEXTVAL的情况。 – APC 2010-09-07 10:28:15
typo:rec_id <> id_rec – 2010-09-07 11:55:50
您也可以查看select_sequence_name,last_number from user_sequences,但并发性和缓存(特别是在RAC上)使这不精确。 – 2010-09-07 23:26:28
您可以使用返回的条款:
insert into mytable(x,y) values (1,2) returning id into v_id;
这种运作良好,当有填充ID列触发,所以你不需要“从双“事物中选择seq.currval。
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;
在SQL Server中,想要插入的行的ID应该使用'scope_identity'。 'ident_current'返回所有会话和所有范围内的最后一个身份值。因此,您可能会在另一个会话中获得插入值。 http://msdn.microsoft.com/en-us/library/ms175098.aspx – 2010-09-07 22:10:41