はじめての親子ハイキングに挑戦!! >>

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

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

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

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

A 回答 (2件)

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

この回答への補足

ありがとうございます。

おっしゃられているように、
JavaではWHEREの個所を条件により変化させて編集するようにしてます。

しかしながら、
SELECT * FROM TESTTBL;
みたいな、ごく単純なSQL文に試しに変えてみてもエラーになるので、
SQL文の問題ではないと認識してます。


よく解りませんが、
文字コード?、環境?、コネクション?当たりに問題がある場合はないのでしょうか?

補足日時:2010/07/08 23:25
    • good
    • 0
この回答へのお礼

自己解決しました。
SQL文が間違ってました。
正確にはSQL文は間違ってなかったんですが、
最後のセミコロン(;)が不要でした。
セミコロンを削除したら動きました。

お騒がせしました。

お礼日時:2010/07/09 16:43

そのSQL文を記載してください。



SQL*Plusで動かしたものと、Java埋め込みor生成されたものを両方。

この回答への補足

すいません。
諸事情で載せられませんが、
Javaで編集したSQL文をコピペしてSQLPlusで動かしたんで、
SQL文自体は問題ないと思います。
それに、試しにSQLiteに同じテーブルを作成して、接続させてみたところ、
正常にSQL文が発行できました。

補足日時:2010/07/08 21:50
    • good
    • 0

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

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

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

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

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

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

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関数を使うのが一般的かと思います。

Q複数行をINSERTで『ORA-00911: 文字が無効です。』というエラーが出てしまいます。

SQL初心者です。
CommonSQLEnvironmentを使用して複数行のデータを登録したいのですが、

******************************************
INSERT INTO KAIIN_MST (NO, FNAME, NAME, YMD, FLG) VALUES ('001', 'ヤマダタロウ', '山田太郎',TO_CHAR(SYSDATE, 'YYYYMMDD'), '1');
INSERT INTO KAIIN_MST (NO, FNAME, NAME, YMD, FLG) VALUES ('002', 'ヤマダハナコ', '山田花子',TO_CHAR(SYSDATE, 'YYYYMMDD'), '1');
******************************************

この状態で実行すると、『ORA-00911: 文字が無効です。』と出ます。
セミコロン(;)を抜いて

******************************************
INSERT INTO KAIIN_MST (NO, FNAME, NAME, YMD, FLG) VALUES ('001', 'ヤマダタロウ', '山田太郎',TO_CHAR(SYSDATE, 'YYYYMMDD'), '1')
INSERT INTO KAIIN_MST (NO, FNAME, NAME, YMD, FLG) VALUES ('002', 'ヤマダハナコ', '山田花子',TO_CHAR(SYSDATE, 'YYYYMMDD'), '1')
******************************************

を実行すると『ORA-00933: SQLコマンドが正しく終了されていません。』と出ます。

ちなみに1行のみ実行で

******************************************
INSERT INTO KAIIN_MST (NO, FNAME, NAME, YMD, FLG) VALUES ('001', 'ヤマダタロウ', '山田太郎',TO_CHAR(SYSDATE, 'YYYYMMDD'), '1')
******************************************

は成功します。
また、

******************************************
INSERT INTO KAIIN_MST (NO, FNAME, NAME, YMD, FLG)
VALUES
('001', 'ヤマダタロウ', '山田太郎',TO_CHAR(SYSDATE, 'YYYYMMDD'), '1'),
('002', 'ヤマダハナコ', '山田花子',TO_CHAR(SYSDATE, 'YYYYMMDD'), '1');
******************************************

というものも試してみましたが駄目でした。
CommonSQLEnvironmentでの複数行追加の良い方法がありましたら教えて頂ければ幸いです。
宜しくお願い致します。

SQL初心者です。
CommonSQLEnvironmentを使用して複数行のデータを登録したいのですが、

******************************************
INSERT INTO KAIIN_MST (NO, FNAME, NAME, YMD, FLG) VALUES ('001', 'ヤマダタロウ', '山田太郎',TO_CHAR(SYSDATE, 'YYYYMMDD'), '1');
INSERT INTO KAIIN_MST (NO, FNAME, NAME, YMD, FLG) VALUES ('002', 'ヤマダハナコ', '山田花子',TO_CHAR(SYSDATE, 'YYYYMMDD'), '1');
******************************************

この状態で実行すると、『ORA-00911: 文字が...続きを読む

Aベストアンサー

このツールは使ったことがなかったのですが、こんな感じで出来そうです。

1.テキストエディタを開いて各INSERT文(末尾にセミコロンあり)を書いて、ファイル名を
  data.sql(名前は適当)として保存します。

==== data.sqlの内容 ====
INSERT INTO KAIIN_MST (NO, FNAME, NAME, YMD, FLG) VALUES ('001', 'ヤマダタロウ', '山田太郎',TO_CHAR(SYSDATE, 'YYYYMMDD'), '1');
INSERT INTO KAIIN_MST (NO, FNAME, NAME, YMD, FLG) VALUES ('002', 'ヤマダハナコ', '山田花子',TO_CHAR(SYSDATE, 'YYYYMMDD'), '1');
========================

2.Common SQL Environmentで「データベース」→「SQLスクリプト実行」を選び、
  上記で作成した「data.sql」を選択する(画面下のボタンでも可)

3.コミットする。

このツールは使ったことがなかったのですが、こんな感じで出来そうです。

1.テキストエディタを開いて各INSERT文(末尾にセミコロンあり)を書いて、ファイル名を
  data.sql(名前は適当)として保存します。

==== data.sqlの内容 ====
INSERT INTO KAIIN_MST (NO, FNAME, NAME, YMD, FLG) VALUES ('001', 'ヤマダタロウ', '山田太郎',TO_CHAR(SYSDATE, 'YYYYMMDD'), '1');
INSERT INTO KAIIN_MST (NO, FNAME, NAME, YMD, FLG) VALUES ('002', 'ヤマダハナコ', '山田花子',TO_CHAR(SYSDATE, 'YYYYMMDD')...続きを読む

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関係演算子が無効です。

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

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

Aベストアンサー

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


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

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

で確認ができる。

Q日本語の表名、列名の利用について

お世話になっております。
Oracle10g、11gで、できれば日本語の表名、列名を使用しようと思っております。検索してみると、9iあたりでは問題があるようですが、10g、11gでは該当の記述を見つけることができませんでした。
10g、11gでは、表名や列名に日本語を使っても問題はないでしょうか。
関連した情報の場所等をお教えいただければ幸いです。
どうか、よろしくお願いいたします。

Aベストアンサー

 テーブルを使用するのも作成するのも面倒がありますが、構文上の問題はありません。というのが、答えになるでしょうか。
 表名や列名に日本語文字を使用する場合は、名前を" "で囲う必要があります。制約はただこれだけです。(マニュアルに記載があります。)
 ただこれだけのことなので、自分で開発したデータベースを、自分で作成したアプリで利用する場合には、何の問題もありません。ただし、日本語とシングルバイトの英文字が混在する場合は注意してください。この場合、英文字の方の大文字小文字をきちんと区別する必要があります。""で囲っていない場合は、総ての名前は大文字変換されて使用されるのですが、囲った場合はこの変換がないからです。

 それより、やっかいごとは外からやってきます。
 データベースの開発・メンテナンスにsql plusやEMだけを利用しているなら大丈夫ですが、サードパーティー製のソフトを利用している場合は、そのソフトが日本語表名・列名を正しくサポートしていることが必要です。
 また、アプリケーションの作成の際に、ライブラリーなどを利用しているのであれば、これらも正しく日本語表名・列名に対応している必要があります。
 なぜなら、普通列名や表名を" "で囲うということはしないからです。囲うことによる副作用もありますから、ライブラリーやソフトが日本語文字が混在していることを正しく認識して、日本語の混じっている時だけ正しく" "で囲うという処理が必要で、これは、明らかに特殊な処理ですから。
 
 まぁ、今までの経験からすると、囲わなくても正しく動くことが多いです。が、正式に構文として明記されている以上、動く方が偶然であると認識しておくことは必要でしょう。特に、二バイト目のコードがASCIIコードの特殊文字の文字コードと同じになっているいくつかの文字あたりが鬼門になると思います。
 表名も列名もとっても見やすくなり、メンテナンスも楽になります。が、ある程度のリスクを抱えての選択であると言うことは意識しておく必要はあるでしょう。

 作法としてやって良いかどうかは、宗教論争の面がありますで、避けることにします。

 テーブルを使用するのも作成するのも面倒がありますが、構文上の問題はありません。というのが、答えになるでしょうか。
 表名や列名に日本語文字を使用する場合は、名前を" "で囲う必要があります。制約はただこれだけです。(マニュアルに記載があります。)
 ただこれだけのことなので、自分で開発したデータベースを、自分で作成したアプリで利用する場合には、何の問題もありません。ただし、日本語とシングルバイトの英文字が混在する場合は注意してください。この場合、英文字の方の大文字小文字をき...続きを読む

QPL/SQL PLS-00103エラーについて

PL/SQL PLS-00103エラーについて

夜分遅くに申し訳ございません。
PL/SQLのコーディングを実施し、コンパイル中にPLS-00103エラーが発生してしまったのですが、
対処方法がわからず困ってしまいました。

・メッセージ内容:”PLS-00103: 記号"="が見つかりました。”


上記メッセージで指定されていたソース内容(イメージ)↓
--------------------------------------------------------------


BEGIN
LV_STEP := '**登録処理開始'  -- 左記の:=の=部分がエラーメッセージで指定されていました。(LV_STEPはログ出力用の変数)

CURSOR AAAA IS
SELECT GG.EPLY_NO GG_EPLY_NO
,GG.R_CD GG_R_CD
,GG.S_CARD GG_S_CARD

    ・
   ・
FROM GRA_GRA_TR GG



------------------------------------------------------------------

といった感じなのですが、
このPLS-00103エラーの対処方法をどなたかご教示いただけませんでしょうか。
よろしくお願いいたします。

PL/SQL PLS-00103エラーについて

夜分遅くに申し訳ございません。
PL/SQLのコーディングを実施し、コンパイル中にPLS-00103エラーが発生してしまったのですが、
対処方法がわからず困ってしまいました。

・メッセージ内容:”PLS-00103: 記号"="が見つかりました。”


上記メッセージで指定されていたソース内容(イメージ)↓
--------------------------------------------------------------


BEGIN
LV_STEP := '**登録処理開始'  -- 左記の:=の=部分がエラーメッセージで指定されていま...続きを読む

Aベストアンサー

PLS-00103は構文解析エラーです。
指定されている行にはセミコロンがありませんが、
これが原因だとすると、
エラーメッセージは後ろに続く文で出るはずです。
エラーメッセージで示された箇所より前の部分(行)を調べてください。

# ソースの内容をイメージで示されても困ります。
# 回答者に超能力者は(おそらく)いないと思いますので
# 勘で答えるよりほか仕方がありません。

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

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

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

Qselect句副問い合わせ 値の個数が多すぎます

SQL初心者です。

ORACLEで、SELECT句に副問い合わせを付けたところ、ORA-00913:値の個数が多すぎますとエラーになってしまいます。
解決法をご教授願います。

同一テーブルの同一項目を複数項目として取得したいのです。

SELECT
(SELECT
B.DDD
,B.EEE
FROM A_MST A
,B_MST B
WHERE A.AAA = B.BBB
AND A.BBB = CMST.CCC),
(SELECT
B.DDD
,B.EEE
FROM A_MST A
,B_MST B
WHERE A.AAA = B.BBB
AND A.BBB = CMST.FFF)
FROM C_MST CMST
WHERE
CMST.A_RYAKU = '123'

Aベストアンサー

WITH AB AS (
SELECT B.DDD AS DDD
,B.EEE AS EEE
,A.BBB AS BBB
FROM A_MST A
,B_MST B
WHERE A.AAA = B.BBB
)
SELECT (SELECT A.DDD FROM AB A WHERE A.BBB = CMST.CCC) AS DDD_CCC
,(SELECT A.EEE FROM AB A WHERE A.BBB = CMST.CCC) AS EEE_CCC
,(SELECT A.DDD FROM AB A WHERE A.BBB = CMST.FFF) AS DDD_FFF
,(SELECT A.EEE FROM AB A WHERE A.BBB = CMST.FFF) AS EEE_FFF
FROM C_MST CMST
WHERE CMST.A_RYAKU = '123'


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

人気Q&Aランキング