Ключевое слово, если не ожидается

#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. Спасибо, Чарльз. Я просто не мог видеть, какой синтаксис у меня был неправильным. Я ценю помощь!