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-updatability.html

一些视图是可更新的。也就是说,您可以在 UPDATE、DELETE 或 INSERT 等语句中使用它们来更新基础表的内容。要使视图可更新,视图中的行与基础表中的行之间必须存在一对一的关系。还有某些其他构造使视图不可更新。

由于调用存储过程不能保证与视图行的 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() rMergeDateFields 过程将运行,然后您将在一个步骤中将 MergeData 表的内容返回给您......这听起来像是您想要的。

然而,这是一个非常糟糕的实现,因为无法控制对 merge_and_select() 的并发调用,因此如果同时运行多次,各种事情都可能出错。

但是,根据您真正需要 rMergeDateFields() 执行的操作,您可以重写 rMergeDateFields() 以实际执行您需要完成的任何工作并将其直接返回给客户端,而无需使用无界 SELECT 使用 MergeData 表,如图所示以上。

您在存储过程中选择而不使用INTO变量的任何内容都将作为来自CALL.

于 2013-01-26T20:11:47.577 回答