Процедура хранения DB2, что такое psm_pipe - PullRequest
0 голосов
/ 30 октября 2018

Почему в документации по DB2 так мало согласованности в сети?

Я пытаюсь создать SP, который возвращает 4 значения, он начинался как забавный SQL-оператор с «JOIN's» и «UNIONS» и т. Д., Но в конечном итоге оказался очень неэффективным 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 .. . ТО ...

Все приводит к одной и той же ошибке: -> вместо "CASE ......" ожидалось "psm_pipe" ......

Вопрос 1: Что я сделал не так в SP?

Вопрос 2: Что такое psm_pipe и почему он не появляется, если вы используете db2 "psm_pipe" в google? *

Есть идеи, ребята?

Спасибо, Боб Б.

1 Ответ

0 голосов
/ 30 октября 2018

Ваш фрагмент кода имеет синтаксические ошибки. Код ниже будет скомпилирован на Db2 Linux / Unix / Windows версии 11.1 или выше. PSM аббревиатура означает постоянный хранимый модуль.

При обращении за помощью всегда пишите свою версию Db2-сервера и операционную систему Db2-сервера (z / os, i-series, 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 @
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...