【问题标题】:DB2 Store Procedure, What is a psm_pipeDB2 存储过程,什么是 psm 管道
【发布时间】:2018-10-30 14:03:18
【问题描述】:

为什么在线 DB2 文档的一致性如此之低?

我正在尝试创建一个返回 4 个值的 SP,它最初是一个带有“JOIN”和“UNIONS”等的时髦 SQL 语句,但最终可能是一个非常低效的 SP。它仍然不会编译..!

代码如下:

CREATE PROCEDURE Lex.LV_LogIn (
  -- Optional: input and output parameters
  --   { parameter-name } [IN | OUT | IN OUT] { data-type },
    IN LogIn VARCHAR(45),
    OUT RoleType BIGINT,
    OUT RoleDescription VARCHAR(45),
    OUT EmpName VARCHAR(45),
    OUT Granted BOOL
) 
LANGUAGE SQL
BEGIN 
    DECLARE empid BIGINT DEFAULT 0;
    DECLARE usrid BIGINT DEFAULT 0;
    SET RoleType = 0;
    SET RoleDescription = '';
    SET Granted = FALSE;

    SELECT "idCustEmployees", "idCustUserIds" INTO empid, usrid FROM LEX.CUSTUSERIDS WHERE "SourceType" = 'LexView' AND "LogIn" = LogIn;
    SELECT "idRoles" INTO RoleType FROM LEX.IDS2ROLES WHERE "idCustUserIds" = usrid;
    CASE
        WHEN RoleType > 0 THEN
            Granted = TRUE;
            SELECT "Description" INTO  RoleDescription FROM LEX.ROLES WHERE "idRoles" = RoleType;
            SELECT "FullName_C" INTO EmpName FROM LEX.CUSTEMPLOYEES WHERE "idCustEmployees" = empid;
        ELSE
            LEAVE;
    END CASE
END @
GRANT EXECUTE ON PROCEDURE TO USER xxxxxxxxxx;

我有一个又一个错误,这就是为什么我把它分解成这个疯狂的简单的东西,在我尝试 CASE 之前,我尝试了 IF(...)、IF(...)THEN 和 IF .. . 那么...

所有导致相同的错误:-> 应该是“psm_pipe”而不是“CASE......

问题 1:我在 SP 中做错了什么?

问题 2:什么是 psm_pipe,为什么 google db2 "psm_pipe" 没有出现?

各位有什么想法吗?

谢谢, 鲍勃 B.

【问题讨论】:

  • Granted = TRUE; --> SET Granted = TRUE;
  • END CASE --> END CASE;
  • LEAVE 语句只能在 FOR、LOOP、REPEAT 或 WHILE 循环中使用。

标签: stored-procedures db2


【解决方案1】:

您的代码片段有语法错误。下面的代码将在 11.1 或更高版本的 Db2 Linux/Unix/Windows 上编译。首字母缩写词 PSM 表示持久存储模块。

在寻求帮助时,请务必编写您的 Db2-server 版本和 Db2-server 操作系统(z/os、i 系列、linux/unix/windows),因为答案因平台和版本而异。

当您遇到语法错误时,请始终写出准确的错误编号(SQLCODE 和/或 SQLSTATE)以及消息,即 sqlcode/sqlstate 对搜索很重要。

CREATE PROCEDURE Lex.LV_LogIn (
    IN LogIn VARCHAR(45),
    OUT RoleType BIGINT,
    OUT RoleDescription VARCHAR(45),
    OUT EmpName VARCHAR(45),
    OUT Granted BOOLEAN
)
LANGUAGE SQL
specific lv_login
BEGIN
    DECLARE empid BIGINT DEFAULT 0;
    DECLARE usrid BIGINT DEFAULT 0;
    SET RoleType = 0;
    SET RoleDescription = '';
    SET Granted = FALSE;

    SELECT "idCustEmployees", "idCustUserIds"
    INTO empid, usrid
    FROM LEX.CUSTUSERIDS
    WHERE "SourceType" = 'LexView'
    AND "LogIn" = LogIn;

    SELECT "idRoles" INTO RoleType
    FROM LEX.IDS2ROLES
    WHERE "idCustUserIds" = usrid;

    IF RoleType > 0 THEN
        set Granted = TRUE;
        SELECT "Description"
        INTO  RoleDescription
        FROM LEX.ROLES
        WHERE "idRoles" = RoleType;

        SELECT "FullName_C"
        INTO EmpName
        FROM LEX.CUSTEMPLOYEES
        WHERE "idCustEmployees" = empid;
    END IF;
END @

【讨论】:

  • 完美工作 :) 谢谢毛,据我所知,关键区别在于“特定”关键字,这是默认要求的,因为我只在大约 50% 的 SP 示例中找到它..?
  • 完成 :) 对 psm_pipe 有任何想法吗?
  • 嗨不抱歉,我没有保留副本....有趣的是 psm_pipe 包含在 对中,但是当我尝试将其粘贴到消息中时,完整的对象消失了。 . 即使把它放在一个 ' ' 也没有帮助。
  • SPECIFIC 不是必需的。当您有多个具有相同名称但具有不同数量的输入参数或不同类型的输入参数的过程(或函数)时,它非常有用。它有帮助,例如当您想在这种情况下删除过程时,您不必列出所有参数来确定要删除的版本
  • 另外,如果您使用 IBM Data Studio,它会在您键入时进行语法检查,从而更容易发现语法错误
猜你喜欢
  • 1970-01-01
  • 2021-10-31
  • 1970-01-01
  • 2015-02-25
  • 2014-10-26
  • 2019-11-10
  • 2015-06-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多