6

POCをやっています。MySQL で 1 つのストアド プロシージャを作成しました。新しいテーブルの作成、ストアド プロシージャ、クエリの実行などのデータベース操作に MySQLWorkbench を使用しています。

ここにポイントがあります。

アプローチ 1 -

最初のアプローチでは、一時テーブルを作成し、選択した列で INSERT INTO ...SELECT ステートメントを使用してレコードを追加しています。

CREATE TEMPORARY TABLE XYZ(....);

INSERT INTO XYZ (....) SELECT (....) FROM ABC WHERE clause;

これを行った後、一時テーブルのいくつかの列でのみ null 値を取得し、他のすべての一時テーブルの列には正しい値が入力されます

別の SQL タブで同じ select ステートメントを (同じ where 句に対して) 実行すると、一時テーブルで null 値を取得するいくつかの列に対しても正しい出力が表示されます。

上記の INSERT INTO..SELECT ステートメントを * (すべての列) で変更すると、一時テーブルに正しい出力が得られます。

INSERT INTO XYZ  SELECT * FROM ABC WHERE clause;

しかし、すべての列は必要ありません。ENGINE = value で一時テーブルも作成してみました。しかし、うまくいきませんでした。私も通常のテーブル(TEMPORARYなし)でこのアプローチをすべて試しましたが、残念ながら

アプローチ 2 -

2 番目のアプローチでは、一時テーブルの代わりにカーソルを使用して同じストアド プロシージャを変更しました。ただし、この場合でも、カーソルはレコードを取得していません。

DECLARE cur1 CURSOR FOR SELECT (....) FROM ABC WHERE clause;

別の SQL タブで同じ select ステートメントを (同じ where 句に対して) 実行すると、正しい出力が表示されます。

私は何か間違ったことをしていますか?これについて何か提案はありますか?

前もって感謝します。

4

1 に答える 1

1

私はアプローチ#1の問題を理解していました。根本的な原因は、IN パラメータの 1 つとして使用された変数名でした。テーブルの列名と同じ IN 変数名を使用していました。そのため、何らかの形で実際のテーブル値を書きすぎていたと思います。IN 変数名を変更すると、ストアド プロシージャが正しく実行されました。

于 2013-01-26T07:15:30.440 に答える