プロが教えるわが家の防犯対策術!

 DBサーバを3台用意して、あるSQLを実行したところ、2台では期待した結果が得られたのですが、1台では「ORA-00936: 式がありません。」のエラーになってしまいます。
 SQLの余分な空白を削除すると「右カッコがありません」「FROMがありません」等とエラーメッセージが変わるので、SQLの途中までしか認識されていない様子です。

 SQLは2段階のサブクエリーで構成されており、全体の長さは1k程度です。
 2台のPCでは問題なく動作するので、SQLが間違っていることはありません。
 また、サブクエリーの中で「UNION ALL」を使っているのですが、これを「UNION」とするとエラーは起きません。

 なにか、原因として考えられることはないでしょうか?


 PCの環境は、
  OS = WinXP SP2
  DB = Oracle 9.2.0.1 、同一dmpファイルをインポートした状態
となっていますが、それぞれ別の者がインストール作業を行ったので、若干の違いがあるかも知れません。(インストール時のメモでは違いはありません)

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

A 回答 (1件)

ソフトウェア構成が全く同じなのであれば、ハードウェア障害の可能性も考えられますよね。


見た目は正常に稼動しているようでも、メモリなどが微妙~に破損していて、特定のアクセス条件が重なったときにだけ障害を起こす、なんて事例もあります。

あとは、SQL*Plusを使用して実行されているのであれば、9.2.0.1のSQL*Plus(Windows)は、なんか妙な動きをする場合がありますよね。
例えば、サーバかクライアントのバージョンを9.2.0.3に上げてみるのも、ひょっとしたら効果があるかも。(パッチはOTNで無償公開されていたはず。)
もしサーバがWindows Server 2003なら、9.2.0.3以降が正式対応ですよね。

あとは、見た目は同じでもSQL中の改行コードがCrLfかLfのみかで、動作が違っているのかも。
    • good
    • 1
この回答へのお礼

回答ありがとうございました。お礼が遅れてすみません。
いろいろ試してみたのですが、解決には至りませんでした...。

お礼日時:2005/07/22 10:20

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

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

このQ&Aを見た人はこんなQ&Aも見ています

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

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

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

Q『ORA-00936: 式がありません。』の回避方法。

年の瀬を迎え、気分よく年を越したいのですが、このままでは越せるかどうかわかりません。。。
そこで、お力を貸して下さいm(__)m

PL/SQLにてプログラミング中なのですが、SQL実行時に引数の中身が空の為に、ORA-00936: 式がありません。のメッセージが出てしまいます。
これを回避する方法として、

EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('取得項目不正');

としてエラーを拾っているのですが、これでは全てのエラーを拾ってしまうので、ORA-00936のみを拾えるEXCEPTIONをお知りの方は教えて下さい。お願いします。

Aベストアンサー

こんばんは。

そんな事言わずに、安心して年を越してください・・・。

DECLARE
 ○○ EXCEPTION; --例外の変数
 PRAGMA EXCEPTION_INIT(○○, -00936);
BEGIN
・・・・・・・・・・
EXCEPTION
 WHEN ○○ THEN
 ・・・・・・・・・・
END;

適当な名前で例外ようの変数を定義した後、
EXCEPTION_INITプラグマで、ORACLEの内部エラーコードと関連付けます。
後はキャッチするだけです。

ではでは・・・。
(^^ゞ

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.年月 = 任意の値

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

QOracleで「文字が無効です」のエラーが出ます

Oracleで「文字が無効です」のエラーが出ます

JavaからOracleに接続して、SELECT文を発行していますが、何度試しても上記のエラーが出ます。
発行しているSELECT文を、SQLPlusから打ち込むとちゃんと実行できます。
何が悪いのか見当がつきません。
お知恵をお貸しください。
ちなみに、対象テーブルの項目はvarchar2とnumberだけの項目ばかりで、日本語は使ってません。
また、Oracle初心者です。

環境
端末:WindowsXP
Oracle:10g Express Edition ※文字コードはAL32UTF8
IDE:Eclipse3.5 ※設定-一般-ワークスペースのテキストファイルエンコードはUTF-8

Aベストアンサー

Java内で生成したSQL文を見ないとなんとも言えないけど。

Javaでリテラル吐き出して編集してますかね?
select UserID, UserName from mstUser where UserID = '001'; みたいな。
条件によって 001 の部分を変化させるような。


だったらJavaでシングルクォートを吐き出すところを二重にしてみるとどうかな?
ダブルクォートでは無いよ。二重に書くことでシングルクォート一個と解釈されればOKのはず。

そうしておかないとSQL文全体を文字列で扱うんだろうから、シングルクォートの対応が崩れる。

つくりとしては以下のように作成。
select UserID, UserName from mstUser where UserID = ''001''; みたいな。

SQL文を文字列変数に格納するんだろうから
'select UserID, UserName from mstUser where UserID = ''001'';'

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')

と書くべきでしょうね。

QCASE文のエラーについて

下記のように打つと「行1でエラーが発生しました。:
ORA-00905: キーワードがありません」というエラーが表示されます。どうすればいいでしょうか?

SELECT ENAME AS 名前, SAL AS 給与, CASE SAL WHEN SAL <= 1100 THEN SAL * 1.055 WHEN SAL <=1400 THEN SAL * 1.05 WHEN SAL <=3000 THEN SAL * 1.0 ELSE SAL*1.045 AS 昇給率 FROM EMP;

Aベストアンサー

2カ所誤りがあります。

1つ目

CASEに対するENDがない。(#1の指摘の通り)

2つ目

"CASE"キーワードの次に比較要素を書いていますが、
そぼ場合、"WHEN"キーワードの次に書くのは、比較式でなく
比較要素になります。

case ○ when △ then ▲ when □ then ■ else ◆ end

case when ○=△ then ▲ when ○=□ then ■ else ◆ end
は、同じ意味のCASE式ですが、これをゴチャゴチャに使っているのが、
間違いです。

SELECT
 ENAME AS 名前,
 SAL AS 給与,
 CASE WHEN SAL <= 1100 THEN SAL * 1.055
    WHEN SAL <=1400 THEN SAL * 1.05
    WHEN SAL <=3000 THEN SAL * 1.0
    ELSE SAL*1.045
 END AS 昇給率
FROM EMP;

のように書くと問題なく使えるかと思います。

2カ所誤りがあります。

1つ目

CASEに対するENDがない。(#1の指摘の通り)

2つ目

"CASE"キーワードの次に比較要素を書いていますが、
そぼ場合、"WHEN"キーワードの次に書くのは、比較式でなく
比較要素になります。

case ○ when △ then ▲ when □ then ■ else ◆ end

case when ○=△ then ▲ when ○=□ then ■ else ◆ end
は、同じ意味のCASE式ですが、これをゴチャゴチャに使っているのが、
間違いです。

SELECT
 ENAME AS 名前,
 SAL AS 給与,
 CASE WHEN SAL <= 1100 THEN...続きを読む

Q日付型カラムへのデータINSERT

お世話になります。ひとつご教授ください。

オラクル10g, ojdbc14でjdk1.4.2から接続です。

INSERT命令を使ってテーブルにレコードを追加する際に、DATE型のカラムに対して

INSERT TABLE_A (DATE1, ...) VALUES ('2006-4-27 12:00:00', ...);

を実行するとエラーORA-01861が出ます。そこで

INSERT TABLE_A (DATE1, ...) VALUES ('2006-4-27', ...);

このように記述して再度実行すると通ります。

このようなとき、時間の部分まで設定した値をカラムに格納したいときはどうしたらよろしいでしょうか?

よろしくお願いします。

Aベストアンサー

ごめんなさい。
説明と文例が違ってしまいました。
正しくはこちらです。

INSERT TABLE_A (DATE1, ...) VALUES (to_date('2006-4-27 12:00:00','yyyy/mm/dd hh24:mi:ss'), ...);
というように、to_date関数を使うのが一般的かと思います。

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.区分

Q関係演算子が無効です。

オラクルで作成しているのですが、関係演算子が無効です。と出ます。
どこを修正すればよいでしょうか

SELECT *
FROM 表,
(
SELECT col
FROM 表
WHERE col1,col2 >
)
WHERE col = MIN(col);

Aベストアンサー

No.1の補足にある
>col1もcol2も同じく小さければという条件
の意味が理解できませんでした。


どのようなデータから、どのような結果を取得したいのかを
具体的に書いてもらえればアドバイスできるかもしれません。

Q単一グループのグループ関数ではありません。

オラクル10を使っています。

select NAMAE max(TEN) from KYOUKA WHERE OK=1 and CLASS IS ('A', 'B', 'C');

で単一グループのグループ関数ではありません。
というエラーになります。

CLASS | OK | NAMAE | TEN |
--------------------------
A 1 a01 50
A 1 a02 60
B 1 b01 10
C 1 c01 70
C 0 c02 100

a02 60
b01 10
c01 70
という結果になってほしいです。

Aベストアンサー

SQLの根本的な文法が理解できていないのかと

GROUP BY 句について調べてみましょう


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング