【问题标题】:MYSQL create stored procedure included DELETE, SELECT and INSERTMYSQL创建存储过程包括DELETE、SELECT和INSERT
【发布时间】:2014-04-17 10:36:12
【问题描述】:

我阅读手册,我可以创建简单的存储过程。 它的工作正常。但现在我需要为我创建复杂的程序,包括 DELETE、SELECT 和 INSERT

第一:

delete from 111test;

下一步:

SELECT u.user_id, u.user_nickname, u.country_id, u.city_id, u.avatar_id,
  (SELECT name FROM countries WHERE id = u.country_id) country_name,
  (SELECT name FROM cities WHERE id = u.city_id) city_name
FROM users_onsite uo 
LEFT JOIN users u ON u.user_id = uo.user_id
WHERE u.avatar_id > 0;

接下来:

INSERT INTO 111test (type,user_id,some_datas1,some_datas2,some_datas3) 
  values (53,$user_id,'$user_nickname',$country_name','$city_name')

所以,我的程序是:

BEGIN

DECLARE var_user_id INT(50);
DECLARE var_some_datas1 varchar(255);
DECLARE var_some_datas2 varchar(255);
DECLARE var_some_datas3 varchar(255);

delete from 111test;

SELECT u.user_id, u.user_nickname, u.country_id, u.city_id, u.avatar_id,
  (SELECT name FROM countries WHERE id = u.country_id) country_name,
  (SELECT name FROM cities WHERE id = u.city_id) city_name
  FROM users_onsite uo 
  LEFT JOIN users u ON u.user_id = uo.user_id
  WHERE u.avatar_id > 0;

INSERT INTO  111test (type,user_id,some_datas1,some_datas2,some_datas3)
  VALUES (53,var_user_id,var_some_datas1,var_some_datas2,var_some_datas3);

END

结果:您的 SQL 查询已成功执行 1172 行,受过程中最后一条语句的影响

但是在表 111test 中插入了零行。

请有人帮助我。

【问题讨论】:

    标签: mysql sql stored-procedures


    【解决方案1】:

    那么,这里的障碍是什么。您可以创建包含 DML 操作的过程。请参阅下面的示例(尽管在 SQL Server 中创建)

    create procedure sp_crud_test
    as
    begin
    delete from sample1;
    
    select * from sample3;
    
    insert into sample1 select * from sample3;
    end
    
    exec sp_crud_test
    

    所以在你的情况下,它会是这样的

    delimiter //
    CREATE PROCEDURE sp_crud_test (IN 
    user_id int, IN user_nickname varchar(10),
    IN country_name varchar(10),IN city_name varchar(10))
    BEGIN
    delete from 111test;
    
    SELECT u.user_id, u.user_nickname, u.country_id, u.city_id, u.avatar_id,
      (SELECT name FROM countries WHERE id = u.country_id) country_name,
      (SELECT name FROM cities WHERE id = u.city_id) city_name
    FROM users_onsite uo 
    LEFT JOIN users u ON u.user_id = uo.user_id
    WHERE u.avatar_id > 0;
    
    INSERT INTO 111test (type,user_id,some_datas1,some_datas2,some_datas3) 
      values (53,user_id,user_nickname,country_name,city_name)
    END//
    

    不如这样称呼

    CALL sp_crud_test(10,'tk','US','london')
    

    编辑: 现在我知道了,您正在尝试将您的选择查询值插入到该表中;应该像下面这样完成

    delimiter //
    CREATE PROCEDURE sp_crud_test
    BEGIN
    delete from 111test;
    
    INSERT INTO 111test (type,user_id,some_datas1,some_datas2,some_datas3) 
    SELECT '53' as type, u.user_id, u.user_nickname,
      (SELECT name FROM countries WHERE id = u.country_id) country_name,
      (SELECT name FROM cities WHERE id = u.city_id) city_name
    FROM users_onsite uo 
    LEFT JOIN users u ON u.user_id = uo.user_id
    WHERE u.avatar_id > 0;    
    END//
    

    然后像这样调用

    CALL sp_crud_test
    

    【讨论】:

    • 是的,我已经像你一样尝试了。结果:您的 SQL 查询已成功执行 1172 行,受过程中最后一条语句的影响,但在表 111test 中插入了零行。我添加: DECLARE var_user_id INT(11);声明 var_some_datas1 INT(11);声明 var_some_datas2 INT(11);声明 var_some_datas3 INT(11);但结果相同。
    • @TKVideoChat,立即查看已编辑的答案。您需要将参数传递给过程。
    • 当我尝试创建过程时,我得到一个错误:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '@user_id int, IN @user_nickname varchar(10), IN @country_name varchar(10),IN @c' at line 2
    • @TKVideoChat,使用编辑后的 ​​SP。问题在于用于全局变量的@ 登录参数。
    • 现在可以了。我创建了一个CALL sp_crud_test(10,'tk','US','london'),但在 111test 表中插入了 1 行:10,'tk','US','london' 而不是 1473 我的行。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-07
    • 2014-08-17
    • 1970-01-01
    • 2016-11-11
    • 2017-10-14
    • 2021-07-10
    • 2015-08-27
    相关资源
    最近更新 更多