从视图中调用存储过程

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:存储函数或触发器中不允许显式或隐式提交。

有什么想法吗?

2个回答

5
不可以。视图通常是只读操作,如果调用存储过程,则无法保证其行为。

相关问题:

如何在视图中调用存储过程?

是否可能在视图中调用存储过程?

以下是一个规范资源:

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

一些视图是可更新的。也就是说,您可以在UPDATE、DELETE或INSERT等语句中使用它们来更新底层表的内容。为了使视图可更新,视图中的行与底层表中的行之间必须存在一对一的关系。还有一些其他结构使视图不可更新。
由于调用存储过程不能保证视图行与底层表之间的1:1关系,因此不允许进行更新。

2

你不能从视图中执行此操作,但存储过程本身可以返回结果集。

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(),直接使用无界选择(如上所示)执行你需要完成的任何工作,并将其直接返回给客户端,而不使用 MergeData 表。
在存储过程中选择的任何内容,如果没有使用 INTO 变量,则会作为 CALL 的响应直接返回给客户端。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接