SQL(Sequence)の問題が分からない

このQ&Aのポイント
  • SQLの学習をしている中で、Sequenceの問題について困っています。
  • 具体的には、あるシーケンスが作成され、複数のユーザーがそれぞれ値を取得する際に、最終的なクエリの結果はどれになるのか知りたいです。
  • 問題のクエリの結果は、D. 55となります。
回答を見る
  • ベストアンサー

SQL(Sequence)の問題が分かりません。

こんにちは。 SQLの学習をしているのですが、Sequenceの問題で解き方が分からないため質問させて頂きます。 問題は以下となります。 A sequence was created with the DDL statement shown below: CREATE SEQUENCE my_seq START WITH 5 INCREMENT BY 5 CACHE 5 User1 successfully executes the following statements in Connection1: VALUES NEXT VALUE FOR my_seq INTO :con1hvar VALUES NEXT VALUE FOR my_seq INTO :con1hvar User2 successfully executes the following statement in Connection2: VALUES NEXT VALUE FOR my_seq INTO :con2hvar After User1 & User2 are finished, User3 executes the following statement in Connection3: SELECT NEXT VALUE FOR my_seq FROM sysibm.sysdummy1 Which value will be returned by the query? A. 20 B. 25 C. 50 D. 55 Answer: D 上記の解き方をご存じの方はご回答お願い致します。

  • p_nt
  • お礼率0% (0/26)
  • Oracle
  • 回答数2
  • ありがとう数1

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

  • ベストアンサー
  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.2

CACHE 5が影響しています。 User1が VALUES NEXT VALUE FOR my_seq INTO :con1hvar(1回目) をしたときに、5,10,15,20,25の5個をあらかじめ確保して、5を返します。 (START WITH 5 INCREMENT BY 5 CACHE 5なので) VALUES NEXT VALUE FOR my_seq INTO :con1hvar(2回目) でも確保された5個から次の番号を受け取り、10を返します。 User2が VALUES NEXT VALUE FOR my_seq INTO :con1hvar をしたときに、すでに確保された次の30,35,40,45,50の5個をあらかじめ確保し、30が返されます。 User3が、 SELECT NEXT VALUE FOR my_seq FROM sysibm.sysdummy1 をしたときは、 次の55がかえされるということになります。 ## 説明でお分かりかと思いますが、欠番が生じたり、 ## ややこしいことがおきたりしますので、 ## CACHEは指定するな、と私は普段言っています。 ## (個人的意見)

その他の回答 (1)

回答No.1

こんにちは。 B. 25 開始が5から、 間隔が5単位、 すでに4回発行された。 なので、次は25です。

p_nt
質問者

補足

ご回答ありがとうございます。 解答は「D:55」となっているのですが、解き方ご存知でしょうか?

関連するQ&A

  • PerlソースでのSQLのエラーについて

    お世話になります。 下記のCGIで掲示板を作成したいと思っているのですが、エラーが出てしまい設置できずにおります。 http://plus-code.net/cgi-flash-bbs/perlbbs/ サポートも終了してしまっていてお手上げ状態です・・・。 エラー内容は以下の通りです。 DBD::mysql::st execute failed: 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 'type=InnoDB' at line 1 at C:/www/users/○○○/cgi-bin/config.cgi line 87. 87行目近辺のソースはこのような感じでした。 *********************************** my $dbh = DBI->connect("DBI:mysql:$in{d_databasename}:$in{d_hostname}", $in{d_username}, $in{d_password},{RaiseError => 1, PrintError => 0, AutoCommit => 0 }) || &error_html($ref_ini->{action_error}{db_er1});      //line 70 my $user="forum"; my $pass=&Cf::Random::d_crypt($user); my $random_url=&Cf::Random::az09($ref_ini->{setup}{adjust30}); my @que=( "insert into public values(1,'','','','','','','http://','',0,1,0,3000,10,10,10,30,7,0,1,3000,1,1,'','$random_url','default','default','','','');", "insert into member values('u$tm','$user','$ip','$pass','','webmaster',0,0,'',0)", "insert into section values('s$tm',0,'section_title','section_explain','webmaster','$user')", "insert into forum values('f$tm','s$tm',0,'forum_title','forum_explain','webmaster','$user')", "insert into contact values('c$tm','$user','webmaster','to_forum','webmaster','message title','message comment','','')", "insert into clap values('s$tm','f$tm','t$tm','p$tm','w$tm','$user','$ip','testclap',10)", "insert into post values('s$tm','f$tm','t$tm','p$tm','$user','webmaster','$ip','test title','test message','','',1,'')", "insert into report values('r$tm','p$tm','$user','report title','report message')" ); eval{my ($sth); for (my $j=0;$j<scalar(@{$$ref_sql{create_table}});$j++) {      //line 87 $sth = $dbh->prepare($ref_sql->{create_table}[$j]);$sth->execute; }#for end for my $j(@que){$sth = $dbh->prepare($j);$sth->execute; $sth->finish;}$dbh->commit;$dbh->disconnect;}; if($@){$dbh->rollback;$dbh->disconnect;&error_html($@);}      //line 95 *********************************** 何卒宜しくお願い致します!

    • ベストアンサー
    • Perl
  • serial型について

    Postgresql7.2.4で user:postgresにより CREATE TABLE test (id serial PRIMARY KEY,num INT4) というテーブルを作成し、 GRANT ALL ON test TO PUBLIC と権限を与えました。 そしてPHP4よりuser:nobodyで INSERT INTO test (num) VALUES (1) というクエリを実行しようとすると ERROR: test_id_seq.nextval: you don't have permissions to set sequence wash_h_test_id_seq in test.php とでます。 しかし INSERT INTO test (id,num) VALUES (1,1) とするとちゃんとデータベースに反映されます。 PHPで、このユーザーからserialを使った自動連番で 書き込めるようにするにはどうすればいいのでしょうか。

  • datetimeの中に。。。

    dbの型がdatetimeというフィールド型なのですが、 そこにフォームから誕生日を埋め込もうとしても入っていかず、エラーになってしまいます・・・ <? $my_rtn=mysql_query("insert into users values( 0, '$email', '$passwd', '$name', '$name_kana', '$seibetu', '$year-$month-$day', '$postal1', '$xmpf', '$address1', '$address2')", $my_con); if(!$my_rtn){ die(mysql_error()); } ?> Incorrect datetime value: '' for column 'birthday' at row 1 ↑のようなエラーがでてしまいます・・・ フォームでプルタブで選ぶようにしてあります

  • SQLの構文エラー??

    お世話になっています。 OS:Win2000 DB:Access2000 です。 Insert文、Update文共に「構文エラー」になってしまいます。 ですが、実行したSQL文をAccessのクエリに貼り付けて実行しても エラーにならず、正常に実行されます。 エラーになったSQL文は以下のとおりです。 INSERT INTO D_Schedule (ShisetuNo,YYYYMMDD,ScheTime,Seq,Title,Memo,AddDate,UpdDate) VALUES (1,20041213,'0900',6,'BBB','BBB',#2004/12/16 14:31:49#,#2004/12/16 14:31:49#) UPDATE D_Schedule Set YYYYMMDD =20041213, ScheTime ='0900', Title ='AAA', Memo ='BBB', UpdDate =#2004/12/16 14:30:06# WHERE ShisetuNo=1 AND YYYYMMDD=20041213 AND ScheTime='0900' AND Seq=2 Insert文の場合、Valueの左側を指定しないで Insert Into D_Schedule Values()だとエラーにならないです。 何かお心当たりのある方、ご指摘お願いいたします。 DB更新はADOで行っています。 ADOの接続方法は Set gobjCon = Server.CreateObject("ADODB.Connection") gobjCon.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & GCOM_DBNAME & ";" です。 SQL文の実行方法は gobjCon.Execute(strSQL) です。よろしくお願いいたします。

  • どこが間違っているか教えてください

    以下のようにするとNullPointerExceptionでエラーになってしまいます。 基本的なことかもしれませんが、どこが悪いか教えていただけないでしょうか。 Connection con =null; Statement sta =null; boolean rtn = false; StringBuffer strBuffSQL = new StringBuffer(); //Oracleへの接続 con = DBAccess.connect(); //ステートメントの作成 sta = con.createStatement(); for(int i=0; i<10; i++){ // SQL文作成 strBuffSQL.append("INSERT INTO ");          ・          ・          ・ rtn = sta.execute(strBuffSQL.toString()); } con.commit(); return rtn;

    • ベストアンサー
    • Java
  • 計算ができません。

    JDBCでプログラミングをしています。 テーブルからデータを取り出して、 計算をして、違うテーブルに格納するプログラムを作っているのですが、 計算した値が出てきません。 どこがおかしいのかわかりません。 ご指摘をお願いします。 プログラムの一部です。 ********** Connection connection =DriverManager .get connection(XXXX); Statement statement = connection.createStatement(); ResultSet rs5 = statement .executeQuery("salect ENAME, JOB, SAL, COMM from EMP where JOB = 'PRESIDENT'"); while(rs5.next()) { String ename = rs5.getString(1); String job = rs5.getString(2); long sal = rs5.getLong(3); sal = round(sal*9.00+(sal*0,19)); long comm = rs5.getLong(4); String sql ="insert into BONUS values(?,?,?,?)"; PreparedStatement prestmt = connection.prepareStatement(sql); int result = 0; for(int i = 0; i<1; i++) { prestmt.setString(1.ename); prestmt.setString(2.job); prestmt.setLong(3.sal); prestmt.setLong(4.comm); result += prestmt.executeUpdate(); } } rs5.close(); statement.close(); connection.close(); ********** プログラムの中でSALの計算をしているのですが、 結果として出てくるのが元の値です。 計算結果をどうしたら出せるのか教えてください。

  • 今度はdoubly linked listの問題です…

    今日はかなり崖っぷちなのでどんどん質問します、すみません。 今回はdoubly linked listの質問です。 Consider the doubly linked list below. After each of the following statements, redraw the list to show the changes that have been made. Process the statements in sequence, that is, each statement should make changes in the list modified by the previous statement. head->|10| |/|            ↓ ↑       | 5| | |            ↓ ↑       |20| | |            ↓ ↑ tail ->|30| | | 1. head.next.next.prev.info = 100; 2. head.next.next.next = tail.prev.prev; 3. heat.next.prev = head.next.next.next.next; ※/はヌル(=Null)の意味です。 (これで分かってくださるといいんですが) 1.と2.は正解だそうです: 1.は上から二番目の5を100に変えました。 2.は上から三番目のnextが今変えたばかりの100を参照するようにしました。 そして問題の3.です。 head.next.prevですからnext(一番目)が二番目を参照して、 prevが今度は一番目を参照するので今現在"/"があるところを… head.next.next.next.nextに変更ですから 最初のnext(一番目)が二番目を参照して、 二番目のnextが三番目を参照して、 三番目のnextは2.で変更したとおり、二番目を参照して、 四番目のnextは三番目を参照するので… "/"のprevがずーーーっと伸びて20を参照するように書きました。 でも、間違っているらしいです。 どこがおかしいのでしょうか? プログラミングの神様、どうかお助け下さい。m(__)m

  • orace 変更表エラーを回避するトリガー

    お世話になります。 今回、あるTBL1のフィールド:[氏名]を入力すると同テーブルのフィールド:[社員番号]が自動で セットされるようなトリガーを作成しようとおもっています。 しかし、変更表の更新には複合トリガーを使用しなければ出来ないというのはわかったのですが、 うまいことコンパイルできません。下記に前提条件と自分なりに作成したトリガーをを記載しますので どなたか助けてください。 <前提条件> ・セットされる社員番号はプライマリーキーとなっている。 ・更新される条件はTBL1のフィールド:[データ区分]が2or3のとき <作成したトリガー> CREATE OR REPLACE TRIGGER TRG_SET_AUTO_SHAIN_NO FOR INSERT ON CM_PORTAL_SHAIN COMPOUND TRIGGER REFERENCING OLD AS OLD NEW AS NEW WHEN (NEW.DATA_KBN in (2,3)) DECLARE GRP_CD VARCHAR2(3); SEQ_NO NUMBER(4); NEW_SET_NO VARCHAR2(7); AFTER STATEMENT IS BEGIN IF :NEW.DATA_KBN = 2 THEN select SQ.GROUP_CD,SQ.SEQUENCE_NO + 1 into GRP_CD,SEQ_NO from CM_HAKEN_GROUP_SEQUENCE_MT SQ where SQ.GROUP_CD = '999'; ELSE select SQ.GROUP_CD,SQ.SEQUENCE_NO + 1 into GRP_CD,SEQ_NO from CM_HAKEN_GROUP_SEQUENCE_MT SQ where SQ.GROUP_CD = '888'; END IF; NEW_SET_NO := substr(GRP_CD,LPAD(SEQ_NO,4,0)); INSERT INTO CM_PORTAL_SHAIN (SHAIN_NO,SHIMEI_LOCAL,DATA_KBN) VALUES (NEW_SET_CD,:NEW.SHIMEI_LOCAL,:NEW.DATA_KBN); AFTER EACH ROW IS BEGIN INSERT INTO CM_PORTAL_SHAIN (SHAIN_NO) VALUES (NEW_SET_NO) END; / ちなみにこれでコンパイルするとエラーが発生します・・・ どこがいけないのでしょうか?

  • JDBCで配列を使ったSQL文(INSERT)

    早速ですがお願いします。例えば下のプログラムでのSQL文なのですが、配列str1[0]の中身”みかん”をINSERTしたいのですが、やりかたがわかりません。プログラミングの素人なので簡単な質問で申し訳ないですけど、どなたか教えてくれないでしょうか? ちなみにこのプログラムでstr1[0]のところを直接みかんと入れたらデータベースに追加することはできました。 import java.sql.*; class jdbc{ public static void main(String args[]){ String[] str1 = new String[1]; str1[0] = "みかん"; try{ Class.forName("org.postgresql.Driver"); String url = "jdbc:postgresql:test"; String user = ""; String password = ""; System.out.println("URL :" + url); System.out.println("USER :" + user); System.out.println("PASSWORD :" + password); Connection conn = DriverManager.getConnection(url, user, password); Statement stmt = conn.createStatement(); int insertCount = stmt.executeUpdate("INSERT INTO shinamono (hinmei,nedan) VALUES ('+str1[0]+', 1500)"); if (insertCount >0){ System.out.println("追加しました"); }else{ System.out.println("追加できませんでした"); } conn.commit(); stmt.close(); conn.close(); }catch(SQLException e){ e.printStackTrace(); }catch(Exception e){ e.printStackTrace(); } } } なおエラーメッセージは次の通りです。 java.sql.SQLException: ERROR: column "みかん" does not exist at org.postgresql.Connection.ExecSQL(Connection.java:533) at org.postgresql.jdbc2.Statement.execute(Statement.java:294) at org.postgresql.jdbc2.Statement.executeUpdate(Statement.java:78) at jdbc.main(jdbc.java:21)

  • 次の掲示板PHPにアクセスすると

    <?php echo "<form method=\"post\" action=\"{$_SERVER['PHP_SELF']}\">"; echo "本文:<input type=\"text\" size=\"80\" name=\"contents\">"; echo "<input type=\"submit\" value=\"送信\">"; echo "</form>"; $con=pg_connect("dbname=gomidb user=gomiuser host=127.0.0.1"); $contents=$_POST['contents']; if ($contents) { $contents=pg_escape_string(htmlspecialchars($contents)); pg_query($con,"insert into gomibbs(contents) values('$contents')"); } $rs=pg_query($con,"select * from gomibbs"); while($row=pg_fetch_array($rs)) { print $row['no'].":".$row['contents']."<br>"; } pg_close($con); ?> エラーになります ところが pg_query($con,"insert into gomibbs(contents) values('$contents')"); の所を pg_query($con,"insert into gomibbs(no,contents) values(1,'$contents')"); とすれば一度だけOKです どうすれば良いでしょうか?

    • ベストアンサー
    • PHP