@likilix
Лицемер

Почему оператор update не работает?

CREATE OR REPLACE FUNCTION SALES.GetCertificateSeq( id in number ) 
  RETURN NUMBER AS PRAGMA autonomous_transaction;

  currentSequence NUMBER(10,0);
  
BEGIN
  currentSequence := 0;
 
  SELECT 
    max(vr.CERTIFICATE) INTO currentSequence
  FROM 
    VAGON_REGISTR vr
  WHERE 
    vr.ID = id;

  IF currentSequence is not null THEN
     return currentSequence;  
  END IF;
  
  currentSequence := CERTIFICATE_SEQ.NEXTVAL;

  UPDATE 
    VAGON_REGISTR vr 
  SET vr.CERTIFICATE = currentSequence WHERE vr.ID = id; 
  
  return currentSequence;

END;
  • Вопрос задан
  • 526 просмотров
Пригласить эксперта
Ответы на вопрос 2
@likilix Автор вопроса
Лицемер
Разобрался. Проблема была в id in number. Заменил id на curId
Ответ написан
Комментировать
@Oraclist
Я вам рекомендую переделать этот код.
В наличие пренебрежение некоторыми нормами разработки.
1.
id in number

СУБД дает вам возможность создавать имена переменных длинной до 32 символов. Так пользуйтесь этим. Придумайте нормальное имя, например, id_certificate.

2.
currentSequence NUMBER(10,0);
BEGIN
currentSequence := 0;
Я верю, что вам платят не за строчки кода. Такое надо объединять в
currentSequence NUMBER(10,0) := 0 ;


3. Поле с именем ID это зло. Когда сущностей в системе станет к 100. Вы будете путаться в этих ID как ребенок в буквах.

4.
currentSequence := 0;
SELECT
max(vr.CERTIFICATE) INTO currentSequence
FROM
VAGON_REGISTR vr
WHERE
vr.ID = id;

На этот код должен был ругнуться WARNING'ом компилятор. Типа, значение присваивается, но не используется и снова присваивается в команде выбора.

5. Команда выхода из блока return должна быть одна. Для ветвления алгоритмов есть If & Case etc.

6. Про commit (или rollback) уже писали выше.

7. И да, Oracle не знает camelcase'а GetCertificateSeq. Лучше делать так Get_Certificate_Seq
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы