2

Windows用のdb2 9.7.6フルエディションを使用しています。SQL選択式で使用できる関数を開発する必要があります。関数には、SQL データの変更と実行時例外の処理が含まれている必要があります。2 つのバリアントがありますが、これまでのバリアントですべての要件を実装するという問題があります。最初のバリアントは、SQL テーブル関数の実装です。

 CREATE FUNCTION func1 (val CHAR(20))
    RETURNS table(result varchar(1000))
    LANGUAGE SQL
    MODIFIES SQL DATA
   BEGIN atomic
    insert into a values(val);
        return (select result from a);
    END 

動作しますが、SQL プロシージャで例外処理を実装できません。ブロック「declare exit handler」を使用しようとすると、構文エラーが発生しました。2 番目のバリアントは、pl/sql 関数の実装です。

CREATE OR REPLACE FUNCTION bb
RETURN varchar2
MODIFIES SQL DATA
AS
BEGIN
    insert into st values ('a');
    return 0;
END bb;

しかし、この関数を実行しようとすると、「SQLCODE=-740、SQLSTATE=51034 が MODIFIES SQL DATA オプションで定義されています。これは、ルーチンが呼び出されるコンテキストでは無効です」というエラーが発生しました。お願い助けて。よろしく、ターキン・アンドリュー。

4

2 に答える 2

1

インライン化された SQL コンパウンドとコンパイルされたコンパウンドの間には多くの違いがあります。次のスクリプトを作成しましたが、LUW の db2 10.1 で問題なく動作します。

スクリプト.sql

CREATE or replace FUNCTION func1a (val CHAR(20))
RETURNS varchar(20)
LANGUAGE SQL
READS SQL DATA
BEGIN
declare ret varchar(20);
declare exit handler for sqlstate '02000' resignal sqlstate '08888';
select C1 into ret from T1 fetch first 1 row only;
return ret;
END@

CREATE or replace FUNCTION func1b (val CHAR(20))
RETURNS table(result varchar(20))
LANGUAGE SQL
MODIFIES SQL DATA
BEGIN atomic
insert into T1 values(val);
return (select C1 from T1);
END@

実行(Windowsクライアントでも構いません)

db2 CREATE TABLE T1 (C1 CHAR(20))
db2 -td@ -vf Script.sql
db2 "values func1a('s')"
db2 "SELECT * FROM TABLE (FUNC1b('A'))"

ご覧のとおり、DB2 10.1 には、インライン化された SQL とコンパイルされた SQL について多くの違いがあります。 - 単一の値の戻り値とテーブルまたは行の戻り値。- 読み取りと変更されたデータ。- 条件ハンドラー vs なし。

関数定義により、呼び出し方法が異なります。ある場合はスカラー値で、もう 1 つは関数テーブルです。

于 2012-10-21T06:07:28.797 に答える
0

うまくいきません。

最大アクセスレベルのリスト

Routine type    Default SQL access level    Maximum allowed SQL access level
SQL procedures  MODIFIES SQL DATA   MODIFIES SQL DATA
SQL functions (scalar functions)    READS SQL DATA  READS SQL DATA
SQL functions (table functions)     READS SQL DATA  MODIFIES SQL DATA
External procedures     MODIFIES SQL DATA   MODIFIES SQL DATA
External functions (scalar functions)   READS SQL DATA  READS SQL DATA
External functions (table functions)    READS SQL DATA  READS SQL DATA

スカラー関数の場合、最大レベルは「READS SQL DATA」です。おそらくそれを回避する方法があるので、コーディングを再考する必要があります。

于 2012-10-22T09:31:40.203 に答える