Oracle SEQUENCE.Currval проблема в CodeIgniter - PullRequest
0 голосов
/ 19 августа 2011

У меня есть последовательность с именем WCOMP_SEQ в оракуле, чтобы сгенерировать столбец автоматического приращения в таблице WCOMP.Когда я вставляю строку в таблицу WCOMP в SQLPlus, вставляемая строка и я могу получить значение автоинкремента, используя

SELECT WCOMP_SEQ.currval FROM dual

Но когда я запустил, вставьте строку с использованием класса базы данных в CodeIgniter, строка вставляется, но когдаЯ выполнил запрос выше, чтобы получить значение автоинкремента. Исключение:

Exception: Undefined Index currval in E:...

Как это исправить?

Ответы [ 3 ]

1 голос
/ 19 августа 2011

Чтобы получить currval для последовательности, вам потребуется хотя бы одна ссылка на соответствующий nextval для последовательности в текущем сеансе пользователя.Это то, что заставляет его устанавливать значение currval, которое будет принадлежать сеансу.

Если вы используете его снаружи, оно отрицает цель, какое значение оно может вернуть, если были другие сеансы активны.

1 голос
/ 19 августа 2011

Есть способ получить значение, автоматически назначаемое столбцу: это предложение 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 ВОЗВРАЩАЕМЫЙ sysntax?»Понятия не имею, но подозреваю, что нет.Большинство не-Oracle каркасов этого не делают.

Всегда есть возможность обернуть оператор INSERT в хранимую процедуру, но это архитектурное решение, которое многим не нравится.

1 голос
/ 19 августа 2011

Вы не можете получить текущее значение ПОСЛЕДОВАТЕЛЬНОСТИ без выдачи NEXTVAL ( см. Здесь ).Поэтому, если вы не хотите увеличивать значение последовательности (используя NEXTVAL), вам следует вместо этого запросить USER_SEQUENCES.

Что-то вроде этого:

select Sequence_Name
, Last_Number 
from user_sequences
where sequence_name = 'WCOMP_SEQ'
/
SEQUENCE_NAME   LAST_NUMBER
-------------   -----------  
WCOMP_SEQ                20

Надеюсь, это поможет.

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