Проверьте, существует ли таблица в System i, а затем удалите ее

Я пытаюсь написать оператор SQL, который проверит, существует ли таблица, и, если это так, удаляет ее в System i.

Я предполагал, что это будет просто IF EXISTS заявление, но у меня возникли проблемы с ним и не знаете, как поступить.

Утверждение в полном объеме:

IF EXISTS (SELECT TABLE_NAME FROM <<DatabaseName>>.VIEWS         
WHERE TABLE_NAME = 'TABLE')         
DROP VIEW <<DatabaseName>>.TABLE
GO

Возвращается с ошибкой

Ключевое слово ЕСЛИ не ожидается

Я - новичок в System i, но я читал о том, как это обойти?

1 ответ

Вы можете использовать оператор IF внутри хранимой процедуры, так что вы можете сделать это с помощью чего-то вроде:

CREATE PROCEDURE CREATE_TABLE (
    IN IN_TABLE_NAME VARCHAR(128), 
    IN IN_TABLE_SCHEMA VARCHAR(128),
    IN IN_TABLE_DEF VARCHAR(4000))

    LANGUAGE SQL MODIFIES SQL DATA

    DECLARE CNT INT DEFAULT 0;
    DECLARE STMT VARCHAR(1000);
    SELECT COUNT(*) INTO CNT
      FROM QSYS2/SYSTABLES
      WHERE TABLE_NAME = IN_TABLE_NAME and TABLE_SCHEMA = IN_TABLE_SCHEMA

    CASE CNT
        WHEN 1 THEN
            SET TABLE_NAME = 'CORPDATA.DEPT_' CONCAT P_DEPT CONCAT '_T';
            SET STMT = 'DROP TABLE ' || IN_TABLE_SCHEMA || '/' || IN_TABLE_NAME;
            PREPARE S1 FROM STMT;
            EXECUTE S1;
    END CASE

    SET STMT = 'CREATE TABLE ' || IN_TABLE_SCHEMA || '/' || IN_TABLE_NAME || 
                IN_TABLE_DEF;
    PREPARE S1 FROM STMT;
    EXECUTE S1;

Затем вы можете вызвать эту процедуру, передав имя таблицы, схему и определение столбца:

CALL CREATE_TABLE('MYTABLE', 'MYSCHEMA', '(
    COL1 INTEGER NOT NULL, 
    COL2 VARCHAR(100))';

Я на самом деле не проверял это, но это должно дать вам базовое представление о том, что вам нужно делать.

Другие вопросы по тегам