甲骨文序列.CodeIgniter中的曲线问题



我在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的引用。这就是它设置属于会话的曲线值的原因。

如果你在外面使用它,它就违背了它的目的,如果有其他会话活动,它可以返回哪个值。

最新更新