我正在使用存储过程调用,如下所示:
DELIMITER //
CREATE procedure getCustomer(NID varchar(200),Name varchar(200), OUT Flag INTEGER, OUT CID VARCHAR(200))
BEGIN
DECLARE id varchar(200);
SET Flag = 0;
SET id = CONCAT(NID, '_' , Name);
SELECT 1 INTO Flag FROM Customer WHERE customerID = id;
IF Flag = 1 THEN
SET CID = id;
ELSE
INSERT INTO Customer(NID, Name, customerID) VALUES(NID, Name, id);
SET CID = id;
END IF;
END//
你可以告诉我如何调用IN,OUT变量来测试这个程序调用吗?
或者只是如何使用exec proceudre_name(参数)格式测试此过程调用?
答案 0 :(得分:1)
正如CALL
Syntax所述:
要使用
OUT
或INOUT
参数从过程中获取值,请通过用户变量传递参数,然后在过程返回后检查变量的值。 (如果从另一个存储过程或函数中调用该过程,还可以将例程参数或本地例程变量作为IN
或INOUT
参数传递。)对于INOUT
参数,在将其传递给过程之前初始化其值。以下过程具有过程设置为当前服务器版本的OUT
参数,以及过程从其当前值开始递增的INOUT
值:CREATE PROCEDURE p (OUT ver_param VARCHAR(25), INOUT incr_param INT) BEGIN # Set value of OUT parameter SELECT VERSION() INTO ver_param; # Increment value of INOUT parameter SET incr_param = incr_param + 1; END;
在调用过程之前,初始化要作为
INOUT
参数传递的变量。调用该过程后,将设置或修改两个变量的值:mysql> SET @increment = 10; mysql> CALL p(@version, @increment); mysql> SELECT @version, @increment;
+--------------+------------+ | @version | @increment | +--------------+------------+ | 5.5.3-m3-log | 11 | +--------------+------------+
但是,根据您的程序,您真正想要的是在customerID
表中的Customer
列上定义唯一性约束,然后使用INSERT ... ON DUPLICATE KEY UPDATE
:
ALTER TABLE Customer ADD UNIQUE (customerID);
INSERT INTO Customer
(NID, Name, customerID)
VALUES
(123, 'foobar', CONCAT(123, '_', 'foobar'))
ON DUPLICATE KEY UPDATE
NID = NID
;
答案 1 :(得分:0)
使用IN的示例:
DELIMITER //
CREATE PROCEDURE `procWithIN` (IN var1 INT)
BEGIN
UPDATE someTable set fldname = fldname + var1;
END//
CALL procWithIN(10);
使用OUT的示例:
DELIMITER //
CREATE PROCEDURE `procWithOUT` (OUT var1 VARCHAR(100))
BEGIN
SET var1 = 'This is a test';
END //
SET @someText = NULL;
CALL procWithOut(@someText);
-- do something with @someText (containing 'This is a test')
SELECT * FROM tbl WHERE fld=@someText
INOUT
示例DELIMITER //
CREATE PROCEDURE `procWithINOUT` (INOUT var1 INT)
BEGIN
SET var1 = var1 + 100;
END //
SET @someInt = 10;
CALL procWithINOUT(@someInt);
-- @someInt now contains 110