• ベストアンサー

謎のFOR文について

SELECT co1, col2, co13 FROM tbl1 FOR UPDATE というSQLのFOR UPDATEの部分の意味がわかりません。ループの記述の方法とも違うようですし、トリガーを使用する記述とも違うように思います。 どなたかこの意味をご存知のかたがいらっしゃいましたらご教授ください。 DB2 v7

質問者が選んだベストアンサー

  • ベストアンサー
  • cubics
  • ベストアンサー率41% (1748/4171)
回答No.1

データの完全性を保持するためにロックをかける方式です。 こちらをどうぞ。 http://www.atmarkit.co.jp/fdb/rensai/db2bestprac06/db2bestprac06_4.html http://www.atmarkit.co.jp/fdb/rensai/rdbmsarc04/rdbmsarc04_2.html

参考URL:
http://www.atmarkit.co.jp/fdb/rensai/db2bestprac06/db2bestprac06_4.html
PINK_EGG
質問者

お礼

ありがとうございました。これで謎がとけました。 参考URLも大変ためになりました。

関連するQ&A

  • レコードが選択されないときの、置換ができません

    select max(COL_1) from TBL where COL2 = 'hoge'; というようなSQLがあり、この条件での選択されるレコードが存在しないとき max(COL_1)の値を"0"(ゼロ)にしたいのですが。。。 select nvl(max(COL_1),NULL,0) from TBL where COL2 = 'hoge'; と修正しても結果は変わらず「レコードが選択されませんでした。」 となってしまいます。 他にdecodeや、countも試したのですが、力量不足のため、上手くいきません。。 どなたかご教授願います。 Oracle 9i で SQL*Plus 使用しています。

  • 別テーブルからselectした値を他のテーブルにinsertしたいのですが、上手くできません

    以下のように行ったのですが、 全ての値が別テーブルにinsertされません。 $sql = "SELECT tbl_A.id, tbl_A.data FROM tbl_A "; $rst = mysql_query( $sql ); while ( $col = mysql_fetch_array( $rst ) ) { $sql = "INSERT INTO tbl_B (          date, id, data ) VALUES ( '" . date( 'Y-m-d' ) . "', '" . mysql_real_escape_string( $col['id'] ) . "', '" . mysql_real_escape_string( $col['data'] ) . "' )"; } このやり方では、テーブル内の1つの値しかinsertされません。 selectされた全ての値をinsertするにはどのようにしたら良いのでしょうか? よろしくお願いします。 DB:mysql5 SP:php5

    • ベストアンサー
    • MySQL
  • 円マークのフィールドに対してSELECT文が実行できない

    いつも参考にさせていただいております。 DB2(AS400)に対してJDBC経由で、円マーク(\)をんだフィールドに対してSELECT文を実行しようとすると、エラーになってしまいます。 フィールドの前にもう一つ円マークを付加して、フィールド名をダブルコーテーションでくくってみたのですが、テーブルには該当するフィールドがないというエラーになってしまいます。 以下のようなJavaのコードになります。 String sqlStr = "SELECT " + "\"" + "\\COL1" + "\"" + " FROM TABLE1"; 上記からは以下のSQLが作成されます。 SELECT "\COL1" FROM TABLE1 このSQL文を、DB2のツールで実行すると問題なく処理されて、値が返ってきます。 Java(JDBC経由)の場合は、どのように記述したら宜しいのでしょうか? 宜しくお願い致します。

  • カーソル宣言をIFで分けられませんか?

    よろしくお願いします。 Pro*Cで作成しているのですが、カーソルの宣言時に指定するSQLをIF文で分けようとすると、 コンパイル時に「PCC-W-02332, SQLの識別子を再定義しようとしました。」が表示されます。 IFの結果がどうであれ、カーソルが取得するレイアウトが同一かつ、OPEN後の処理も同じように処理するため、できれば同一のカーソル名で行いたいです。 以下は今の状態を簡略化したプログラミングですが、 どのように対処するのが良いのでしょう。 Oracle10.2です。 よろしくお願いします。 ------------------------------------------------------- int flg; <中略> if ( flg == 0 ) {  EXEC SQL DECLARE curname CURSOR FOR   SELECT tbl.col1, 'flgが0です' AS col2 FROM tbl  ; } else {  EXEC SQL DECLARE curname CURSOR FOR   SELECT tbl.col1, 'flgが0以外です' AS col2 FROM tbl  ; } EXEC SQL OPEN curname; EXEC SQL WHENEVER NOT FOUND DO BREAK; while(1) {  EXEC SQL FETCH rackBCCur INTO :retVals  <略> } -------------------------------------------------------

  • aes_decryptでsyntax error

    はじめまして。 mysql 4.0.26でaes_decryptを使うとsyntax errorとなってしまいます。(mysql4.0.26+phpMyAdmin 2.6.4-pl2) aes_decryptに関してはこのサイト及びGoogleで調べていろいろ試したのですが実行することができませんでした。 皆様のお知恵を拝借したく質問を作成させていただきました。 ご教授の程よろしくお願いいたします。 -- 実行したソース -- select col1, aes_decrypt(col2, 'key') as col2 from tbl; -- エラーメッセージ -- #1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '( col2 , 'key' ) as col2 from tbl LIMIT 0, 30' at line 1 以下のソースを実行するとエラーが発生することなく終了しますが、 最後のdrop table文を削除すると上記のエラーが発生します。 --- 以下ソース --- create table tbl( col1 integer, col2 tinyblob ); insert into tbl(col1, col2) values (1, aes_encrypt('test','key')); select col1, aes_decrypt(col2, 'key') as col2 from tbl; drop table tbl; --- 上記ソースを実行したときのphpmyadminのメッセージです -- SQL 照会が正常に実行されました 実行した SQL 照会: CREATE TABLE tbl( col1 integer, col2 tinyblob );# MySQLが空の値を返しました。(例えば行が空とか). INSERT INTO tbl( col1, col2 ) VALUES ( 1, aes_encrypt( 'test', 'key' ) ) ;# 影響された行数:1 SELECT col1, aes_decrypt( col2, 'key' ) AS col2 FROM tbl;# 行: 1 DROP TABLE tbl;# MySQLが空の値を返しました。(例えば行が空とか). --

  • PHPのfor文

    送り側で次の情報を送ると、 select SyaName from Syain where SyaNo = 2select SyaName from Syain where SyaNo = Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /result.php on line 33 という文がループします。 SyaNo=1 から SyaNo=10 の計算をさせたいのですが、 なぜこれではだめなのでしょうか。。。 どう表記したらよろしいのでしょうか? 送り側>----------------------------<input type="text" name="WorDateYear" size="8" maxlength="4">年 <input type="text" name="WorDateMonth" size="5" maxlength="2">月<br> <input type="submit" name="create" value="作成"> >------------------------------- 受け側>---------------------------- $sql = "select WorDate,ComName,GenName,StrTime,EndTime,SyaNo1,SyaNo2,SyaNo3,SyaNo4,SyaNo5,SyaNo6,SyaNo7,SyaNo8,SyaNo9,SyaNo10 from Denpyo where WorDate like '%" . $_GET['WorDateYear'] . "-%" . $_GET['WorDateMonth'] . "%'"; $result1 = mysql_query($sql,$link); <? $body .= "<table> while($col = mysql_fetch_array($result1)){ for($cnt=1; $cnt<=10; $cnt++){ $sql = "select SyaName from Syain where SyaNo = " . $col[SyaNo.$cnt]; print $sql; $result2 = mysql_query($sql,$link); $col2 = mysql_fetch_array($result2); $SyaNo . $cnt = $col2['SyaName']; } $body .= "<tr>\n"; $body .= "<td rowspan='2'>" . date("j",$col['WorDate']) . "日</td>\n"; $body .= "<td rowspan='2'>" . date("w",$col['WorDate']) . "曜日</td>\n"; $body .= "<td rowspan='2'>" . $col['ComName'] . "</td>\n"; $body .= "<td rowspan='2'>" . $col['GenName'] . "</td>\n"; $body .= "<td>" . $col['StrTime'] . "</td>\n"; $body .= "<td>" . $col['EndTime'] . "</td>\n"; $body .= "<td>" . $SyaNo1 . "</td>\n"; $body .= "<td>" . $SyaNo2 . "</td>\n"; $body .= "<td>" . $SyaNo3 . "</td>\n"; $body .= "<td>" . $SyaNo4 . "</td>\n"; $body .= "</tr>\n"; $body .= "<tr>\n"; if ($col['StrTime'] < 074500){ $Str = 074500 - $col['StrTime']; } $body .= "<td>" . $Str . "</td>\n"; if ($col['EndTime'] > 170000){ $EndT = $col['EndTime'] - 170000; } $body .= "<td>" . $EndT . "</td>\n"; $body .= "<td>" . $SyaNo5 . "</td>\n"; $body .= "<td>" . $SyaNo6 . "</td>\n"; $body .= "<td>" . $SyaNo7 . "</td>\n"; $body .= "<td>" . $SyaNo8 . "</td>\n"; $body .= "</tr>\n"; } $body .= "</table>\n"; print $body; ?> >-------------------------------

    • ベストアンサー
    • PHP
  • 【PL/SQL】CURSOR ・・・ IS SELECT・・・FOR UPDATE が機能しない

    カーソルの宣言で、FOR UPDATE を指定しているのに、 WHERE CURRENT OF での更新が効きません。 エラーは発生せず、全件分ループも回っているのですが、値がまったく書き換わっていません。 Oracle Ver. = Oracle8i Release 8.1.6.0.0 CREATE OR REPLACE FUNCTION TEST_FNC RETURN BOOLEAN IS todofu_cd NUMBER(2) := 0; strSQL VARCHAR2(2000) := ''; CURSOR cur IS SELECT * FROM TEST_TBL FOR UPDATE; BEGIN For cur_rec In cur Loop DECLARE BEGIN SELECT TODOFU_CD INTO todofu_cd FROM M_POST WHERE POST_NO = cur_rec.POST_NO; EXCEPTION When NO_DATA_FOUND Then todofu_cd := 0; END; UPDATE TEST_TBL SET TODOFU_CD = todofu_cd WHERE CURRENT OF cur; COMMIT; End Loop; EXCEPTION  (省略) END; / 「CURSOR cur IS SELECT * FROM TEST_TBL FOR UPDATE;」の部分は、 「CURSOR cur IS SELECT POST_NO, TODOFU_CD FROM TEST_TBL FOR UPDATE OF TODOFU_CD; 」と記述しても結果は同じでした。 上書きしようとしている値である「todofu_cd」にきちんと望む値が格納されていること、ループが正常に回り、各行にアクセスしていることは、確認済です。 原因が分かる方がいらっしゃいましたらご教授下さい。 また、質問の内容に不備があるようでしたら、ご指摘下さい。 以上、どうかよろしくお願い致します。

  • SQL文の書き方について

    SQL文の書き方について教えてください。 VBでSELECT分を書く場合、表示項目の間に空白(スペース)を入れて書きますが、これってレスポンスに影響が有りますか? 例 SELECT A,       B,       C FROM TBL という具合に記述します。 自分の経験上だと、レスポンスには影響がでないと思いますがどうなんでしょうか・

  • sqlplusの処理が途中でとまる

    oracle10gを使用しています。 sqlplusでいくつかのDDLとDMLを一度にコピーペーストで流しました。一つ一つの処理後にcommit;も入っています。 しかし、最後のDMLで処理がとまってしまい、エラーもでません。内容は以下のようになっています。 insert into tbl_a (select distinct col1,'2006/01/01' from tbl_b where col1 is not null union select distinct col2,'2006/01/01' from tbl_b where col2 is not null union select distinct col3,'2006/01/01' from tbl_b where col3 is not null union select distinct col4,'2006/01/01' from tbl_b where col4 is not null union select distinct col5,'2006/01/01' from tbl_b where col5 is not null union select distinct col6,'2006/01/01' from tbl_b where col6 is not null); COMMIT; この処理を単独で実行すると、成功します。sqlpulsは、実行コマンドの量に制限などあるのでしょうか?なぜ、このようになるかわかりません。ちなみに、コマンドの全文字数は3990目で、処理が停止するのは、3648文字目です。この3648文字目にあたるのが、上記の >select distinct col3,'2006/01/01' の >select disti です。 大変急を要ししています。 よろしくお願いします。

  • 2つのテーブルのカウント結果を1行で取得

    以下のようなデータ件数のテーブルが、別々のDBにあります。 SELECT COUNT(*) FROM AA.TBL01 ------ TBL01 ------ 10 SELECT COUNT(*) FROM BB.TBL02 ------ TBL02 ------ 5 それぞれのテーブルのカウント結果を、1行で取得する ことは可能でしょうか? <取得したい結果> ---------------- TBL01 TBL02 ---------------- 10 5 よろしくお願いします。 (SQL Server2005 Standard)