Cara membuat prosedur tersimpan mysql melalui terminal linux

9

Di konsol mysql kita akan menggunakan perintah pembatas untuk mengubah pembatas dan berguna untuk mendefinisikan prosedur. Saya mengerti perintah delimiterhanya untuk klien mysql (perintah sisi klien).

tapi saya menggunakan klien mysql yang tidak memiliki perintah delimiter seperti dbslayer, pada klien jenis ini bagaimana saya bisa mendefinisikan prosedur.

untuk saat ini pertimbangkan:

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

Saya mencoba yang berikut ini:

mysql -u root -pmypass  test < proc_file

di mana proc_file berisi prosedur di atas;

tapi itu memberi saya kesalahan berikut:

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

Acara saya coba yang berikut ini

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

(menambahkan tanda titik koma) tetapi saya mendapatkan kesalahan yang sama.

Sama dengan yang saya alami dbslayer, jika saya dapat mendefinisikan prosedur di atas melalui terminal, saya pikir saya harus dapat melakukannya melaluidbslayer

Neotam
sumber

Jawaban:

10

Tidak ada jalan lain. Anda harus menggunakan DELIMITERperintah. Mengapa

Jika Anda pernah melakukan mysqldump dari prosedur yang tersimpan, setiap prosedur yang tersimpan dimulai dengan

DELIMITER ;;

dan diakhiri dengan

DELIMITER ;

Berikut adalah pos di mana saya menyebutkan ini sebelumnya: PROSEDUR DROP JIKA ADA tidak termasuk dalam mysqldump

Coba buang satu prosedur tersimpan dengan mysqldump dan lihat sendiri

Saya juga menulis beberapa kode untuk melakukan ini:

Adapun jawaban yang diposting oleh @altmannmarcelo , langsung menjawab pertanyaan Anda (+1 untuk jawabannya). Kalau tidak, mysqldumps tidak akan pernah bisa mengembalikan prosedur tersimpan.

Ada dua hal yang dapat Anda lakukan untuk mengakomodasi DELIMITER baru:

COBA INI # 1

Berikan pembatas pada baris perintah itu sendiri

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

Ini adalah opsi baris perintah untuk program klien mysql

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

COBA INI # 2

Anda dapat menulis kode ke file teks dan mengeksekusi terhadap file teks seperti yang disarankan @altmannmarcelo

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

COBALAH !!!

RolandoMySQLDBA
sumber
3

Anda perlu mengubah pembatas untuk membuat prosedur, jika tidak MySQL akan mencoba untuk melakukan permintaan Anda select 'hello pro';

Ubah prosedur Anda menjadi:

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

Dari Dokumentasi MySQL :

Jika Anda menggunakan program klien mysql untuk menentukan program tersimpan yang mengandung karakter titik koma, masalah muncul. Secara default, mysql sendiri mengenali tanda titik koma sebagai pembatas pernyataan, jadi Anda harus mendefinisikan ulang pembatas sementara untuk menyebabkan mysql meneruskan seluruh definisi program yang tersimpan ke server.

altmannmarcelo
sumber
Saya mengetahui pembatas ini di konsol mysql. Saya mencari hal yang berbeda. Saya telah bertanya bagaimana cara membuat prosedur tanpa masuk ke konsol mysql. Jika kita melakukan seperti mysql -u root -ppass db -e "pilih somecolumn dari testtable" jika kita melakukan perintah di atas pada terminal linux kita akan mendapatkan hasil untuk permintaan yang ditentukan setelah -e. itu akan terputus setelah melakukan query, Faktanya adalah dalam query pembatas // tidak akan bekerja.
neotam
Seperti yang dikatakan @RolandoMySQLDBA (+1), Anda bisa menyimpan prosedur ke file dengan DELIMITERatau mengubahnya lewat argumen --delimiterpada mysqlbaris perintah.
altmannmarcelo
2

Ini bekerja untuk saya:

Isi dari 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 ;

dan pada commandline:

$ mysql -u user -pmypass dbschemaname < mysqlfile.sql
pengguna38380
sumber
0

Saya tahu ini adalah pertanyaan lama tetapi yang berikut mungkin berguna bagi seseorang di masa depan:

#!/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

Diuji dan bekerja melawan Maria DB.

Setelah selesai, Anda bisa memanggil prosedur menggunakan:

call test_pro();

Semoga itu bisa membantu :)

hanya aku
sumber