【发布时间】:2021-04-29 21:36:07
【问题描述】:
我有一个存储过程,我需要将它从 Sybase SQL 更改为 DB2 SQL。以下代码适用于 Sybase SQL。
CREATE PROC TAS_TEST
(
@LOGIN_ID VARCHAR(20),
@NAME VARCHAR(100),
@C_NAME VARCHAR(100),
@USER VARCHAR(20),
@DEBUG BIT_FLAG=0
)
AS
BEGIN
DECLARE @TOKEN_EXPIRY_DATE DATETIME,
@TOKEN VARCHAR(36),
@ERR INT,
@ERROR_MSG VARCHAR(200)
SET @LOGIN_ID = LTRIM(RTRIM(@LOGIN_ID))
IF @LOGIN_ID IS NULL
BEGIN
RAISEERROR 20000 'LOGIN ID IS MUST:[%1!]',@LOGIN_ID
RETURN -1
END
IF @NAME IS NULL
BEGIN
RAISEERROR 20000 'NAME IS MUST:[%1!]',@NAME
RETURN -1
END
IF @C_NAME IS NULL
BEGIN
RAISEERROR 20000 'C_NAME IS MUST:[%1!]',@C_NAME
RETURN -1
END
IF @USER IS NULL
BEGIN
RAISEERROR 20000 'USER IS MUST:[%1!]',@USER
RETURN -1
END
SELECT
@TOKEN = TOKEN,
@TOKEN_EXPIRY_DATE = TOKEN_EXPIRY_DATE
FROM TOKEN_DETAILS
WHERE
LOGIN_ID = @LOGIN_ID and
NAME = @NAME and
C_NAME = @C_NAME
IF(@TOKEN IS NULL)
BEGIN
IF @DEBUG = 1 BEGIN
PRINT "No token exists"
END
SELECT @TOKEN = NEWID(1)
SELECT @TOKEN_EXPIRY_DATE = DATEADD(HOUR,12,GETUTCDATE())
INSERT INTO TOKEN_DETAILS(
LOGIN_ID,
TOKEN,
NAME,
C_NAME,
TOKEN_EXPIRY_DATE,
CREATED_DATE,
CREATED_BY
)VALUES(
@LOGIN_ID,
@TOKEN,
@NAME,
@C_NAME,
@TOKEN_EXPIRY_DATE,
GETUTCDATE(),
@USER
)
IF(@@ERROR !=0 )
BEGIN
SELECT @ERROR_MSG = CONVERT(CHAR(26),GETDATE(),109)+
" - Error while inserting - "+ CONVERT(VARCHAR,@@ERROR)
RAISEERROR 30000 @ERROR_MSG
RETURN -1
END
END
ELSE IF(@TOKEN_EXPIRY_DATE < GETUTCDATE())
BEGIN
IF @DEBUG = 1 BEGIN
PRINT "TOKEN EXPIRES"
END
SELECT @TOKEN = NEWID(1)
SELECT @TOKEN_EXPIRY_DATE = DATEADD(HOUR,12,GETUTCDATE())
UPDATE
TOKEN_DETAILS
SET
TOKEN = @TOKEN,
TOKEN_EXPIRY_DATE = @TOKEN_EXPIRY_DATE
WHERE
LOGIN_ID = @LOGIN_ID and
NAME = @NAME and
C_NAME = @C_NAME
IF(@@ERROR !=0 )
BEGIN
SELECT @ERROR_MSG = CONVERT(CHAR(26),GETDATE(),109)+
" - Error while UPDATING - "+ CONVERT(VARCHAR,@@ERROR)
RAISEERROR 30000 @ERROR_MSG
RETURN -1
END
END
ELSE IF @DEBUG = 1
BEGIN
PRINT "TOKEN EXIST"
END
SELECT @TOKEN AS 'TOKEN', @TOKEN_EXPIRY_DATE AS 'TOKEN_EXPIRY_DATE'
END
GO
GRANT EXECUTE TAS_TEST TO ADMIN
GO
这是我为上述 Sybase SQL 编写的转换后的 DB2 SQL。
CREATE OR REPLACE PROCEDURE TAS_TEST
(
LOGIN_ID VARCHAR(20),
NAME VARCHAR(100),
C_NAME VARCHAR(100),
USER VARCHAR(20),
DEBUG SMALLINT DEFAULT 0
)
LANGUAGE SQL
BEGIN
DECLARE TOKEN_EXPIRY_DATE TIMESTAMP;
DECLARE TOKEN VARCHAR(36);
DECLARE ERR INT;
DECLARE ERROR_MSG VARCHAR(200);
SET LOGIN_ID = TRIM(LOGIN_ID);
IF LOGIN_ID IS NULL THEN
SIGNAL SQLSTATE VALUE '20000'
SET MESSAGE_TEXT = 'LOGIN ID IS MUST:';
END IF;
IF NAME IS NULL THEN
SIGNAL SQLSTATE VALUE '20000'
SET MESSAGE_TEXT = 'NAME IS MUST:';
END IF;
IF C_NAME IS NULL THEN
SIGNAL SQLSTATE VALUE '20000'
SET MESSAGE_TEXT = 'C_NAME IS MUST:';
END IF;
IF USER IS NULL THEN
SIGNAL SQLSTATE VALUE '20000'
SET MESSAGE_TEXT = 'USER IS MUST:';
END IF;
SELECT
TOKEN = TOKEN,
TOKEN_EXPIRY_DATE = TOKEN_EXPIRY_DATE
FROM TOKEN_DETAILS
WHERE
LOGIN_ID = LOGIN_ID and
NAME = NAME and
C_NAME = C_NAME;
IF(TOKEN IS NULL) THEN
BEGIN
IF DEBUG = 1 THEN
PRINT 'No token exists';
END IF;
SELECT TOKEN = GENERATE_UNIQUE(1) FROM SYSIBM.SYSDUMMY1;
SELECT TOKEN_EXPIRY_DATE = TIMESTAMPADD(CURRENT_TIMESTAMP) FROM SYSIBM.SYSDUMMY1;
INSERT INTO TOKEN_DETAILS(
LOGIN_ID,
TOKEN,
NAME,
C_NAME,
TOKEN_EXPIRY_DATE,
CREATED_DATE,
CREATED_BY
)VALUES(
LOGIN_ID,
TOKEN,
NAME,
C_NAME,
TOKEN_EXPIRY_DATE,
CURRENT_TIMESTAMP,
USER
);
END;
END IF;
IF(TOKEN_EXPIRY_DATE < CURRENT_TIMESTAMP)
BEGIN
IF DEBUG = 1 THEN
PRINT "TOKEN EXPIRES, UPDATING";
END IF;
SELECT TOKEN = GENERATE_UNIQUE(1) FROM SYSIBM.SYSDUMMY1;
SELECT TOKEN_EXPIRY_DATE = TIMESTAMPADD(CURRENT_TIMESTAMP) FROM SYSIBM.SYSDUMMY1;
UPDATE
TOKEN_DETAILS
SET
TOKEN = TOKEN,
TOKEN_EXPIRY_DATE = TOKEN_EXPIRY_DATE
WHERE
LOGIN_ID = LOGIN_ID and
NAME = NAME and
C_NAME = C_NAME;
END;
END IF;
IF (DEBUG = 1) THEN
BEGIN
PRINT "TOKEN EXIST";
END;
END IF;
SELECT TOKEN, TOKEN_EXPIRY_DATE FROM SYSIBM.SYSDUMMY1;
END;
GRANT EXECUTE TAS_TEST TO ADMIN;
在运行上述 db2 查询时,出现此错误。
[42601][-104] 在“”之后发现了意外的标记“SELECT”。预期可能包括“END IF”.. SQL CODE =-104, SQLSTATE=42601, DRIVER=3.69.66
谁能帮我找出我做错的地方。会有很大帮助的。
【问题讨论】:
-
为什么要标记 SQL Server?
-
您的代码至少有 10 个错误会阻止编译。请指定您的 Db2-server PLATFORM(即 Z/OS、i 系列、Linux/Unix/Windows),并指定 Db2-server 的版本。
-
另外,您需要更改语句分隔符。您不能使用
;将您的 CREATE PROCEDURE 语句与后续语句 ibm.com/support/knowledgecenter/SSEPGG_11.5.0/… 分开 -
@mao - Db2 服务器平台 - LUW 和版本是 v10.1.0.6
-
@PaulVernon - 我使用 @ 作为分隔符。
标签: sql database db2 sybase db2-luw