Làm thế nào để tạo một thủ tục lưu trữ mysql thông qua thiết bị đầu cuối linux


9

Trong bảng điều khiển mysql, chúng tôi sẽ sử dụng lệnh delimiter để thay đổi dấu phân cách và rất hữu ích để xác định các thủ tục. Tôi hiểu lệnh chỉ delimitercho máy khách mysql (lệnh phía máy khách).

nhưng tôi đang sử dụng máy khách mysql không có lệnh delimiter như thế nào dbslayer, trên loại máy khách này làm thế nào tôi có thể xác định các thủ tục.

bây giờ hãy xem xét:

create procedure test_pro()
begin
select 'hello pro';
end

Tôi đã thử như sau:

mysql -u root -pmypass  test < proc_file

trong đó Proc_file chứa thủ tục trên;

nhưng đó là cho tôi lỗi sau:

ERROR 1064 (42000) at line 1: 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 '' at line 3

Sự kiện tôi đã thử như sau

 create procedure test_pro()
    begin
    select 'hello pro';
    end;

(đã thêm dấu chấm phẩy) nhưng đang gặp lỗi tương tự.

Tương tự tôi đang trải nghiệm với dbslayer, nếu tôi có thể xác định quy trình trên thông qua thiết bị đầu cuối, tôi nghĩ rằng tôi sẽ có thể làm điều đó thông quadbslayer

Câu trả lời:


10

Không có cách nào xung quanh nó. Bạn phải sử dụng DELIMITERlệnh. Tại sao ?

Nếu bạn từng thực hiện một mysqldump của các thủ tục được lưu trữ, thì mỗi thủ tục được lưu trữ bắt đầu bằng

DELIMITER ;;

và kết thúc bằng

DELIMITER ;

Đây là một bài đăng mà tôi đã đề cập trước đây: THỦ TỤC DROP NẾU EXISTS không được bao gồm trong mysqldump

Hãy thử bỏ một thủ tục được lưu trữ với mysqldump và tự mình xem

Tôi cũng đã viết một số mã để làm điều này:

Đối với câu trả lời được đăng bởi @altmannmarcelo , nó trực tiếp trả lời câu hỏi của bạn (+1 cho câu trả lời của anh ấy). Mặt khác, mysqldumps không bao giờ có thể khôi phục các thủ tục được lưu trữ.

Có hai điều bạn có thể làm để phù hợp với DELIMITER mới:

HÃY THỬ # 1

Đưa ra dấu phân cách trên chính dòng lệnh

mysql -u root -pmypass --delimiter="//" test < myproc.sql

Đây là một tùy chọn dòng lệnh cho chương trình máy khách mysql

[root@****]# mysql --help | grep -i delimiter
  --delimiter=name    Delimiter to be used.
delimiter                         ;

HÃY THỬ # 2

Bạn có thể viết mã vào một tệp văn bản và thực thi đối với tệp văn bản như @altmannmarcelo đề xuất

echo "DELIMITER //" > myproc.sql
echo "create procedure test_pro()" >> myproc.sql
echo "begin" >> myproc.sql
echo "select 'hello pro';" >> myproc.sql
echo "end" >> myproc.sql
echo "//" >> myproc.sql
mysql -u root -pmypass  test < myproc.sql

HÃY THỬ MỘT LẦN !!!


3

Bạn cần thay đổi dấu phân cách để tạo thủ tục, nếu không, MySQL sẽ cố gắng thực hiện truy vấn của bạn trên select 'hello pro';

Thay đổi thủ tục của bạn thành:

DELIMITER //
create procedure test_pro()
begin
select 'hello pro';
end
//

Từ Tài liệu MySQL :

Nếu bạn sử dụng chương trình máy khách mysql để xác định chương trình được lưu trữ có chứa các ký tự dấu chấm phẩy, sẽ xảy ra sự cố. Theo mặc định, chính mysql nhận ra dấu chấm phẩy là một dấu phân cách câu lệnh, do đó bạn phải xác định lại dấu phân cách tạm thời để khiến mysql chuyển toàn bộ định nghĩa chương trình được lưu trữ đến máy chủ.


Tôi biết về dấu phân cách này trong bảng điều khiển mysql. Tôi đang tìm kiếm điều khác nhau. Tôi đã hỏi rằng làm thế nào để tạo một thủ tục mà không cần đăng nhập vào bảng điều khiển mysql. Nếu chúng tôi thực hiện như mysql -u root -ppass db -e "chọn somecolumn từ testtable" nếu chúng tôi thực hiện lệnh trên trên thiết bị đầu cuối linux, chúng tôi sẽ nhận được kết quả cho truy vấn được chỉ định sau -e. nó sẽ ngắt kết nối sau khi thực hiện truy vấn, Thực tế là trong truy vấn đó, dấu phân cách // sẽ không hoạt động.
neotam

Như @RolandoMySQLDBA nói (+1), bạn có thể lưu quy trình vào một tệp bằng DELIMITERhoặc thay đổi nó truyền đối số --delimitertrên mysqldòng lệnh.
altmannmarcelo

2

Điều này làm việc cho tôi:

Nội dung của mysqlfile.sql

USE `dbschemaname`;
DROP procedure IF EXISTS `myprocname`;

DELIMITER $$
USE `dbschemaname`$$
CREATE DEFINER=`myusername`@`%` PROCEDURE `myprocname`(IN myvar VARCHAR(3500))
BEGIN
     DECLARE my_id INT;

     SELECT id INTO veh_id FROM mytable WHERE something = myvar;

END$$

DELIMITER ;

và trên dòng lệnh:

$ mysql -u user -pmypass dbschemaname < mysqlfile.sql

0

Tôi biết đây là một câu hỏi cũ nhưng những điều sau đây có thể hữu ích cho ai đó trong tương lai:

#!/bin/bash

echo "Started ..."
date
host=localhost
user=dbusername
password=dbpassword
database=databasename

time /usr/bin/mysql --host=$host --user=$user --password=$password --database=$database<<EOFMYSQL
DELIMITER $$
create procedure test_pro()
BEGIN
SELECT 'hello pro';
END$$
DELIMITER ;
SHOW WARNINGS;
SHOW COUNT(*) WARNINGS;
EOFMYSQL

echo "Finished "
date

Đã thử nghiệm và làm việc chống lại Maria DB.

Sau khi hoàn thành, bạn có thể gọi thủ tục bằng cách sử dụng:

call test_pro();

Mong rằng sẽ giúp :)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.