• 締切済み

ストアドプロシージャにてフェッチから出ない

Aというテーブルの情報をカーソルにて取得し、 同じくAというテーブルに項目を変えてInsertするという プロシージャを作成しています。 しかし、フェッチしたあとその処理から出ません。 (ちなみにフェッチ後のBEGIN~END内のInsert文を違うテーブルにして実行してみると処理から抜けました) 下記が該当プロシージャです。 CREATE PROCEDURE 販売プロシージャ AS BEGIN --変数宣言 DECLARE @販売NO INT DECLARE @顧客NO INT DECLARE @明細 NVARCHAR(25) DECLARE @受注日 SMALLDATETIME DECLARE @金額 INT DECLARE @ステータス BIT DECLARE @有効フラグ BIT --カーソル宣言 DECLARE 販売カーソル CURSOR FOR SELECT 販売NO, 顧客NO, 明細, 受注日, 金額, ステータス, 有効フラグ FROM 販売 WHERE YEAR(受注日) = YEAR(GETDATE()) AND MONTH(受注日) < MONTH(GETDATE()) --初期化処理 SET NOCOUNT OFF --カーソルOPEN OPEN 販売カーソル FETCH NEXT FROM 販売カーソル INTO @販売NO, @顧客NO, @明細, @受注日, @金額, @ステータス, @有効フラグ WHILE @@FETCH_STATUS = 0 BEGIN INSERT INTO 販売 ( 販売NO, 顧客NO, 明細, 受注日, 金額, ステータス, 有効フラグ, 登録日, 更新日, )VALUES( @販売NO, @顧客NO, @明細, @受注日, @金額, @ステータス, @有効フラグ, GETDATE(), GETDATE(), ) FETCH NEXT FROM 販売カーソル INTO @販売NO, @顧客NO, @明細, @受注日, @金額, @ステータス, @有効フラグ END CLOSE 販売カーソル DEALLOCATE 販売カーソル END 同じテーブルを使用する場合は、このような記述ではできないのでしょうか?

  • tidu
  • お礼率78% (11/14)

みんなの回答

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.1

ヒントだけ挙げておきます。 ・テーブル内のカラム数を減らし、それにあわせてSELECT/INSERTするカラム数も減らして(例えば1つにして)も現象は同じですか。

tidu
質問者

お礼

いろいろいじってる内になんとか実行できるようになりました!ありがとうございました!

関連するQ&A

  • ストアドプロシージャ

    ストアド初心者ですが Oracle 9iのストアドプロシージャを作成したいのですが 全くわからず困っています。 とりあえず、以下のテーブルが既に存在し 受注番号がわかっていて、商品名、数量、単価の変更を ストアドプロシージャでおこなうにはどのようにすればよいでしょうか? ご教授お願い致します。 ********************************************** テーブル名:TEST 項目1:受注番号 項目2:商品名 項目3:数量 項目4:単価 項目5:受注日 PS. ストアドのわかりやすい解説書やホームページ お知りの方いらっしゃいましたら、ご教授お願い致します。

  • ストアドプロシージャ_カーソルのヒット件数

    いつもお世話になっています。 SQLServer7.0です。 ストアドプロシージャでカーソルを使用し、オープンしたカーソルの件数を調べたいのですがうまくいきません。 Declare curs2 cursor for Select [項目名] From [テーブル名] Where [検索条件] Open curs2 Print @@CURSOR_ROWS この「@@CURSOR_ROWS」変数でヒット件数を取得できるように参考書では書いてあるのですが、実際Printしてみると、カーソルをオープンする前だと 0 で、オープンした後だと-1 です。 特にエラーだとか、対象データがないというわけではありません。実際その後ヒットした件数分行う処理は正常に出来ています。 ただ、どうしても処理を行う前に件数を知りたいのです。カーソルの変数だけでは取れないとなると セレクトしたカーソルと全く同じセレクトを実行して@@ROWCOUTで取るしかないかなって思ってるのですが・・・。どうも建設的ではないなって思ってます。 カーソルの件数を取得するにはどうしたらよいのでしょうか?

  • Access、同じテーブルの2つの項目対他のテーブルで1つの項目のリレーションは可能?

    Accessで販売管理をしています。 以下のテーブルを作成し(*は主キーです)、 [売上T]  [商品M]  [顧客M]  [受注T] *売上NO  *商品ID  *顧客ID1  *受注NO 商品ID   商品名    *顧客ID2  商品ID 日付    顧客ID1     顧客名    受注日 金額    顧客ID2            受注金額        受注先1        受注先2 参照整合性にチェックを入れリレーションでつないでいます。 リレーションシップは下記のとおりです。 [売上T]商品ID―[商品M]商品ID―[受注T]商品ID [商品M]顧客ID1及び2―[顧客M]顧客ID1及び2―[商品M]受注先1及び2 ここで顧客と受注先が重複することもあるので、顧客Mから顧客ID及び受注先IDの2つのテーブルにリレーションシップを設定しているのですが、 クエリで  [受注T]受注NO及び受注金額、[顧客M]顧客名で抽出したところ、 5000件以上[受注T]にデータがあるはずのものが、1200件ほどしか抽出できませんでした。 ちなみに[顧客M]と[受注用顧客M]というまったく別のテーブルを作成し、 [商品M]受注先1及び2―[受注用顧客M]顧客ID1及び2 とリレーションを作成し、クエリで抽出するとうまくいきました。 しかしこの方法だと、[顧客M]と[受注用顧客M]という2つのテーブルを管理しなければならなくなるので面倒です。 そこで質問です。 同じテーブルの2つの項目対他のテーブルの1つの項目とでは、うまくリレーションが設定できないのでしょうか。 もし出来ない場合、[顧客M]と[受注用顧客M]の2つのテーブルを管理しなければならない訳ですが、 なんとか簡単に管理できる方法(ひとつのテーブルを変更すると簡単にもうひとつが変更できる設定)はないでしょうか。 非常にわかりにくく長い文章で申し訳ありません。 VBA等はさっぱりわかりませんので、普通の設定の範囲内で、できるかどうかよろしくお願いします。

  • アクセスのテーブルを分ける理由に関して質問です。

    アクセスのテーブルを分ける理由に関して質問です。 現在参考書を利用してデータベースの勉強をしてます。 試行錯誤中で弱っています。 受注テーブル(受注コード、受注日、締切日、出荷日、顧客コード) 受注明細テーブル(受注コード、商品コード、数量) とテーブルが分かれている例題がありました。 テーブルを2つに分ける理由がよくわかりません。 もし1つのテーブル (受注コード、受注日、締切日、出荷日、顧客コード、商品コード、数量) などとまとめたら何か問題があるのでしょうか? どうぞよろしくお願いします。

  • オラクルのビューについて

    (顧客テーブル) 項目名 顧客コード、顧客名、顧客名カナ (商品テーブル) 項目名 商品コード、商品名、受注単価 (受注テーブル) 項目名 受注番号、顧客コード、受注年月日、納入予定年月日 (受注明細テーブル) 項目名 受注番号、商品コード、受注数量 を使って次のビューを作ります。 (商品別受注日計データ) 項目名  商品コード 商品名 受注単価 受注年月日 日計商品別受注数量  受注数量(受注明細テーブル)の合計 日計商品別受注金額  受注単価*日計商品別受注数量 このときに日計商品別受注金額を求めるには先に日計商品別受注数量を求めておかなければなりませんが、これを一つのSELECT文で行う事は可能でしょうか。 そのまま一つのSELECT文でやろうとするとGROUP BYでうまくいかないのですが、 やはり先に日計商品別受注数量を求めておかなければいけないのですか? どっちにしろやり方がわかりません。

  • access 1対1と1対多のテーブルをクエリで集計したい…

    受注管理のデータベースを作っています。 売り上げを計算するクエリを作ったのですがどうもうまくいかないので質問します。 集計したいテーブルですが 受注マスタテーブル 注文番号(主キー テキスト型) 注文日(日付型) 氏名 : : 受注明細マスタテーブル 注文番号 (重複あり)受注マスタの注文番号と1対多のリレーションシップ 商品名 品番 販売単価 購入個数 経費・返品金額テーブル 注文番号(主キー)受注マスタの注文番号と1対1のリレーションシップ 経費 返品金額 これを、販売単価×購入個数-経費+返品金額というようにして1ヵ月ごとに集計しようとして、下のようなクエリを作ったのですが経費が何回も計算されてうまくいきませんでした… よろしくお願いします。 SELECT Format(注文者マスタ!注文日,"yyyy/mm") AS 月, Sum([受注明細マスタ]![販売単価]*[受注明細マスタ]![購入数量]-[経費・返品金額テーブル]![経費]+[経費・返品金額テーブル]![返品金額]) AS 売上 FROM (注文者マスタ RIGHT JOIN 経費・返品金額テーブル ON 注文者マスタ.注文番号 = 経費・返品金額テーブル.注文番号) LEFT JOIN 受注明細マスタ ON 注文者マスタ.注文番号 = 受注明細マスタ.注文番号 GROUP BY Format(注文者マスタ!注文日,"yyyy/mm");

  • IFで条件を分岐させてのINSERT(ストアド)。

    SQL Server2005環境です。 ストアドプロシージャを作成しています。 テーブルAを読み込んで、その値を元に、テーブルBに値を INSERTしていくという処理をしたいと考えています。 1.テーブルA.区分1<>0の時、テーブルB.区分は1 2.テーブルA.区分2<>0の時、テーブルB.区分は2 3.テーブルA.区分1<>0 かつ テーブルA.区分2<>0であれば、  テーブルB.区分が1のレコードと、2のレコード、2つ作る 以上のような処理をしたいと考えています。 ストアドはまったく初心者なのですが、分岐については、 DECLARE TEST CURSOR FOR SELECT 区分1, 区分2 FROM テーブルA OPEN TEST FETCH NEXT FROM TEST INTO @KBN1, @KBN2 --条件分岐 IF KBN1<>0 BEGIN @INKBN=1 END IF KBN2<>0 @INKBN=2 END WHILE @@FETCH_STATUS = 0 BEGIN INSERT INTO テーブルB(区分) VALUES(@INKBN) こんな感じになるのか?と思っているのですが、これではケース3の、 区分1、2ともに0ではない場合の処理ができません。 このような場合、どのように記述すれば目的の処理を達成できるのか 教えていただけないでしょうか? よろしくお願いします。

  • リレーションシップが作成できなくなりました

    Accessにて、受注管理システムを構築しているのですが 何かの拍子で、リレーションシップが壊れてしまい 再度設定しようとしても 「このリレーションシップを作成して、参照整合性を設定できません」と表示されできません。 テーブルは3つあり、以下の通りになっています。 ・顧客管理テーブル(顧客IDと氏名・住所など) ・売上情報テーブル(受注IDと、顧客IDなどの情報) ・売上明細テーブル(明細IDと、受注IDなどの情報) 問題の箇所は、売上情報テーブルと売上明細テーブルで 売上情報テーブルの「受注ID」と売上明細テーブルの「受注ID」 を結びつけようとすると、上記のメッセージが出てきてしまいます。 一通り、主キーの設定や空白行などはチェックしてみましたが やはり解決しませんでした。 一度壊れてしまったリレーションシップは修復不可能なのでしょうか・・・ どなたか、お知恵を拝借願います。

  • 複数の表を一つにしたい

    Oracle7で以下のような要求にあうようなSQLは可能でしょうか? 見積データ データNO 品目 金額 1 ああ 1O 2     いい 11 3     うう 12 受注データ データNO 品目 金額 2     いい 11 3     ええ 13 4     おお 14 納品データ データNO 品目 金額 3     かか 15 4     おお 14 5     きき 16 上記のような3つのテーブルがあります。 データNOは、見積データ作成時に連番になり、受注、納品のデータNOはその番号を引き継ぎます。 ところが、受注データからしか発生しないデータもあり、同様に納品データから発生する場合もあります。 (ちゃんと見積もりしてから受注して納品ではなく、いきなり受注したり納品したりする場合があるので) また、見積時とは明細がことなる場合もあります。 データNOでそれらを追いたいので、この3つの表を以下のような結果にしたいのです。 結果テーブル データNO 見積品目 見積金額 受注品目 受注金額 納品品目 納品金額 1    ああ    10     2    いい    11   いい    11    3    うう    12   ええ    13   かか 15 4              おお    14   おお 14 5                        きき 16 レイアウトや説明がわかりずらいかと思いますが、よろしくお願いします。

  • accessのデータ更新について

    テーブルBの内容をテーブルAに反映させようとしてます。 ●テーブルBの内容 顧客コード 登録日 ステータス ステータス更新日 1 2012/01/01 1 2012/01/01 1 2012/01/01 2 2012/01/02 1 2012/01/01 3 2012/01/04 1 2012/02/02 1 2012/02/03 1 2012/02/02 2 2012/02/04 1 2012/02/02 3 2012/02/06 1 2012/02/02 4 2012/02/08 ●テーブルAの内容 顧客コード 登録日 ステータス 1 2012/02/02 1 2012/01/01 それぞれのテーブルの「顧客コード」、「登録日」をキーにし、テーブルBのステータス更新日の最新の日付のステータスをテーブルAに反映させたいのですが、うまく最新の日付のデータを取得してくれません。どうすれば正しくデータを反映することができますでしょうか? UPDATE b INNER JOIN a ON (b.登録日 = a.登録日) AND (b.顧客コード = a.顧客コード) SET a.ステータス = [b]![ステータス]; という感じにしてます。 処理後結果のテーブルAは、以下になります。 顧客コード 登録日 ステータス 1 2012/02/02 3 1 2012/01/01 2 本当は、以下にしたいのですが、、、、 顧客コード 登録日 ステータス 1 2012/02/02 4 1 2012/01/01 3 テーブルBの並び順をステータス更新日の降順や昇順にかえたりし、何度となくやりましたが、うまくいかない状況です。 なにとぞよろしくお願いいたします。