AccessとOracle、#Deletedの謎
Oracleで、Accessのオートナンバーと似たことをやろうとするとシーケンスとトリガを使ってこうなる。
"ID"がオートナンバーにしたい列ね。
実はapex経由でテーブルを作成すると、主キー用のシーケンスとトリガ(上記みたいなの)を自動的に作ってくれるオプションが使えるのでいちいちやりかたを覚えなくて良い上記のようなことは覚えなくて良い。とはいえWeb上のフォームでポチポチやるよりもDDL文を手で書いて実行した方が早いので今後のためにメモ。
それはそうと、こうして作った「主キー列をDBMS側で自動生成する」テーブルを Access(2000とか2007とか)からリンクテーブルとして使おうとすると、行をINSERTするたびにいちいち"#Deleted"になってしまう。
なんでだろうと思って色々試してみたのだけれど、日本語のテーブル名やカラム名は問題ないみたいなのだが、どうやらVARCHAR2列の最大長256以上?だとそうなるみたいだ。ODBCの型にうまくマッピングできないんだろうか。
他にもID列の長さがint型の範囲を超えている(小数部があったり、桁数が10桁以上あったり)場合や、ODBCドライバが古い場合などにも#Deletedが出るとのこと。
"ID"がオートナンバーにしたい列ね。
CREATE TABLE "領収書"
( "ID" NUMBER(7,0),
"日付" DATE,
"発行元" NVARCHAR2(64),
"但し書き" NVARCHAR2(64),
"税込金額" NUMBER(8,0),
"領収書番号等" NVARCHAR2(64),
"主な品目" NVARCHAR2(64),
"決済方法" NVARCHAR2(64),
"記帳済み" NUMBER(2,0),
"仕分け候補" NVARCHAR2(64),
CONSTRAINT "領収書_PK" PRIMARY KEY ("ID") ENABLE
);
CREATE SEQUENCE "領収書_SEQ" NOMAXVALUE NOCACHE NOORDER NOCYCLE;
CREATE OR REPLACE TRIGGER "BI_領収書"
before insert on "領収書"
for each row
begin
select "領収書_SEQ".nextval into :NEW.ID from dual;
end;
ALTER TRIGGER "BI_領収書" ENABLE;
実はapex経由でテーブルを作成すると、主キー用のシーケンスとトリガ(上記みたいなの)を自動的に作ってくれるオプションが使えるのでいちいちやりかたを覚えなくて良い上記のようなことは覚えなくて良い。とはいえWeb上のフォームでポチポチやるよりもDDL文を手で書いて実行した方が早いので今後のためにメモ。
それはそうと、こうして作った「主キー列をDBMS側で自動生成する」テーブルを Access(2000とか2007とか)からリンクテーブルとして使おうとすると、行をINSERTするたびにいちいち"#Deleted"になってしまう。
なんでだろうと思って色々試してみたのだけれど、日本語のテーブル名やカラム名は問題ないみたいなのだが、どうやらVARCHAR2列の最大長256以上?だとそうなるみたいだ。ODBCの型にうまくマッピングできないんだろうか。
他にもID列の長さがint型の範囲を超えている(小数部があったり、桁数が10桁以上あったり)場合や、ODBCドライバが古い場合などにも#Deletedが出るとのこと。
ラベル: Oracle

0 件のコメント:
コメントを投稿
<< ホーム