【问题标题】:stored procedure syntax in mysqlmysql中的存储过程语法
【发布时间】:2012-06-12 07:39:12
【问题描述】:

我是编写存储过程的新手,我似乎无法在此过程中找到错误。 错误标记在 where 部分附近。

我尝试寻找一个基于 if 条件完成集合的示例,但我似乎找不到这样的示例。谁能指出我的错误?

DELIMITER $$

CREATE PROCEDURE `incubation`.`bt_voice_modification` 
    (in input_slot varchar(45),in input_port varchar(45))
BEGIN
    SET @SVLAN_STH:=1000;
    SET @SVLAN_DTH:=999;
    SET @CVLAN_DTH:=1000;
    SET @FLOW_INSTANCE:=1;

    UPDATE one_2_one_table
        SET  L2S_USER_FLOW_INSTANCE = @FLOW_INSTANCE := @FLOW_INSTANCE+1;
        SET  L2S_NW_SLOT = input_slot;
        SET  L2S_NW_PORT = input_port;
        IF STH_DTH = 'STH' then
            set  L2S_NW_SVLAN = @SVLAN_STH :=@SVLAN_STH + 1;
        ELSE 
            set  L2S_NW_SVLAN = @SVLAN_DTH ;
            set  L2S_NW_CVLAN = @CVLAN_DTH :=@CVLAN_DTH + 1;
        END if;
        WHERE IPDSLAM_USER_SLOT = 2 AND L2S_USER_TYPE like "%gplt%";

END

【问题讨论】:

  • 使用CASE 子句,而不是IF。和SET 子句之间的逗号,而不是;。如果你也有ORDER BY 就好了。
  • 我尝试像这样添加逗号,但错误仍然相同。我错过了什么吗?如果 STH_DTH = 'STH' 然后设置 L2S_NW_SVLAN = /@SVLAN_STH :=@SVLAN_STH + 1;否则设置 L2S_NW_SVLAN = /@SVLAN_DTH ,设置 L2S_NW_CVLAN = /@CVLAN_DTH :=@CVLAN_DTH + 1;结束如果;

标签: mysql sql stored-procedures syntax


【解决方案1】:

您的代码表明您对UPDATE 语句的工作原理或确切语法没有非常清楚的了解。当您输入; 时,它标志着 (UPDATE) 语句的结束。语法是 - 一个表:

UPDATE tableX

  SET columnA = what_value_should_columnA-get ,
      columnB = what_value_should_columnB_get ,
      ...
      columnX = what_value_should_columnX_get 

WHERE (conditions that restrict the rows that will be affected)

ORDER BY SomeColumn ;   --- this can be used in MySQL only. Standard SQL 
                        --- (and most DBMS) do not allow ORDER BY clause in
                        --- UPDATE statements. Since you are using variables
                        --- and the order of updating affects the updated values,
                        --- it's essential that you include an ordering.

所以,您的 UPDATE 将类似于:

UPDATE one_2_one_table
    SET  L2S_USER_FLOW_INSTANCE = @FLOW_INSTANCE := @FLOW_INSTANCE+1 ,
         L2S_NW_SLOT = input_slot,
         L2S_NW_PORT = input_port,
         L2S_NW_SVLAN = CASE WHEN STH_DTH = 'STH'
                               THEN @SVLAN_STH := @SVLAN_STH + 1
                               ELSE @SVLAN_DTH 
                        END ,
         L2S_NW_CVLAN = CASE WHEN STH_DTH = 'STH'
                               THEN L2S_NW_CVLAN
                               ELSE @CVLAN_DTH := @CVLAN_DTH + 1
                        END

WHERE IPDSLAM_USER_SLOT = 2 
  AND L2S_USER_TYPE like '%gplt%' 

ORDER BY SomeColumn ;

【讨论】:

  • 首先谢谢@ypercube。但是独奏不起作用。你所说的昏迷被标记为错误。我正在使用 mysql 也许你所做的对 mssql 有效?
  • 当我使用你的代码时,我在第二组附近出现语法错误。
  • 再次感谢您!!!! @ypercube。不,这样当我需要在集合操作上设置条件时我会很清楚
猜你喜欢
  • 2015-12-28
  • 2016-10-28
  • 2020-03-08
  • 2012-04-12
  • 2014-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多