Helpex - Trao đổi & giúp đỡ Đăng nhập
27

Tôi đang cố gắng thực hiện một số thao tác đơn giản với các biến trong MySQL 5.0 nhưng tôi không thể làm cho nó hoạt động. Tôi đã thấy nhiều (rất!) Cú pháp khác nhau cho DECLARE / SET, tôi không chắc tại sao ... trong mọi trường hợp, tôi có lẽ đang nhầm lẫn chúng / chọn sai / trộn chúng.

Đây là một phân đoạn tối thiểu bị lỗi:

DECLARE FOO varchar(7);
DECLARE oldFOO varchar(7);
SET FOO = '138';
SET oldFOO = CONCAT('0', FOO);

update mypermits 
   set person = FOO 
 where person = oldFOO;

Tôi cũng đã thử gói nó bằng BEGIN ... END; và như một THỦ TỤC. Trong trường hợp này, MySQL Workbench hữu ích cho tôi biết: "Lỗi cú pháp SQL gần ')'" trên dòng đầu tiên và "Lỗi cú pháp SQL gần 'DECLARE oldFOO varchar (7)'" ở dòng thứ hai. Nếu không, nó cung cấp cho cả hai dòng là lỗi đầy đủ, với "Lỗi cú pháp SQL gần ..." trên cả hai.

Chỉnh sửa: Tôi quên đề cập rằng tôi đã thử nó có và không có @s trên các biến. Một số tài nguyên có nó với, những người khác không có.

Tôi đang phạm sai lầm ngớ ngẩn nào vậy?

27 hữu ích 1 bình luận 149k xem chia sẻ
30

Điều này hoạt động tốt đối với tôi khi sử dụng MySQL 5.1.35:

DELIMITER $$

DROP PROCEDURE IF EXISTS `example`.`test` $$
CREATE PROCEDURE `example`.`test` ()
BEGIN

  DECLARE FOO varchar(7);
  DECLARE oldFOO varchar(7);
  SET FOO = '138';
  SET oldFOO = CONCAT('0', FOO);

  update mypermits
     set person = FOO
   where person = oldFOO;

END $$

DELIMITER ;

Bàn:

DROP TABLE IF EXISTS `example`.`mypermits`;
CREATE TABLE  `example`.`mypermits` (
  `person` varchar(7) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO mypermits VALUES ('0138');

CALL test()
30 hữu ích 2 bình luận chia sẻ
8

Tôi gặp phải vấn đề tương tự khi sử dụng MySQL Workbench. Theo tài liệu MySQL , DECLAREcâu lệnh "khai báo các biến cục bộ trong các chương trình được lưu trữ." Điều đó rõ ràng có nghĩa là nó chỉ được đảm bảo hoạt động với các thủ tục / chức năng được lưu trữ.

Giải pháp cho tôi là chỉ cần loại bỏ DECLAREcâu lệnh và giới thiệu biến trong SETcâu lệnh. Đối với mã của bạn, điều đó có nghĩa là:

-- DECLARE FOO varchar(7); 
-- DECLARE oldFOO varchar(7);

-- the @ symbol is required
SET @FOO = '138'; 
SET @oldFOO = CONCAT('0', FOO);

UPDATE mypermits SET person = FOO WHERE person = oldFOO;
8 hữu ích 1 bình luận chia sẻ
0

Có vẻ như bạn đã quên khai báo biến @ trong. Ngoài ra, tôi nhớ đã gặp vấn đề với SETMySql cách đây rất lâu.

Thử

DECLARE @FOO varchar(7);
DECLARE @oldFOO varchar(7);
SELECT @FOO = '138';
SELECT @oldFOO = CONCAT('0', @FOO);

update mypermits 
   set person = @FOO 
 where person = @oldFOO;
0 hữu ích 1 bình luận chia sẻ
0

thử cái này:

declare @foo    varchar(7),
        @oldFoo varchar(7)

set @foo = '138'
set @oldFoo = '0' + @foo
0 hữu ích 4 bình luận chia sẻ
0

Trong Mysql, chúng ta có thể khai báo và sử dụng các biến bằng lệnh set như bên dưới

mysql> set @foo="manjeet";
mysql> select * from table where name = @foo;
0 hữu ích 0 bình luận chia sẻ
0

Nếu bạn đang sử dụng phpmyadmin để thêm quy trình mới thì đừng quên đặt mã của bạn giữa BEGIN và ENDKhai báo và sử dụng biến MySQL varchar

0 hữu ích 0 bình luận chia sẻ
-1
Declare @variable type(size);

Set @variable = 'String' or Int ;

Thí dụ:

 Declare @id int;
 set @id = 10;

 Declare @str char(50);
 set @str='Hello' ; 
-1 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ sql mysql mysql-error-1064 , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading