首页 > 解决方案 > 我如何在我的 PostgreSQL 数据库中调用另一个过程

问题描述

我在 PostgreSQL 中有一个数据库,我想创建一个过程,在该过程中我将向表中添加一个新人,但只能添加一个具有特权状态(类型为VARCHAR)的人等于 'ADMIN' 或'所有者'。

这就是为什么我的想法是创建过程addUser和另一个addPrivilegeToUser我将调用的过程addUser。不幸的是它不能正常工作,我收到错误消息

错误:“CALL”处或附近的语法错误。

这是一些代码:

CREATE PROCEDURE addUser(loginUserToAdd VARCHAR(30), 
loginUser VARCHAR(30), accessTypeT VARCHAR(20))
LANGUAGE SQL
AS $$
 INSERT INTO privilege(userId, storageId, accessType) 
 VALUES((SELECT userID
        FROM userTable                                                               
        WHERE(login = loginUserToAdd)), 

        (SELECT storageId                                                                                    
         FROM privilege                                                                                    
         WHERE userId = (SELECT userId                                                                     
                         FROM userTable                                                                                                     
                         WHERE login = loginUser)), accessTypeT);
$$;


CREATE PROCEDURE addUserToStorage(loginUserToAdd VARCHAR(30), 
loginUser VARCHAR(30), accessTypeT VARCHAR(20))
LANGUAGE sql
AS $$
BEGIN
SELECT privilege.accessType, usertable.login, CASE privilege.accessType 
    WHEN ('OWNER' OR 'ADMIN')
     THEN
        CALL addUser(loginUserToAdd, loginUser, accessTypeT)
     END
 FROM privilege
 INNER JOIN userTable ON privilege.userId = usertable.userId
 WHERE (userTable.login = loginUser);
  END
$$;

标签: sqlpostgresql

解决方案


我还补充说,我尝试只创建一个带有IF如下语句的过程,并且在“IF”处或附近出现错误:语法错误。

CREATE PROCEDURE addUserToStorage1(loginUserToAdd VARCHAR(30), loginUser VARCHAR(30), accessTypeT VARCHAR(20))
LANGUAGE plpgsql
AS $$
IF EXISTS(SELECT privilege.accessType, usertable.login
          FROM privilege
          INNER JOIN userTable ON privilege.userId = usertable.userId
          WHERE ((usertable.login = loginUser) AND (privilege.accessType = 'OWNER' 
                    OR privilege.accessType = 'ADMIN')))

    THEN
        INSERT INTO privilege(userId, storageId, accessType) 
     VALUES(loginUserToAdd, (SELECT storageId                                                                                    
                             FROM privilege                                                                                     
                             WHERE userId = (SELECT userId                                                                                                     
                                             FROM userTable                                                                                                     
                                             WHERE login = loginUser)), accessTypeT);
    END IF;

$$;

推荐阅读