#sql #ibm-midrange #rowcount
#sql #ibm -средний уровень #количество строк
Вопрос:
У меня есть следующий встроенный SQL-код, работающий на AS400. ЕСЛИ появляется как неожиданный, но я не понимаю, почему. Что я пытаюсь сделать, так это создать хранимую процедуру для обновления или вставки строки таблицы. Приведенный ниже код является встроенным, чтобы убедиться, что моя логика верна.
Я пробовал несколько разных подходов, включая, ЕСЛИ СУЩЕСТВУЕТ, РЕГИСТР, SET @COUNT = SELECT COUNT(*) . Я продолжаю сталкиваться с нечетными ошибками.
В коде, показанном ниже, я терплю неудачу, когда нажимаю оператор IF.
CREATE OR REPLACE VARIABLE IN_LOC CHAR(02);
CREATE OR REPLACE VARIABLE IN_MCO CHAR(02);
CREATE OR REPLACE VARIABLE IN_SYMBOL CHAR(03);
CREATE OR REPLACE VARIABLE IN_POLICYNUM CHAR(07);
CREATE OR REPLACE VARIABLE IN_MODULE CHAR(02);
CREATE OR REPLACE VARIABLE IN_RISKLOC CHAR(05);
CREATE OR REPLACE VARIABLE IN_PRCCLASS VARCHAR(05);
CREATE OR REPLACE VARIABLE IN_PRCTER VARCHAR(03);
CREATE OR REPLACE VARIABLE IN_MESSAGE CHAR(02);
SET IN_LOC='00';
SET IN_MCO='01';
SET IN_SYMBOL='CPP';
SET IN_POLICYNUM='0003748';
SET IN_MODULE='00';
SET IN_RISKLOC='00003';
SET IN_PRCCLASS='09';
SET IN_PRCTER='1';
SET IN_MESSAGE='NOT FOUND FOR ODD PROGRAMMING';
UPDATE BASPPRC01
SET PRCCLASS=IN_PRCCLASS,PRCTER=IN_PRCTER,MESSAGE=IN_MESSAGE
WHERE CAST(IN_LOC||IN_MCO||IN_SYMBOL||IN_POLICYNUM||IN_MODULE||IN_RISKLOC AS CHAR(21))
= CAST(LOCATION||MASTERCO||SYMBOL||POLICYNUM||MODULE||RISKLOC AS CHAR(21)) ;
IF @@ROWCOUNT = 0
BEGIN
INSERT INTO BASPPRC01
(LOCATION,MASTERCO,SYMBOL,POLICYNUM,MODULE,RISKLOC,PRCCLASS,PRCTER,MESSAGE)
VALUES
(IN_LOC
, IN_MCO
, IN_SYMBOL
, IN_POLICYNUM
, IN_MODULE
, IN_RISKLOC
, IN_PRCCLASS
, IN_PRCTER
, IN_MESSAGE ) ;
END
COMMIT TRANSACTION ;
Комментарии:
1. встроенный в что? Код, который вы показываете, не является ни допустимым
CREATE PROCEDURE
, ни допустимым составным оператором в Access Client Solutions (ACS) «Запускать сценарии SQL». Наконец, вам следует рассмотреть возможность выполнения такого «Upsert» сMERGE
помощью инструкции …. предполагая, что вы на самом деле используете современную систему электропитания под управлением IBM i, а не AS / 400.2. Да, мы используем современную систему электропитания под управлением IBM i, а не фактический AS / 400. Да, это недопустимое CREATE . Это опция запуска сценариев SQL для выполнения интерактивного кода SQL. Почему СЛИЯНИЕ? Существует много вариантов СЛИЯНИЯ. В этом случае я не рассматривал оператор СЛИЯНИЯ как наиболее вероятный. Проблема, однако, заключается в том, почему код завершается ошибкой в операторе IF? Это «должно» быть в порядке, чтобы перейти к этому утверждению. Но код помечен как неожиданный.
Ответ №1:
Вы должны показать полученную ошибку…
со следующим:
CREATE OR REPLACE PROCEDURE myproc ()
LANGUAGE SQL
BEGIN
UPDATE BASPPRC01
SET PRCCLASS=IN_PRCCLASS,PRCTER=IN_PRCTER,MESSAGE=IN_MESSAGE
WHERE CAST(IN_LOC||IN_MCO||IN_SYMBOL||IN_POLICYNUM||IN_MODULE||IN_RISKLOC AS CHAR(21))
= CAST(LOCATION||MASTERCO||SYMBOL||POLICYNUM||MODULE||RISKLOC AS CHAR(21)) ;
IF @@ROWCOUNT = 0
BEGIN
INSERT INTO BASPPRC01
(LOCATION,MASTERCO,SYMBOL,POLICYNUM,MODULE,RISKLOC,PRCCLASS,PRCTER,MESSAGE)
VALUES
(IN_LOC
, IN_MCO
, IN_SYMBOL
, IN_POLICYNUM
, IN_MODULE
, IN_RISKLOC
, IN_PRCCLASS
, IN_PRCTER
, IN_MESSAGE ) ;
END
COMMIT TRANSACTION ;
END;
Я получаю [SQL0199] Keyword BEGIN not expected. Valid tokens: THEN.
При этом выполняется проверка синтаксиса, обратите внимание THEN
и END IF
вместо BEGIN
также, COMMIT
вместо COMMIT TRANSACTION
CREATE OR REPLACE PROCEDURE procedure2 ()
LANGUAGE SQL
BEGIN
UPDATE BASPPRC01
SET PRCCLASS=IN_PRCCLASS,PRCTER=IN_PRCTER,MESSAGE=IN_MESSAGE
WHERE CAST(IN_LOC||IN_MCO||IN_SYMBOL||IN_POLICYNUM||IN_MODULE||IN_RISKLOC AS CHAR(21))
= CAST(LOCATION||MASTERCO||SYMBOL||POLICYNUM||MODULE||RISKLOC AS CHAR(21)) ;
IF @@ROWCOUNT = 0 THEN
INSERT INTO BASPPRC01
(LOCATION,MASTERCO,SYMBOL,POLICYNUM,MODULE,RISKLOC,PRCCLASS,PRCTER,MESSAGE)
VALUES
(IN_LOC
, IN_MCO
, IN_SYMBOL
, IN_POLICYNUM
, IN_MODULE
, IN_RISKLOC
, IN_PRCCLASS
, IN_PRCTER
, IN_MESSAGE ) ;
END IF;
COMMIT;
END;
Комментарии:
1. Спасибо, Чарльз. Я просто не мог видеть, какой синтаксис у меня был неправильным. Я ценю помощь!