1

作成した更新関数について質問があります...

CREATE OR REPLACE FUNCTION rm_category_update(icompany bpchar, iraw_mat_cat_code bpchar, iraw_mat_cat_desc bpchar)

RETURNS character AS

$BODY$

DECLARE
   loc_result    CHAR(50); 

BEGIN

UPDATE rm_category

 SET
    raw_mat_cat_code    = iraw_mat_cat_code,
    raw_mat_cat_desc    = iraw_mat_cat_desc

WHERE company = icompany;

loc_result = 'success';

RETURN loc_result ;

END;

$BODY$

LANGUAGE 'plpgsql' VOLATILE;

ALTER FUNCTION rm_category_update(icompany bpchar, iraw_mat_cat_code bpchar, iraw_mat_cat_desc bpchar) OWNER TO postgres;

さて、たとえば9のように存在しないレコードを入力すると、何も更新されていないことがわかっていても、成功が返されます。

存在しない行を更新している場合、SQLはエラーをスローしませんか?

ありがとう

4

2 に答える 2

1

"FOUND" を使用して、最後のステートメントが 1 つ以上の行に影響を与えたかどうかを検出できます。 Manualを参照してください。

例:

-- snippet
IF FOUND THEN
  loc_result = 'success';
ELSE
  loc_result = 'failed'; -- or something similiar...
END IF;
于 2008-11-19T08:17:53.747 に答える
0

それはDBMSに依存しますが、いいえ、エラーをスローするべきではありません。SQL標準(最近のISO / IEC 9075:2008)によると、SQLNOTFOUND条件(+100)を設定する必要があります。これは、エラー条件とは別のものです。(Informixでは、MODE ANSIデータベースを使用する場合はSQLNOTFOUNDを取得し、非ANSIデータベースを使用する場合は、条件として0(エラーなし)を取得します。その理由は、元のSQL-86標準よりも前のものです。 )。

SQLはセットベースの言語であることに注意してください。あなたが要求したのは、ステートメントが(一致する)行のセットを更新することでした-そして、ゼロ(一致する)行を含むセットを更新することは完全に有効です。

于 2008-11-19T07:42:13.570 に答える