Oracleで開発してはまったことまとめ

ようやくOracleを使った開発もひと段落
今までMySQLしか使ったことがなかったのでOracleの不便さを勉強できてとてもためになった気がするのでまとめておきます

1. ORA-00911: 文字が無効です。

使っちゃいけない文字を使っていると出るエラー
mysqlからのデータを突っ込もうとしたときによく起きる

`table_name` の `が問題だったり(oracleの場合は”)
行末の ; が問題だったりする(;は不要)

または日付を文字列で入れてたりしてもこのエラーが起きるのでおとなしくsysdateに書き直すとよい
はまるのはどの文字が原因なのか詳しく教えてくれないのが原因だったりもする

2. ORA-01758: 必須列(NOT NULL)を追加するには、表を空にする必要があります

mysqlだと普通に出来るがoracleだと出来ない
~~~
ALTER TABLE テーブル名 MODIFY カラム名 型 NOT NULL DEFAULT デフォルト値;
~~~

こういうことがしたい場合は↓の方法がある

  • データをすべて削除してから、実行し直す。
  • NOT NULL 制約なしでカラムを追加し、データを設定した後に、NOT NULL 制約を追加する。

ORACLE/ORA-01758 – centromezzo wiki

※Oracleの人は基本、「データをすべて削除してから、実行し直す。」をするようです。

3. ORA-00972: 識別子が長すぎます。

mysqlでは64バイトまでテーブル名やカラム名が許されていますがOracleは30バイトまで
テーブル名+カラム名+seqなんていう命名規則にすると間違いなく入らなくなります。。

4. ORA-01704: 文字列リテラルが長すぎます

sqlの長さが4000バイトをこえるとエラーに
mysqlのつもりでtext型を1テーブルに複数個作るとクエリの発行が大変

[Oracle] LOBデータの基本的な扱い方|Archive Redo Blog

5. auto_incrementがない

これが一番困ったかもしれない

Oracle オートインクリメント – Google 検索

ぐぐってみると基本的にはトリガーを使いなさいと出てくる

~~~
CREATE OR REPLACE TRIGGER TRG_TEST_USER
BEFORE INSERT ON TEST_USER FOR EACH ROW
BEGIN
SELECT SEQ_TEST_USER.NEXTVAL INTO :NEW.ID FROM DUAL;
END;
~~~
OracleでAutoIncrement – niwaのoracle日記

自分は天邪鬼×トリガーを使いたくなかったのでフレームワーク部分で無理やり吸収した
↓な感じ
~~~
$seqTable = ($seqName) ? $seqName : $tableName . “_” . $colName . “_seq”;
$sql = “SELECT “.$seqTable.”.NEXTVAL from dual”;
~~~
ここでもカラム名の文字数で引っかかって色々面倒だった。。30バイトで無理やり切っちゃえばよかったかもしれない

6. limit offsetが大変

~~~
select name, age from (select name, age, rownum as rn from HOGE)
where 10 <= rn and rn <= 15; ~~~ Oracleでlimit offsetもどき – よねのはてな

こんな感じに必ずサブクエリが必要になる
自力でsqlを書いていると大変すぎるので、ここはライブラリに全部お任せしました
ただし、サブクエリの中でlimit句が使えなくなってしまってそれはそれで不便に(⊃д⊂)

【送料無料】パーフェクトPHP

【送料無料】パーフェクトPHP
価格:3,780円(税込、送料別)

コメント

タイトルとURLをコピーしました