【问题标题】:save stored procedure output into a table将存储过程输出保存到表中
【发布时间】:2014-01-08 20:17:24
【问题描述】:

我对存储过程只有执行权限。

这个SP似乎从多个表中选择了一些数据,并返回了一行。我需要将此 SP 的输出的两列存储到一个表中。

有没有办法在 MySQL 中做到这一点?

【问题讨论】:

  • 这是存储过程还是存储函数?存储过程返回输出参数而不是行。然而,存储函数可以返回行。
  • 不完全是。 “MySQL 支持一个非常有用的扩展,它允许在存储过程中使用常规 SELECT 语句(即,不使用游标或局部变量)。这种查询的结果集直接发送到客户端。” dev.mysql.com/doc/refman/5.6/en/stored-routines-syntax.html 另外,存储函数只能返回一个标量值。
  • 这绝对是一个存储过程,而不是一个函数。我只有执行权限,不能更改。

标签: mysql stored-procedures


【解决方案1】:

如果它返回一行,这是一个存储函数而不是存储过程。您可以使用以下内容插入表格:

INSERT INTO tablename SELECT (SELECT col1, col2 FROM (SELECT somefunction()))

否则,它将是一个存储过程,你应该这样做,假设@var1@var2是输出参数:

CALL someprocedure(@var1, @var2, @var3)
INSERT INTO tablename SELECT(@var1, @var2)

有关函数与过程的更多信息,请参阅有关 Create Procedure and Create Function 的文档。

【讨论】:

  • 它是一个存储过程,它没有任何输出参数。
【解决方案2】:

MySQL has an extension 到存储过程,允许过程返回一个或多个结果集给客户端,就好像客户端发出了一个 SELECT 查询......但这些结果是短暂的。它们不会持久存在,也不能存储在变量中或在过程完成后以其他方式访问——它们只能被“获取”一次。

有一种方法可以在不破坏程序已经工作的方式的情况下使它们可访问,正如我在这里讨论的那样,但是如果不更改程序就无法做到这一点:

How to use Table output from stored MYSQL Procedure

这个想法是让过程将其输出写入临时表,然后通过针对临时表调用SELECT 将其返回给调用者——但要留下临时表以便调用者可以访问它如果需要,可以直接使用。

这与您所问的并不完全相同,这就是为什么我没有将此问题标记为重复问题,因为与其他发帖人不同,您似乎对该程序没有管理控制权。 . 但除非你能做出这样的改变,否则 MySQL 中没有其他方法可以访问这些返回值,因为它们只存在于返回的结果集中。

当然,过程确实有可选的OUT 参数,您可以在其中将变量作为您用来调用它的参数的一部分传递给过程,并且它可以设置这些变量,以便它们具有您需要的值当过程完成时,但仅当返回值是标量并且需要更改过程的接口时才有效,因为 MySQL 中的 procs 没有“可选”参数......如果过程被更改为允许这样做,它每次调用它时都需要提供更多的参数,如果其他组件正在调用它,那很容易破坏其他东西。

【讨论】:

  • 不,我没有对此存储过程的管理员权限。我什至看不到它的定义。
  • 既然如此,就无法在服务器上捕获这些值……只能获取它们,然后在另一个查询中将它们发送回来。
  • 当你说“fetch”时,你的意思是在 perl 脚本(或其他调用 MySQL 的语言)中获取它们吗?
  • 是的,但是你现在得到了它们。在 perl 中,例如在 prepare() 和 execute() 之后 fetchrow_hashref() 或 fetchrow_arrayref()。
  • 是的,我想我必须在 perl 中完成。我只是想知道我是否可以在 MySQl 中完成这一切......无论如何,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-17
  • 2018-12-22
  • 2020-05-28
相关资源
最近更新 更多