Невозможно изменить таблицу (добавить уникальное ограничение) в процедуре хранения SQL PL для db2 - PullRequest
0 голосов
/ 30 сентября 2011

Я пытаюсь создать процедуру хранения в SQL PL для db2. Новое поле должно быть добавлено как часть уникального ключа, поэтому мне нужно сначала удалить предыдущий uk, а затем добавить новый уникальный ключ. Это прекрасно работало для MS SQLServer и Oracle, но я не могу сделать это для db2.

CREATE PROCEDURE update_unique_key ()
LANGUAGE SQL
BEGIN 
    DECLARE uk_constraint_name VARCHAR(50);
    DECLARE sql_stmt VARCHAR(100);  
    SELECT constname INTO uk_constraint_name FROM SYSCAT.TABCONST WHERE tabname = 'TABLE_NAME' AND type = 'U';
    SET sql_stmt = 'alter table TABLE_NAME drop constraint ' || char(uk_constraint_name);
    SET sql_stmt_2 = 'alter table TABLE_NAME add unique (F1, F2)';  

    prepare s1 from sql_stmt;
    prepare s2 from sql_stmt_2;

    EXECUTE IMMEDIATE s1;   
    EXECUTE IMMEDIATE s2;       
END

Получение этой ошибки при попытке развернуть подпрограмму с IBM Data Studio в качестве клиента (база данных db2 9.5)

    DEV.UPDATE_UNIQUE_KEY - Deploy started.
Create stored procedure returns SQLCODE: -206, SQLSTATE: 42703.
DEV.UPDATE_UNIQUE_KEY: 8: "SQL_STMT_2" is not valid in the context where it is used.. SQLCODE=-206, SQLSTATE=42703, DRIVER=4.12.55
"SQL_STMT_2" is not valid in the context where it is used.. SQLCODE=-206, SQLSTATE=42703, DRIVER=4.12.55

Вещь, которую я не понимаю:
- Если в процедуре я просто снимаю ограничение, оно работает.
- Я могу добавить ограничение, просто делая изменения таблицы из клиента SQL (белка)
- Если у меня есть обычная попытка добавить ограничение, я получаю ту же ошибку.

Я ценю любую помощь. Спасибо

1 Ответ

0 голосов
/ 23 октября 2011

Я просто забыл объявить переменную ... ОБЪЯВИТЬ sql_stmt_2 VARCHAR (100);

...