过程调用中的in和out变量

时间:2013-10-22 08:51:45

标签: mysql stored-procedures

我正在使用存储过程调用,如下所示:

    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(参数)格式测试此过程调用?

2 个答案:

答案 0 :(得分:1)

正如CALL Syntax所述:

  

要使用OUTINOUT参数从过程中获取值,请通过用户变量传递参数,然后在过程返回后检查变量的值。 (如果从另一个存储过程或函数中调用该过程,还可以将例程参数或本地例程变量作为ININOUT参数传递。)对于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