2011-06-22 5 views
1

mysqldbにcreate_new_db(p VARCHAR(45))という名前のストアドプロシージャがあります。構文は次のとおりです。私はmysqlストアドプロシージャコールがパラメータ値にアクセスできない

Call mysqldb.create_new_db('new_db_name'); 

を使用してストアドプロシージャを呼び出すときの手順を実行

DELIMITER $$ 

CREATE DEFINER=`root`@`localhost` PROCEDURE `create_new_db`(p VARCHAR(45)) 

BEGIN 

CREATE SCHEMA IF NOT EXISTS p DEFAULT CHARACTER SET latin1 ; 

-- ----------------------------------------------------- 
-- Table `p`.`events` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS p.events (yada, yada, ...) 

、データベースとテーブルが作成されますが、私は合格していますパラメータは、アクセスされていません。作成されたデータベースは、pとない私は

@P = p; 

私は、ことがわかりますスクリプト内でグローバル変数へのparamaterを代入しようとしている

手続きに渡す名前PARAMTER命名されます私はプロシージャに渡しているパラメータ名は、ストアドプロシージャになっているが、どのように動作していない来る??

私はおそらくここに何かが欠けている可能性がありますが...いくつかの助けに感謝します。

+0

ため

EXECUTE IMMEDIATE concat('CREATE SCHEMA IF NOT EXISTS ', p, ' DEFAULT CHARACTER SET latin1'); 

と同様のあなたが渡したパラメータを使用していないか、それとも単にデータベースpの名前を付けているのでしょうか? – serialworm

+0

私はプロシージャを呼び出すときに、私はdbを呼び出す予定の名前を渡しています。mysqldb.create_new_db( 'new_db_name')を呼び出します。何が起こるかは、dbが毎回pという名前になるということです。私はpが渡されているパラメーターを参照する必要があると仮定しています –

答えて

1

このような動的SQLは作成できません。あなたは、あなたがそれに文字列を渡すEXECUTE IMMEDIATE 'some dynamic sql stmt'

を使用するので、このように、あなたのストアドプロシージャにSQLを構築する必要があります。データベースが取得するのであれば、あなたの他のCREATE

+0

あなたの方向を使用してこれを得ました。最初にコマンド文字列を作成し、PREPAREを使用してステートメントに割り当て、EXECUTEを使用してステートメントを実行しましたが、それが最も正しい方法であるかどうかはわかりませんが、その作業は!!! ...例 'CREATE DEFINER ='ルート '@' localhost'プロシージャ 'new_db'(IN db_name VARCHAR(45))BEGIN SET @str = CONCAT( 'CREATE SCHEMA IF NOT EXISTS'、db_name、 'DEFAULT CHARACTER SET latin1; '); @ strからstmt1を準備する; EXECUTE stmt1; END **あなたのご意見をありがとうございます** –

関連する問題