2013-07-10 4 views
0

PHP Mysqli Краткое руководство для хранимых процедур, http://php.net/manual/en/mysqli.quickstart.stored-procedures.php:как создать хранимую процедуру в MySQL правильный путь

if (!$mysqli->query("DROP PROCEDURE IF EXISTS p") || 
    !$mysqli->query("CREATE PROCEDURE p(IN id_val INT) BEGIN INSERT INTO test(id) VALUES(id_val); END;")) { 
    echo "Stored procedure creation failed: (" . $mysqli->errno . ") " . $mysqli->error; 
} 

делает это не удалить процедуру, то заменить его? это правильный способ сделать это? в чем смысл его удаления? удаляет ли это не отрицает всю суть процедуры, которую вы можете вызывать на время соединения MySQL?

+0

AFAIK, отказываясь от процедуры, если она существует и воссоздает ее с нуля, это то, как она работает во всех системах баз данных SQL. –

+0

Знаете ли вы, почему его нужно отбросить? это просто хорошая практика? если да, то почему? – dje1990

+0

Я бы предположил, что это просто проще сделать так, а не иметь какой-то сложный механизм редактирования. Как правило, вы не создаете свои хранимые процедуры каждый раз, когда вы устанавливаете соединение MySQL; вы размещаете свои хранимые процедуры там один раз и оставляете их там, если они не меняются. –

ответ

0

Сначала вы должны отказаться от «старой» процедуры, иначе CREATE завершится с ошибками «уже существует». То же самое для объекта почти КАЖДОГО в базе данных, например.

CREATE TABLE foo ... // creates the table 
CREATE TABLE foo ... // will **NOT** replace the one just created 

Вы не можете переписать таблицу/proc/db, просто переопределив ее. вам сначала нужно отбросить оригинал.

Рассмотрим хаос, который бы произойти, если какой-то бедный DBA в крупном банке случайно побежал

CREATE DATABASE clients; 

и разгромили всю клиентскую БД, потому что двигатель DB заменил оригинальный DB с новым пустым.

+0

поэтому, если хранимые процедуры для каждого соединения запоминаются отдельно для каждого другого соединения, и я знаю, что у меня никогда не было двух процедур с одним и тем же именем, я мог бы проверить, существует ли процедура, и создавать ли ее только в том случае, если она не существует? отрицая необходимость отказаться от процедуры, если она существует? – dje1990

+0

похоже на CREATE OR REPLACE в Oracle? – dje1990

+0

понятия не имею о оракуле, но обычно sprocs хранятся постоянно и доступны для любых/всех подключений/пользователей. –