質問投稿でgooポイントが当たるキャンペーン実施中!!>>

10gを使用しています。

create global temporary ~ preserve rowsとしているのにも関わらず
セッション終了時にテーブルが削除されないのですがなぜでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (2件)

付け加えると、「CREATE GLOBAL TEMPORARY」で作った一時ファイルはアクセス権限があるユーザーからはセッション開始時点ですでに存在するように見えます。


ただ、セッションが異なれば、それぞれ独立して扱われます。

この回答への補足

テーブル自体をdropしてくれないのでしょうか?

また自分でdropしようとしたらエラーになってしまいました。
アプリを完全に終了してから再びアプリを実行するとdropできます。
これは仕様でしょうかバグでしょうか?

補足日時:2012/01/15 11:43
    • good
    • 0

こんにちわ。



> create global temporary ~ preserve rowsとしているのにも関わらず
> セッション終了時にテーブルが削除されないのですがなぜでしょうか?
テーブルは削除されません。

ご存知かと思いますが、一時表はデータをInsert したセッション/トランザクション
からしかデータを参照できません。
preserve rows を指定すると、セッション終了時にレコードが削除されます。

この回答への補足

セッション終了時にレコードが削除?

テーブルそのものが削除されるわけではないのですか?
テーブル自体(レコードではなく)は任意で削除しないと
いけないものなのでしょうか?

補足日時:2012/01/06 23:16
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q一時表 を表単位で

お世話になっております。
Oracle10gで テーブル単位でTemporary Tableが出来ないか
試行錯誤しております。

要件として、Webアプリケーションで100万件のデータをSelectします。
その際、全データを取得するには、遅すぎるので、分割して取得しています。
現在では、C#で、サーバ側で取得Temporary Table Insertして、そのデータを参照するようにしているのですが、
Insertが遅いのと、C#に一度持ってきていますので、メモリが不安な状態です。

これを、create global temporary table CRE_TABLE_NAME as select * from TABLE_NAME
にして、CRE_TABLE_NAMEを参照したいのですが、dropタイミングがつかめませんでした。
そこで、このテーブルが自動的にdropしたいのですが、何か良い案はありませんでしょうか?

思いついたのが、temporary tableにテーブル情報を保持して、sessionが切れた、時点で消えるのを利用して、テーブルdropのトリガーを記載しようと思ったのですが、そのトリガーを思いつきませんでした。

どなたか、代替案または、実装したことがある方、よろしくお願いします。

お世話になっております。
Oracle10gで テーブル単位でTemporary Tableが出来ないか
試行錯誤しております。

要件として、Webアプリケーションで100万件のデータをSelectします。
その際、全データを取得するには、遅すぎるので、分割して取得しています。
現在では、C#で、サーバ側で取得Temporary Table Insertして、そのデータを参照するようにしているのですが、
Insertが遅いのと、C#に一度持ってきていますので、メモリが不安な状態です。

これを、create global temporary table CRE_TABLE_NA...続きを読む

Aベストアンサー

ごめんなさい、わかりません。

なんらかのイベントというかトリガーというかアクションによって、テンポラリ表領域に使用したテーブルを削除するように作成するしかないようですね。定期的に削除するジョブを走らせておくとか。

PRESERVE ROWSを指定して作成した場合、切捨てはするけれどDROP はしないですね。「CREATE GLOBAL TEMPORARY TABLE ~ as select * from」 だと、DROPしないといけないので使えませんね。

Qテーブルの存在チェックについて

oracle初心者です。
テーブルの存在をチェックする命令はあるのでしょうか?
オンラインマニュアルやSQLポケットリファレンスなどを参考に探したのですが見つかりませんでした。
SELECT count(*) FROM テーブルA・・・などでステータスを判断(ZERO以外は未存在)し存在有無を確認するような方法しかないのでしょうか?
よろしくお願いします。

Aベストアンサー

データディクショナリの USER_TABLES を利用すると良いでしょう。これは表と同様に扱えます。

例えばこのような感じです

select * from user_tables
where table_name = 'TABLE_A';

TABLE_A が(自分のテーブルとして)あれば1件引っかかりますし、なければ結果0件になります。

データディクショナリには他にもいろいろありますので詳しくは参考 URL をご参照ください。

参考URL:http://cyberam.dip.jp/database/oracle/oracle/dd/dd_main.html

Q3つの表の外部結合

表A、B、Cの3つがあり、Aのすべての行を出力したいと考えています。
外部結合を用いるのだとは思うのですが、3つの表に対して行う場合の
書き方がわからず困っています。
ご教授いただけないでしょうか?
select * from a,b,c
where a.商品ID =b.商品ID (+) and b.商品ID (+) =c.商品ID (+)
としてみましたが、うまくいきませんでした。

Aベストアンサー

ansi構文の趣旨からいえば、結合条件と絞り込み条件は分けて書くので・・

select *
from a
left join b on (a.商品ID =b.商品ID)
left join c on (b.商品ID =c.商品ID)
where a.年月 = 任意の値

と書くのが一般的でしょうね。

QSELECTで1件のみ取得するには?

こんにちわ。
いまORACLE9iを使用している者です。

ACCESSでは
SELECT TOP 1 項目名 FROM テーブル名
ORDER BY 項目名;
で並べ替えたデータ群のうち,先頭の1件だけを
取ることができますが,
ORACLEでそのような機能(SQL)はあるでしょうか?
教えてください。
よろしくお願いします。

Aベストアンサー

order by と rownum を併用する場合は注意が必要です。

[tbl01]
cola | colb
------------
1000 | aaaa
1001 | bbbb

というデータがある場合、
select cola from tbl01 where rownum < 1 order by cola desc;
とすると、「1001」ではなく、「1000」が返されます。
これは、order by の前に rownum < 1 が適用されてしまうからです。

解決するには、
select aaa from (select cola aaa from tbl01 order by cola desc) where rownum = 1;
とすれば良いです。

QViewにインデックスは張れますか?

件名の通りなのですが、作成したViewが遅くて困っています。
改善方法としてはViewを作成しないで従来のSQLにインデックスを張って取得する方法にしようかなと考えています。
なにかいい方法はありますか?

Aベストアンサー

Viewの元テーブルに適切なIndexを貼る、ではいけないのですか?

QOracle(オラクル)で、日付時刻型の検索方法について

質問させていただきます。
データベースはオラクルを使っていて、
SQL文で、抽出するときにエラーが出て困っています。

日付時刻型が「2005/05/26 19:13:00」という感じで入ってます。
2005/05/26 を抽出したいのですが、
BETWEEN '2005/05/26 00:00:00' AND '2005/05/26 23:59:59'

だと、エラーでできません。
どなた様か、ご教授よろしくお願いしますm(_ _)m

Aベストアンサー

日付検索を行う場合は、以下のように書式を含める必要があります。

col BETWEEN TO_DATE('2005/05/26 00:00:00','YYYY/MM/DD HH24:MI:SS') AND TO_DATE('2005/05/26 23:59:59','YYYY/MM/DD HH24:MI:SS')

ただ、厳密には

col >= TO_DATE('2005/05/26', 'YYYY/MM/DD')
AND
col < TO_DATE('2005/05/27', 'YYYY/MM/DD')

と書くべきでしょうね。

Qデータベース内のテーブル名の取得

お世話になります。
初心者的な質問でしたらすいません。
SQL文にてデータベース内のテーブル名を
調べることができると聞いたことがあるのですが、
可能でしょうか。

もし、可能であれば、SQLの記述を教えてください。
お願いします。

Aベストアンサー

select * from tab;

私の場合、テーブル名だけ手っ取り早く知りたいとき、↑を打ちます。その他の情報も知りたいときは#2さんの仰るとおり、user_tablesで取得します。

Qsqlplusで表示が変なので、出力を整形したい。

いつもお世話になっています。

サーバにアクセスしてsqlplusで、
データを調べたいのですが、
出力形式が見づらくて困っています。

よくわからいのですが、
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------
1の値 2の値
3の値
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------

上記のように意味不明な形式で出てきます。

例えばこんな風に

select カラム1,カラム2,カラム3 from hoge;

カラム1 1の値
---------------------------
カラム2 2の値
---------------------------
カラム3 3の値

等のように分かりやすく表示できないでしょうか?

ちなみにOracle9iR2を使用しています。
sqlに関するツールは使用できないルールでして、あくまでsqlplusのコマンド上でみやすくしなければなりません。

分かりづらくですいませんが、皆さま、ご教授お願いします。

いつもお世話になっています。

サーバにアクセスしてsqlplusで、
データを調べたいのですが、
出力形式が見づらくて困っています。

よくわからいのですが、
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------
1の値 2の値
3の値
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
-----------------------...続きを読む

Aベストアンサー

SQLPLUSを起動して、

SQL>set linesize 列数

でどうだ。

SQL>show linesize

で確認ができる。

QMAX値を条件にデータを取得するには?

SQL文で困っています。
ご教授下さい。


下記のようなデータがあった場合、それぞれの区分毎に
年月が最大(最新)のデータを取得したいです。
(実際には1レコードにその他項目があり、それらも取得します。)
<検索対象データ>
区分 年月   金額
-----------------------------
A   200412  600
A   200503  560
B   200311  600
B   200508  1000
B   200504  560
C   200508  400
C   200301  1100


<取得したいデータ>

区分 年月   金額
-----------------------------
A   200503  560
B   200508  1000
C   200508  400

よろしくお願いします。

Aベストアンサー

テーブル名をXXXとすると次のようなSQLでよいと思います。(最善の方法かどうかは自信がないですが)

select B.* from (select 区分, max(年月) as 年月 from XXX group by 区分) As A
inner join XXX as B on A.区分 = B.区分 and A.年月 = B.年月
order by B.区分

QSQL、2つのテーブルで条件一致したものだけdeleteする方法は?

オラクルSQLで質問です

やりたいことは、
テーブルAから以下の条件に該当するデータを削除する。
基本的にはテーブルBの内容と比較して、一致したもの。

条件(全ての条件を満たすこと)
 テーブルA.AAA = テーブルB.AAA
 テーブルA.BBB = テーブルB.BBB
 テーブルB.CCC > 0


調べたところ、SQLサーバでは以下のように
from を2つ書いて実現できるようです。
が、今回はオラクルなので文法エラーになります。

delete FROM テーブルA FROM テーブルB
where
テーブルA.AAA = テーブルB.AAA
AND
テーブルA.BBB = テーブルB.BBB
AND
テーブルA.CCC > 0
;
commit;


よろしくお願いします

Aベストアンサー

delete 文の細かい構文はちょっと覚えてませんが
サブクエリ使えばいいんじゃないですか

delete from table_a
where 主キーカラム = (
select table_a.主キーカラム
from table_a, table_b
where
指定の条件
)


人気Q&Aランキング