0

SQL PL for 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 クライアント (Squirrel) からテーブルを変更するだけで制約を追加できます
- 制約を追加しようとしているルーチンだけがある場合、同じエラーが発生します。

助けていただければ幸いです。ありがとう

4

1 に答える 1

0

変数を宣言するのを忘れました...DECLAREsql_stmt_2 VARCHAR(100);

于 2011-10-22T23:00:56.527 に答える