2011-01-30 10 views
0

私が書いているストアドルーチンの中のMySQLデータベースのストアドルーチンの文字列のような変数にクエリの結果を格納できるかどうかを知りたいですか?MySQLでストアドルーチンを書くときに、クエリの結果をTEXT(または任意の文字列のようなデータ型)変数に格納できますか?

@Theスクラムマイスター:

は、ここで私が今持っているものです。

DELIMITER $$ 

CREATE PROCEDURE `mydb`.`markCompanyAsHavingInactiveEmployees`() 
BEGIN 
    DECLARE company TEXT; 
    SET @company := 'SELECT company FROM Employees WHERE status=2'; 
    -- Can I make an array inside of stored procedures? 
END 

それは完全ではありません、それは私が行っ欲しいものを買ってあげるかどうかは知りません。しかし、それはあります。

@siride:

私が何をしようとしているが、従業員のテーブルのレコードで見つかっているものに依存する一定値に会社テーブルからレコード内のフィールドを設定することです。ここで

は私がやろうとしている何のための私の擬似コードは次のとおりです。

DELIMITER $$ 

CREATE PROCEDURE `mydb`.`markCompanyAsHavingInactiveEmployees`() 
BEGIN 
    DECLARE companies TEXT; 
    SET @companies := 'SELECT company FROM Employees WHERE status=2'; 
DECLARE i INT; 
WHILE(i<=companies.length) 
{ 
    DECLARE company TEXT; 
    company = ""; 
    if(companies.charAt(i)!='\n') company.concat(companies.charAt(i)); 
    DECLARE stmt TEXT; 
    stmt = CONCAT('UPDATE Companies SET HaveInactiveEmployees=1 WHERE name=\'', company, '\''); 
    i++; 
} 
END 

私はこのような何かが実際にMySQLのルーチンに動作するとは思わないが、これは、私ならば、私はどうなるのかです可能性があります。

+0

あなたがしようとしていることの例を挙げてください。質問は少し不明です。結果の文字列で何をしたいですか? –

+0

以前は14%でしたが、1つは9つの質問のうち1つを受け入れます。 – ajreal

+0

しかし、あなたと私が投稿したときまでに、私はすでに3つの質問以外のすべての回答を受け入れました。しかし、私の2:3の67%b/cをどのように計算して、どのように比率を受け取ったのかは不思議ですが、私の名前の隣には86%と言われています。それは私が思う少し寛大です! –

答えて

0

ストアドプロシージャ内では配列を作成することはできませんが、適切な権限を持つテンポラリテーブルを作成することはできます。

あなたの主な質問に加えて、クエリを実行して何らかの形で結果を1つの文字列に連結したい、おそらく何かで区切られますか?その場合は、あなたのストアドプロシージャ内でこのようなものを持つことができます:

SELECT GROUP_CONCAT(company SEPARATOR '|') INTO company 
FROM Employees WHERE status = 2 
GROUP BY status; 

は、これはあなたにフォーム「アクメプロダクツ株式会社|マイクロソフト|アップル| ...」の単一の文字列を与えます。

これはあなたの問題を解決するかどうかはわかりませんが、質問のコメント者の中には正確な問題が何であるかわからないためです。しかし、うまくいけば、それはあなたの探求であなたを助けます。

編集:私はあなたの編集を見ました(最終的に)、あなたは動的SQLを使って1つのクエリでできることをしようとしているようです。私はあなたが重いプログラミングの背景から来て、あなたがデータベースで使用するリレーショナルロジックに慣れていないと思います。ここでは、単一のクエリで行われるリクエストの例です:

UPDATE Companies 
JOIN Employees 
    ON Employees.company = Companies.name 
SET Companies.HaveInactiveEmployees = 1 
WHERE Employees.status = 2 

あなたはおそらくUPDATEステートメントのためのMySQLのドキュメントを読むことをお勧めします(http://dev.mysql.com/doc/refman/5.0/en /update.html)を使用して、ここで起こっていることをよりよく理解してください。しかし、基本的には、会社名と従業員テーブルを社名に結合し、結果テーブルから結合します(結合は基本的に新しいテーブルを作成します)。ステータスフィールド(結合テーブルのEmployees部分)これらの行のそれぞれについて、HaveInactiveEmployeesフィールドを1に更新します。

これは唯一の方法ではありません。クエリのセマンティクスに基づいて、すべての企業を更新して、非アクティブな従業員がいるかどうかを示すように思えます。あなたはこの代わりのようにそれを表現することができます

UPDATE Companies 
SET HaveInactiveEmployees = 1 
WHERE Companies.name IN(SELECT company FROM Employees WHERE status = 2) 

これは同じことを行い、それはあなたが非アクティブである各従業員の会社名を探しているということがより明確になります(私はそれがどのような状態2つの手段だと仮定) 。その名前のリストを取得すると、そのリストに名前を持つすべての会社エントリが更新されます。

これをプログラミングの観点から言えば、会社名のリストを持つ配列を作成するループが1つあり、ループをもう1つループして各社を通過し、会社名が1の場合HaveInactiveEmployeesフィールドを1に設定します私たちが作成したアレイにサブクエリは基本的にネストされたループです。結合はネストされたループでも効率的です。たとえば、このクエリは上記のクエリよりも遅く実行されますが、MySQLが適切に最適化するほどスマートではないためです。ロジックはほぼ同じであり、優れたDBエンジンは両方のクエリに対して同じ実行計画を生成します。

関連する問題