使用Oracle过程进行版本控制

使用Oracle过程进行版本控制,oracle,stored-procedures,Oracle,Stored Procedures,我们必须为文档实施版本控制系统。每个文档都有一个标识符(DOCID)、一个主要版本号和一个次要版本号。所有这些都存储在一个表中 DOCID MAJOR MINOR 123 1 0 123 1 1 123 2 0 123 1 2 455 1 0 455 2 0 我们需要实现一个存储的proceudre,它将包含四个参数:我们是想要下一个主要版本还是次要版本(版本类型)、

我们必须为文档实施版本控制系统。每个文档都有一个标识符(DOCID)、一个主要版本号和一个次要版本号。所有这些都存储在一个表中

DOCID   MAJOR   MINOR
123     1       0
123     1       1
123     2       0
123     1       2
455     1       0
455     2       0
我们需要实现一个存储的proceudre,它将包含四个参数:我们是想要下一个主要版本还是次要版本(版本类型)、文档ID、当前主要版本和当前次要版本,并且必须给出下一个可用的版本号

例如,基于上表,如果我想要文档123的新主版本,我将得到3.0,如果我想要文档123的新次版本,当前主版本1和当前次版本2,我将得到1.2。 如果我想获取系统中不存在的新文档id的版本,它必须存储新文档id并返回主版本1和次版本0

我编写了以下存储过程,但当我尝试执行它时,它在最后一行给了我一个错误: 无法在REVIEW\u VERSIONS.DOCID中插入NULL

知道怎么了吗?非常感谢

CREATE OR REPLACE PROCEDURE GET_NEXT_VERSION 
(
  VERSION_TYPE IN VARCHAR2 
, DOC_ID IN VARCHAR2 
, CURRMAJOR IN NUMBER 
, CURRMINOR IN NUMBER
, NEXTMINOR OUT NUMBER
, NEXTMAJOR OUT NUMBER
) AS
BEGIN
  IF VERSION_TYPE = 'MAJOR' THEN
    NEXTMINOR := 0;
    SELECT MAX(MAJOR)+1 INTO NEXTMAJOR FROM REVIEW_VERSIONS WHERE DOCID= DOC_ID;
    IF NEXTMAJOR IS NULL THEN 
      NEXTMAJOR := 1;
    END IF;
  ELSE IF VERSION_TYPE = 'MINOR' THEN
    NEXTMAJOR := CURRMAJOR;
    SELECT MINOR+1 INTO NEXTMINOR FROM REVIEW_VERSIONS WHERE MAJOR = CURRMAJOR AND DOCID = DOC_ID AND MINOR = (SELECT MAX(MINOR) FROM REVIEW_VERSIONS WHERE MAJOR = CURRMAJOR AND DOCID = DOC_ID);
    IF NEXTMINOR IS NULL THEN 
      NEXTMAJOR := 1; 
      NEXTMINOR := 0;
    END IF;
  END IF;
  INSERT INTO REVIEW_VERSIONS (DOCID, MAJOR, MINOR) VALUES (DOC_ID, NEXTMAJOR, NEXTMINOR);
END GET_NEXT_VERSION;

最后看到的代码:当VERSION_TYPE='MINOR'时,您分配NEXTMAJOR:=CURRMAJOR,但从不检查CURRMAJOR是否为NULL


您可能希望在参数语句中定义默认值。

您的
ELSE IF
应该是
ELSIF
谢谢,但这似乎没有什么区别。它会检查您是否正确您是对的,它确实正确,现在当我尝试执行它时,它会抱怨参数的数量和类型(您如何执行它?单独的问题:(1)您需要使用
is null
not
=null
(2)
case
块必须有
else
子句,否则在执行case语句时将得到
ORA-06592:case not found。