- ベストアンサー
Oracleのプロシージャについて
nora1962の回答
こんな感じではだめですか? begin loop update テーブルA set カラム3 = ( select カラムc from B where テーブルA.カラム2=テーブルB.カラムB ) where exists ( select 1 from テーブルB where テーブルA.カラム2=テーブルB.カラムB ) and rownum <= 5000; commit; exit when (sql%rowcount < 5000); end loop; end; /
関連するQ&A
- Oracleのupdate文について
OracleでテーブルB、Cを結合し取得できた項目で、テーブルAを更新したいのですがSQLがわかりません。結合結果とテーブルAは1:1にはなりません。 件数が結合結果>テーブルAの時もあれば、その逆の場合もあります。また、複数項目を更新したいです。実行して考えてみたいのですが、明朝客先ですぐに実行しなければならず(テスト環境はあるので明日そこで一旦確認後、すぐに本番環境で実行)、現在移動中→ホテル泊のため余裕がありません。 ネットで下記を見つけたのですが、更新する項目に更新日時を追加したいのと、テーブルAとの紐付けやEXISTSのWHEREはテーブルBとC両方の項目に紐づけたいです。 また、テーブルAの更新条件に、テーブルB、Cにはないcolumn③に対する条件も追加したいです。 UPDATE [TABLE①] A SET (COLUMN①, COLUMN②) = ( SELECT B.COLUMN, C.COLUMN FROM [TABLE②] B, [TABLE③] C WHERE B.COLUMN = C.COLUMN AND B.COLUMN = A.COLUMN ) WHERE EXISTS ( SELECT 1 FROM [TABLE②] B2 WHERE B2.COLUMN = A.COLUMN) もろもろとわかりづらい説明&他力本願で心苦しいのですが、どなたか教えていただけないでしょうか?
- 締切済み
- Oracle
- Oracle9i プロシージャ内でのIF文の書き方について
Oracle9iでプロシージャを作成しています。 テーブルの型はCHAR(10)で、 日付のデータ'YYYY/MM/DD'が入っているカラムがあります。 このMM/DDの部分が04/21~12/20なら○○○、 12/21~04/20なら△△△ というIF文を作りたいのですが、 どうしても思いつかなくて途方に暮れています。 どなたかアイデアがあれば教えてください。
- ベストアンサー
- その他(データベース)
- プロシージャとトリガー
Aというテーブルのaカラムが更新されれば、Bテーブルの列の中でAテーブルの列id含む列(複数)のbカラムをFalseからTrueに変更されるような、トリガー と プロシージャを作りたいのです。 考えていたのは、プロシージャは、 CREATE FUNCTION update_edit_b() RETURNS OPAQUE AS ' BEGIN (複数列指定?) NEW.b := 't'; RETURN NEW; END; ' LANGUAGE 'plpgsql'; プロシージャで、Bテーブルの複数列を指定するにはどうしたら良いでしょうか? トリガーは CREATE TRIGGER trgger_a AFTER UPDATE OF a ON Table_a FOR EACH STATEMENT EXECUTE PROCEDURE update_edit_b ; こんな感じでしょうか?
- ベストアンサー
- PostgreSQL
- oracleの分割delete
oracleに登録された数億件のデータを数日に分割して削除するため、 数億件のデータを5千件ずつ削除する方法を教えてください。 delete from テーブル名 where 条件 set rowcount = 5千; commit; これだと削除処理する件数が5千件であって、 先頭から5千件分見ることとは違うのでしょか? やりたいことは、 初日:一件目~5千件 二日目:5千1件目から一万件目 ・・・・・・ という感じで削除処理を行いたいです。 皆様の力を貸してください。宜しくお願いします。
- ベストアンサー
- Oracle
- ストアドプロシージャからストアドプロシージャを呼ぶことはできるか?
ストアドプロシージャからストアドプロシージャを呼ぶことはできるか? Oracle10g WindowsServer2008 Aというプロシージャ内でEXECコマンドを使ってBというプロシージャを呼ぶようにしたところコンパイルエラーになりました。ストアドプロシージャからストアドプロシージャを呼ぶことはできないのでしょうか?
- ベストアンサー
- Oracle
- トリガからプロシージャのコールについて
データベースはOracle10gです。 あるテーブルAにレコードが登録されたタイミングで、 別のテーブルBにレコードを登録するトリガを作成しようとしています。 トリガ内に全ての処理を記述するとかなりの行数になりそうなので、 登録のプロシージャを作成し、トリガからコールしようと考えています。 Aに登録されたレコードのカラムの一部を、Bに登録するレコードでも使用したいのですが、 プロシージャに引数として渡す際、 使用したいカラムを一つずつ指定しなければならないのでしょうか? (使用したいカラムは10ほどあります。) トリガに 「REFERENCING NEW ROW R1」と記述して、 このR1を渡すことはできないのでしょうか?
- 締切済み
- Oracle
- ストアドプロシージャの条件分岐に関して
お世話になります。 以下の環境で開発を行っています。 言語:C#(.NET 2008) DB: SQL Server 2008 C#で作成した画面にて入力された値をパラメータで ストアドプロシージャに渡し、その値がNULLでない場合だけ WHERE句にレコード絞り込み条件を与えるSQL文を 考えているのですが、記述方法がわかりません。 (プロシージャ) --------------------------------------------- DECLARE @param1 = '' -- 画面から渡されるパラメータ1 @param2 = '' -- 画面から渡されるパラメータ2 SELECT * FROM TABLE1 A, TABLE2 B -- (1) IF @param1 IS NOT NULL AND @param2 IS NOT NULL -- ここから WHERE A.COLUMN1 = @param1 AND A.COLUMN2 = @param2 ELSE IF @param1 IS NOT NULL AND @param2 IS NULL WHERE A.COLUMN1 = @param1 ELSE IF @param1 IS NULL AND @param2 IS NOT NULL WHERE A.COLUMN2 = @param2 -- ここまで (2) AND A.COLUMN1 = B.COLUMN1 -- (3) AND A.COLUMN2 = B.COLUMN2 -- (4) ------------------------------------------------ 上記の(1)から(4)までをうまく1つにまとめたかたちで記述することができません。 特に上記(2)の効率のよい正しい記述方法がわかりません。 どなたかご教授願えますか? よろしくお願いいたします。
- 締切済み
- SQL Server
- Oracle クエリ
Oracle クエリ 元テーブル R1 R2 A リンゴ A イチゴ B マンゴ C イチゴ C マンゴ この形のテーブルを R1 リンゴ イチゴ マンゴ A 1 1 B 1 C 1 1 変更したです。 オラクルSQLを使って、 ちなみに ORACLE 10G です。 宜しく御願いします。
- 締切済み
- Oracle
- Oracleのmargeについて
こんにちは。Oracle11を使ってます。 大規模システムで大容量のテーブルを毎日バッチで取込む必要が出てきました。 そのテーブル自体カラムが30前後で、4000万件あります。 その処理時間に頭を悩ませていましたら、MERGE句に巡りあいました。 AテーブルからBテーブルに入れるのですが、列定義(Colum数も全く違う列も存在)が若干違うのですが、それでもこれを使うことは可能でしょうか? A B ----- ----- A1 B1 A2 A2 A3 A3 A4 A6 A5 - またべたのやり方ですと、Aテーブルを全件ループして、PK連結させて、Select-Insert or Select-Updateになると思うのですが、やはりデータがほとんど同じ場合と全件全部違う場合は、処理時間も軽減されるのでしょうか?
- ベストアンサー
- Oracle
- Oracleの外部結合について
お世話になります。 次のSQLの結果についてわかられる方がいらっしゃればご回答お願いします。 間違っている部分があるのは承知していますが、ひとまずなぜこういう結果になるのかを教えていただきたいです。 SELECT A.KOUMOKU FROM A, B, C, D WHERE A.KOUMOKUNO = B.KOUMOKUNO(+) AND A.KOUMOKUNO = C.KOUMOKUNO(+) AND A.KOUMOKUNO = D.KOUMOKUNO(+) 各テーブルのデータは次のようにします。 A ------------------- KOUMOKUNO KOUMOKU 1 aaa 2 bbb 3 ccc 4 ddd 5 eee ------------------- B,C,D ------------------- KOUMOKUNO KOUMOKU 1 aaa 1 aaa 1 aaa ------------------- この場合、結果が31件となります。 調査した結果、次のような計算をもとに結果が返ってきているようなのです。 Aの4件(Aのみ存在)+(3(Bの件数)×3(Cの件数)×3(Dの件数))=29件 なぜ最後の外部結合でB,C,Dの件数が乗算されるのか教えていただきたいのです。 よろしくお願いします。
- ベストアンサー
- Oracle
お礼
ご丁寧に記載して頂きありがとうございます。 5000件ずつで上記のやり方もあるんですね。 勉強になります。 試してみたいと思います、ありがとうございます。