Is there a way to use something like mssql's "case"? I have a table 
that holds hierarchy in nested sets and I tried to make procedure, 
which will add new node in hierarchy. Table looks something like this:
create table hierarchy
(
        id integer DEFAULT SERIAL(1),
        node varchar(16),
        left integer,
        right integer
)
I tried with several approaches but every time I call new procedure it 
falls in some kind of endless loop.
Mssql procedure looks like this:
CREATE PROCEDURE SP_INSERT_HIER_NODE 
        @PARENT_ID int, 
        @NAME nvarchar(16), 
AS

DECLARE 
        @PARENT_RIGHT AS int

SELECT 
        @PARENT_RIGHT = [RIGHT] 
FROM 
        HIERARCHY
WHERE 
        ID = @PARENT_ID;

UPDATE 
        HIER
SET 
        [LEFT] = CASE 
                        WHEN [LEFT] > @PARENT_RIGHT
                                THEN [LEFT] + 2
                        ELSE [LEFT] 
                END,
         [RIGHT] = CASE
                         WHEN [RIGHT] >= @PARENT_RIGHT
                                THEN [RIGHT] + 2
                        ELSE [RIGHT] 
                END
WHERE 
        [RIGHT] >= @PARENT_RIGHT;


INSERT INTO 
        HIERARCHY (NODE, [LEFT], [RIGHT])
VALUES
        (@NAME, @PARENT_RIGHT, @PARENT_RIGHT + 1);

GO

I tried with:
CREATE DBPROC SP_INSERT_HIER_NODE (
    IN NAME VARCHAR(16),
    IN PARENT INTEGER
)

AS

VAR LEFT_ INTEGER; RIGHT_ INTEGER; PARENT_LEFT INTEGER; PARENT_RIGHT 
INTEGER; TEMP_ID INTEGER; ROWCOUNT INTEGER;


SELECT
    "LEFT", "RIGHT"
FROM
    RBAC.HIERARCHY
WHERE
 HIERARCHY.ID = :PARENT;
FETCH INTO :PARENT_LEFT, :PARENT_RIGHT;

SELECT
    COUNT(*)
FROM
 RBAC.HIERARCHY 
WHERE
 HIERARCHY."RIGHT" >= :PARENT_RIGHT;
FETCH INTO :ROWCOUNT;


WHILE ROWCOUNT > 0 DO BEGIN

SELECT
    ID,"LEFT","RIGHT"
FROM
    RBAC.T_ROLE
WHERE
 HIERARCHY.RIGHT >= :PARENT_RIGHT;
FETCH INTO :TEMP_ID, :LEFT_, :RIGHT_;

IF
    LEFT_ > PARENT_RIGHT
THEN
    SET LEFT_ = LEFT_ + 2;
IF
    RIGHT_ >= PARENT_RIGHT
THEN
    SET RIGHT_ = RIGHT_ + 2;
        
UPDATE 
    RBAC. HIERARCHY 
SET
     "LEFT" = :LEFT_
WHERE
 HIERARCHY.ID = :TEMP_ID;
     
UPDATE 
    RBAC. HIERARCHY 
SET
     "RIGHT" = :RIGHT_
WHERE
 HIERARCHY.ID = :TEMP_ID;

SELECT
    COUNT(*)
FROM
    RBAC. HIERARCHY 
WHERE
 HIERARCHY."RIGHT" >= :PARENT_RIGHT;
FETCH INTO :ROWCOUNT;

END;

What is wrong there?

_______________________________________________
sapdb.general mailing list
[EMAIL PROTECTED]
http://listserv.sap.com/mailman/listinfo/sapdb.general

Reply via email to