簡體   English   中英

從文件創建 mysql 存儲過程

[英]create mysql a stored procedure from file

我正在嘗試使用 PHP 創建一個存儲過程。 我的閱讀表明最好的方法是使用 PHP 中的“exec”命令運行 .sql 文件。

在測試中,我創建了一個名為 amtv3_create_routines.sql 的文件,其內容如下:

DELIMITER //

DROP PROCEDURE IF EXISTS createTc //
CREATE PROCEDURE createTc()
BEGIN
    drop table if exists v3_tc;

    CREATE TABLE v3_tc (
        source BIGINT UNSIGNED NOT NULL ,
        dest BIGINT UNSIGNED NOT NULL ,
        PRIMARY KEY (source, dest) )
    ENGINE = InnoDB;

    insert into v3_tc (source, dest)
        select distinct rel.sourceid, rel.destinationid
        from rf2_ss_relationships rel inner join rf2_ss_concepts con
            on rel.sourceid = con.id and con.active = 1
        where rel.typeid = (select distinct conceptid from rf2_ss_descriptions where term = 'is a')
        and rel.active = 1;

    REPEAT

        insert into v3_tc (source, dest)
            select distinct b.source, a.dest
            from v3_tc a
            join v3_tc b on a.source = b.dest
            left join v3_tc c on c.source = b.source and c.dest = a.dest
            where c.source is null;

        set @x = row_count();

        select concat('Inserted ', @x);

    UNTIL @x = 0 END REPEAT;
    create index idx_v3_tc_source on v3_tc (source);
    create index idx_v3_tc_dest on v3_tc (dest);
END //
DELIMITER;

當我手動將其輸入 mysql 5.6.22 時,此代碼工作正常但是,如果我保存文件並從提示輸入命令。

mysql -uroot -p -hlocalhost amtv3  < [full path]/amtv3_create_routines.sql 

我嘗試使用 utf8 編碼和 windows 1252 編碼保存文件。

在命令提示符下,沒有反饋,也沒有創建過程。 在 PHP 中,我使用的是 codeigniter 框架。 如果我使用db->query方法,我可以創建存儲過程,但是數據庫會失去連接。 發出$db->reconnect()有效,但不可靠。

關於如何創建存儲過程的任何建議?

省略最后一行的空格DELIMITER; 應該會導致語法錯誤(可能由於某些其他原因而不顯示此錯誤)。

你可以試試這個

mysql -h localhost -U <username> -d <database_name> -f /home/user/<procedure_name>.sql

DELIMITER只是某些 MySQL 客戶端的功能,而不是服務器的功能。 因此,當直接執行一個.sql文件時,服務器會將第一個分號解釋為第一條語句的結尾,而DELIMITER //將被視為語法違規:

錯誤 1064:您的 SQL 語法有錯誤; 檢查與您的 MySQL 服務器版本相對應的手冊,以了解在“DELIMITER // CREATE PROCEDURE”附近使用的正確語法。 . .

在這里發現: https://github.com/go-sql-driver/mysql/issues/351#issuecomment-120081608

解決方案? 只需不要更改分隔符。 BEGINEND已經界定了復合語句。

來源: https://www.tutorialspoint.com/mysql/mysql_begin_end_compound.htm

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM