我在oracle中有一个名为WCOMP_SEQ的序列,用于在WCOMP表上生成自动增量列。当我在SQLPlus中向WCOMP表插入一行时,插入的行和我可以使用
获得自动增量值SELECT WCOMP_SEQ.currval FROM dual
但是当我在CodeIgniter中使用数据库类插入一行时,插入的行,但是当我运行上面的查询以获得自动增量值时,我得到了异常:
Exception: Undefined Index currval in E:...
如何解决这个问题?
有一种方法可以自动将值分配给列:它是RETURNING子句。
这是我的序列:SQL> select emp_seq.currval from dual
2 /
CURRVAL
----------
8140
SQL>
我将在INSERT语句中使用它:
SQL> var seqval number
SQL> insert into emp
2 (empno, ename, deptno, sal, job)
3 values
4 (emp_seq.nextval, 'JELLEMA', 50, 4575, 'PAINTER')
5 returning empno into :seqval
6 /
1 row created.
SQL>
我将EMPNO返回到我可以打印的SQL*Plus变量中,它具有与CURRVAL相同的值:
SQL> print :seqval
SEQVAL
----------
8141
SQL> select emp_seq.currval from dual
2 /
CURRVAL
----------
8141
SQL>
你的下一个问题是,"CodeIgniter支持RETURNING系统税吗?"我不知道,但我怀疑它不是。大多数非oracle框架没有。
总是可以选择将INSERT语句包装在存储过程中,但这是许多人不喜欢的架构决策。
如果不发出NEXTVAL,则无法获取SEQUENCE当前值(参见此处)。因此,如果您不想增加序列值(通过使用NEXTVAL),您应该改为查询USER_SEQUENCES
。
像这样:
select Sequence_Name
, Last_Number
from user_sequences
where sequence_name = 'WCOMP_SEQ'
/
SEQUENCE_NAME LAST_NUMBER
------------- -----------
WCOMP_SEQ 20
为了获得序列上的currval,您需要在当前用户会话中至少有一个对序列相应nextval的引用。这就是它设置属于会话的曲线值的原因。
如果你在外面使用它,它就违背了它的目的,如果有其他会话活动,它可以返回哪个值。