Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何将以下存储过程转换为准备好的语句?_Mysql_Stored Procedures_Prepared Statement_Sql Function - Fatal编程技术网

Mysql 如何将以下存储过程转换为准备好的语句?

Mysql 如何将以下存储过程转换为准备好的语句?,mysql,stored-procedures,prepared-statement,sql-function,Mysql,Stored Procedures,Prepared Statement,Sql Function,以下存储过程仅接受显式写出实整数的参数。例如:调用test11(46) 我希望重新编写,以便它可以接受类似于以下内容的内容: SELECT *, CALL test11(vendor_id) FROM vendors; 或 我理解第一个/前一个是没有意义的,因为可以实现IF语句而不必求助于存储过程。但我发现了解后者非常重要 存储过程语法: DELIMITER // CREATE PROCEDURE test11(IN vendor_id_var INT) BEGIN DECLARE s

以下存储过程仅接受显式写出实整数的参数。例如:
调用test11(46)

我希望重新编写,以便它可以接受类似于以下内容的内容:

SELECT *, CALL test11(vendor_id) FROM vendors;

我理解第一个/前一个是没有意义的,因为可以实现IF语句而不必求助于存储过程。但我发现了解后者非常重要

存储过程语法:

DELIMITER //
CREATE PROCEDURE test11(IN vendor_id_var INT)
BEGIN
    DECLARE sum_balance_due_var DECIMAL(9, 2);

    SELECT SUM(invoice_total - payment_total - credit_total)
    INTO sum_balance_due_var 
    FROM invoices i
    JOIN vendors v ON v.vendor_id = i.vendor_id
    WHERE i.vendor_id = vendor_id_var
    GROUP BY i.vendor_id, vendor_name;

    IF sum_balance_due_var > 0 THEN
        SELECT CONCAT('Balance due: $', sum_balance_due_var) AS message;
    ELSE
        SELECT 'Balance paid in full' AS message;
    END IF;
END//
DELIMITER ;

供应商表:

CREATE TABLE vendors (
    vendor_id INT(11) NOT NULL AUTO_INCREMENT,
    vendor_name VARCHAR(50) NOT NULL,
   -- other columns
)
发票表:

CREATE TABLE invoices (
    invoice_id INT(11) NOT NULL AUTO_INCREMENT,
    vendor_id INT(11) NOT NULL,
    invoice_total DECIMAL(9,2) NOT NULL,
    payment_total DECIMAL(9,2) NOT NULL DEFAULT '0.00',
    credit_total DECIMAL(9,2) NOT NULL DEFAULT '0.00',
    -- other columns
)
一些样本数据:

INSERT INTO vendors (vendor_id, vendor_name) VALUES (34, 'IBM');
INSERT INTO vendors (vendor_id, vendor_name) VALUES (37, 'Blue Cross');
INSERT INTO invoices (invoice_id, vendor_id, invoice_total, payment_total, credit_total) VALUES (19, 34, 116.54, 116.54, 0.00);
INSERT INTO invoices (invoice_id, vendor_id, invoice_total, payment_total, credit_total) VALUES (52, 34,1083.58,1083.58, 0.00);
INSERT INTO invoices (invoice_id, vendor_id, invoice_total, payment_total, credit_total) VALUES (46, 37, 224.00, 224.00, 0.00);
INSERT INTO invoices (invoice_id, vendor_id, invoice_total, payment_total, credit_total) VALUES (50, 37, 116.00, 116.00, 0.00);
INSERT INTO invoices (invoice_id, vendor_id, invoice_total, payment_total, credit_total) VALUES (113, 37,224.00,   0.00, 0.00);

将其定义为
函数

CREATE FUNCTION test11(IN vendor_id_var INT)
RETURNS text -- or whatever type you want returned
BEGIN
    -- your existing code

    RETURN <something>
END

这是一个UDF,就像一个内置的一样使用。

感谢您的详细回复。关于返回:在我做的每个if语句中。。。将AS消息转换为str_消息;然后:返回stru消息;声明为VARCHAR(200)。如果有更好的方法,我们将不胜感激。不允许使用别名返回列。我找到了更好的解决方案。我继续,在每个IF语句中放置了一个返回,并去掉了列别名。
CREATE FUNCTION test11(IN vendor_id_var INT)
RETURNS text -- or whatever type you want returned
BEGIN
    -- your existing code

    RETURN <something>
END
SELECT *, test11(vendor_id)
FROM vendors