4

テーブルを作成するプロシージャがあります。プロシージャを呼び出してテーブルから選択できるビュー (または類似のもの) を持つことは可能ですか?

私はこれを試しました:

DELIMITER $$

CREATE DEFINER=`root`@`localhost` FUNCTION `new_routine`(p1 INT) RETURNS int(1)
BEGIN
    CALL rMergeDateFields();
    RETURN 1;
END


CREATE VIEW `db`.`vIntervals` AS
  SELECT new_routine(0) AS col1;
  SELECT * FROM MergedData;

しかし、私はこのエラーが発生します

エラー 1422: 明示的または暗黙的なコミットは、ストアド関数またはトリガーでは許可されていません。

何か案は?

4

2 に答える 2

5

いいえ、あなたがすることはできません。通常、ビューは読み取り専用操作です。また、ストアド プロシージャが呼び出された場合、その動作は保証されません。

関連する質問:

ビューでストアド プロシージャを呼び出す方法は?

ビューでストアド プロシージャを呼び出すことは可能ですか?

正規のリソースは次のとおりです。

http://dev.mysql.com/doc/refman/5.1/en/view-updataability.html

一部のビューは更新可能です。つまり、UPDATE、DELETE、または INSERT などのステートメントでそれらを使用して、基になるテーブルの内容を更新できます。ビューを更新可能にするには、ビュー内の行と基になるテーブル内の行の間に 1 対 1 の関係がなければなりません。ビューを更新不可能にする他の特定の構造もあります。

ストアド プロシージャを呼び出すとビュー行との 1 対 1 の関係が保証されないため、更新は許可されません。

于 2013-01-25T15:30:58.140 に答える
1

ビューからこれを行うことはできませんが、ストアド プロシージャ自体は結果セットを返すことができます。

DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `merge_and_select` ()
BEGIN
    CALL rMergeDateFields();
    SELECT * FROM MergeData;
END $$

merge_and_select() を CALL すると、rMergeDateFields プロシージャが実行され、MergeData テーブルの内容が 1 ステップで返されます...これは、あなたが望んでいるように聞こえます。

ただし、me​​rge_and_select() への同時呼び出しを制御できないため、これは非常に悪い実装です。同時に複数回実行すると、あらゆる種類の問題が発生する可能性があります。

ただし、実際に rMergeDateFields() を実行する必要がある場合は、rMergeDateFields() を書き直して、必要な作業を実際に実行し、MergeData テーブルを使用せずにクライアントに直接返すことができます。その上。

INTO変数を使用せずにストアド プロシージャで SELECT したものはすべて、からの応答としてクライアントに返されますCALL

于 2013-01-26T20:11:47.577 に答える