我在mysql中编写了一个存储过程,并且正在使用out参数进行干预。当我在SP的定义中指定参数时,我在执行时遇到错误,说明有N + 1个参数,而只有N个参数可用。如果我提出out参数的任何值,那么我就没有结果。
如何传递参数?
选择值/列并处理应用层上的内容也是一个好习惯吗?
请建议。我是DB的新手(至少在编程方面很好)并且对这些概念不是很清楚。
提前感谢所有的时间和努力。
答案 0 :(得分:0)
我真的不明白你为什么使用out参数。你在编写一个函数吗?在这种情况下,没有out参数,只有return语句或一个过程,你不应该使用一个过程来修改和/或返回一个值?
对于你的第二个问题,这取决于你。如果你在你的基础内进行了很多治疗(使用存储过程和触发器),那么在应用程序方面你可以做的事情较少,但是你会有很多基础,有很长的超时时间。特别是对于像MySQL这样的DBMS,它不是那么强大,可悲的是...... 请记住,它总是取决于您的需求。但我建议您只选择基础内的值,并将所有处理应用于应用程序。在您的数据库中,只使用触发器(在需要时,并非总是如此)来检查数据和更新进程,但仍然记得,它会使您的数据库更重,查询更长。 还有一件事你必须先问自己:这个项目总会保持这样吗?请记住,MySQL存储过程,Oracle SP,PostGres SP,...并不总是兼容。
(抱歉我的英语很差,我是法国人)
答案 1 :(得分:0)
OUT
参数和"结果"存储过程是两个无关的事情。
如果您希望存储过程将一个或多个结果集返回给客户端,您只需在过程正文中使用SELECT
语句,并在SELECT
中使用SELECT NOW() AS the_current_time; -- do this inside the stored procedure
,无论它是&#39 ; sa变量,或字符串或数字文字,返回给客户端。
OUT
这将返回从系统时钟到调用存储过程的客户端的当前时间,作为"列"叫" the_current_time" ...
DELIMITER $$
CREATE PROCEDURE get_the_time (OUT foo DATETIME)
BEGIN
SET foo = NOW();
END $$
DELIMITER ;
参数声明过程中的变量,当程序结束时,其值被重新设置为在调用过程时在该位置使用的变量。
CALL get_the_time(@bar);
...然后,使用用户定义的变量调用该过程。
SELECT @bar;
随后,您将在变量" foo"中找到过程中存在的值。已被赋值给变量@bar。
IN
要捕获输出参数值,您必须在调用过程时使用变量填充占位符,这就是您收到N + 1错误的原因...您没有填充占位符。
OUT
,INOUT
和IN
变量之间的区别是:
IN
变量,如果从用户定义的变量或存储的程序变量传入(从另一个存储的程序调用一个存储过程时),则不会修改原始值。对于OUT
参数,您还可以使用文字作为参数。
INOUT
变量将过程中变量的最后一个值返回到调用过程时该位置槽中使用的变量。在程序内部,变量的前一个值不可用。
OUT
变量传入一个值,内部变量的最终值被设置回外部变量。
由于INOUT
和IN
可以更改用于调用过程的变量的值,因此在调用过程时,您无法在这些插槽中使用文字,因为很明显,文字的价值永远不能在程序的主体内修改。
如果未指定OUT
,INOUT
或IN
,则会假定{{1}}。