【问题标题】:Can't create stored procedure with parameters无法创建带参数的存储过程
【发布时间】:2013-05-25 11:06:47
【问题描述】:

我正在尝试使用 in 参数第一个日期、最后一个日期和国家/地区创建一个存储过程

这是正常的查询,女巫工作得很好。


SELECT CAR_TYPE.NAME, CAR_TYPE.TYPE, CAR.DAY_PRICE, CAR.REGISTRATION_NUMBER, AGENCY.NAME, BRANCH.NAME
FROM CAR
JOIN CAR_TYPE ON CAR_TYPE.ID = CAR.CAR_TYPE_ID
JOIN BRANCH ON BRANCH.ID = CAR.BRANCH_ID    
JOIN BRANCH_ADDRESS ON BRANCH_ADDRESS.BRANCH_ID = BRANCH.ID
JOIN AGENCY ON AGENCY.ID = BRANCH.ID`  
WHERE CAR.ID NOT IN
(SELECT BOOKING.CAR_ID FROM BOOKING WHERE BOOKING.PICKUP_DATE < '2013-01-01' AND BOOKING.RETURN_DATE > '2013-12-12')
AND BRANCH_ADDRESS.CITY_NAME = 'Stockholm'
end

【问题讨论】:

  • 您使用的是哪个数据库?它们之间的细微差别可能很重要。
  • 你的问题是什么?
  • 我在 sequalpro 中使用 Mysql 5.5.28 localhost 编程
  • 我是新手,所以我只学习了基础知识。我的问题是如何将其放入存储过程中,我是否可以输入参数。 CALL AVAILIBLECAR('2013-01-01','2013-12-30','斯德哥尔摩')

标签: mysql date stored-procedures join


【解决方案1】:

我无法从您的问题中看出您在做什么,因为它的格式不正确。

我已对其进行了重新格式化,使其看起来像一个正确的查询,并进行了一些更改以提高可读性。

SELECT t.NAME, t.TYPE, c.DAY_PRICE, 
      c.REGISTRATION_NUMBER, a.NAME, b.NAME`

FROM CAR c
    JOIN CAR_TYPE t ON t.ID = c.CAR_TYPE_ID
    JOIN BRANCH b ON b.ID = c.BRANCH_ID
    JOIN BRANCH_ADDRESS ba ON ba.BRANCH_ID = b.ID
    JOIN AGENCY a ON a.ID = b.ID

WHERE ba.CITY_NAME = 'Stockholm'
  And c.ID NOT IN
      (SELECT CAR_ID 
       FROM BOOKING 
       WHERE PICKUP_DATE < '2013-01-01' 
       AND RETURN_DATE > '2013-12-12')

如果这是 SQL 服务器,那么创建基本(没有错误处理)存储过程的语句将是

Create Procedure dbo.FetchCarData -- or whatever you want to name it
@firstDate DateTime,
@lastDate DateTime,
@country varChar(50)    
As
  SELECT t.NAME, t.TYPE, c.DAY_PRICE, 
      c.REGISTRATION_NUMBER, a.NAME, b.NAME`

  FROM CAR c
    JOIN CAR_TYPE t ON t.ID = c.CAR_TYPE_ID
    JOIN BRANCH b ON b.ID = c.BRANCH_ID
    JOIN BRANCH_ADDRESS ba ON ba.BRANCH_ID = b.ID
    JOIN AGENCY a ON a.ID = b.ID`

  WHERE ba.CITY_NAME = @country 
    And c.ID NOT IN
      (SELECT CAR_ID 
       FROM BOOKING 
       WHERE PICKUP_DATE < @firstDate 
       AND RETURN_DATE > @lastDate )

在 MySQL 中我认为它看起来像这样......

Create Procedure FetchCarData( -- or whatever you want to name it
  @firstDate DateTime,
  @lastDate DateTime,
  @country varChar(50))   
Begin
   SELECT t.NAME, t.TYPE, c.DAY_PRICE, 
      c.REGISTRATION_NUMBER, a.NAME, b.NAME`

   FROM CAR c
    JOIN CAR_TYPE t ON t.ID = c.CAR_TYPE_ID
    JOIN BRANCH b ON b.ID = c.BRANCH_ID
    JOIN BRANCH_ADDRESS ba ON ba.BRANCH_ID = b.ID
    JOIN AGENCY a ON a.ID = b.ID`

   WHERE ba.CITY_NAME = @country 
     And c.ID NOT IN
       (SELECT CAR_ID 
        FROM BOOKING 
        WHERE PICKUP_DATE < @firstDate 
        AND RETURN_DATE > @lastDate )   
End

【讨论】:

  • 还是不行,我试过这样的方法,它会创建触发器,但不会给我任何输出 DELIMITER ;; CREATE DEFINER=root@localhost PROCEDURE AVAILIBLECAR2(in Datefirst DATE,in Datelast DATE,in Country varchar(11)) SELECT CAR_TYPE.NAME, CAR_TYPE.TYPE, CAR.DAY_PRICE, CAR.REGISTRATION_NUMBER, AGENCY.NAME AS AGENCY_NAME,BRANCH.NAME AS
  • BRANCH_NAME FROM CAR JOIN CAR_TYPE ON CAR_TYPE.ID = CAR.CAR_TYPE_ID JOIN BRANCH ON BRANCH.ID = CAR.BRANCH_ID JOIN BRANCH_ADDRESS ON BRANCH_ADDRESS.BRANCH_ID = BRANCH.ID 加入 AGENCY ON AGENCY.ID = BRANCH。 ID WHERE CAR.ID NOT IN (SELECT BOOKING.CAR_ID FROM BOOKING WHERE BOOKING.PICKUP_DATE Datelast) AND BRANCH_ADDRESS.CITY_NAME = Country;;分隔符;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-16
  • 1970-01-01
  • 2015-09-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多