0

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

    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(parameter) 格式测试这个过程调用?

4

2 回答 2

1

CALL语法中所述:

OUT要使用or参数从过程中取回值INOUT,请通过用户变量传递参数,然后在过程返回后检查变量的值。(如果您从另一个存储过程或函数中调用该过程,您还可以将例程参数或局部例程变量作为ININOUT参数传递。)对于INOUT参数,在将其传递给过程之前初始化其值。以下过程有一个OUT参数,该过程设置为当前服务器版本,以及一个INOUT该过程从其当前值递增 1 的值:

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;
+---------------+------------+
| @版本 | @增量 |
+---------------+------------+
| 5.5.3-m3-日志 | 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
;
于 2013-10-22T08:57:34.460 回答
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
于 2013-10-22T09:00:26.390 回答