12

Oracle データベースと、null 以外の列がいくつかあるテーブルがあり、すべてデフォルト値が設定されています。

挿入するデータに対して 1 つの挿入ステートメントを使用したいと思います。挿入された値が null かどうかを確認する必要はありません。

null が挿入されたときにデフォルトの列値にフォールバックする方法はありますか?

私はこのコードを持っています:

<?php
if (!empty($values['not_null_column_with_default_value'])) {
    $insert = "
        INSERT INTO schema.my_table
            ( pk_column, other_column, not_null_column_with_default_value)
        VALUES
            (:pk_column,:other_column,:not_null_column_with_default_value)
     ";
} else {
    $insert = "
        INSERT INTO schema.my_table
            ( pk_column, other_column)
        VALUES
            (:pk_column,:other_column)
     ";        
}

したがって、列を完全に省略する必要があります。そうしないと、「null 列を null 以外の列に挿入しようとしています」というエラーが表示されます。もちろん、私は複数のヌル可能列を持っているので、コード create insert ステートメントは非常に読みにくく、醜く、私はそれが好きではありません。

次のようなステートメントが 1 つあります。

INSERT INTO schema.my_table
    ( pk_column, other_column, not_null_column_with_default_value)
VALUES
    (:pk_column,:other_column, NVL(:not_null_column_with_default_value, DEFAULT) );

もちろん、それは仮説的なクエリです。Oracle DBMS でその目標を達成する方法を知っていますか?

編集

回答ありがとうございます。私が望んでいたことを達成するための「標準的な」方法はないようです。そのため、IMO の最良の答えを受け入れました。スマートになるのをやめ、自動的に作成されたステートメントを介して null 値を省略することに固執する必要があります。

まさに私が見たいものではありませんが、これ以上の選択肢はありません。

4

5 に答える 5

16

今読んでいる方へ:

Oracle 12c には新機能があります: DEFAULT ON NULL。例えば:

CREATE TABLE tab1 (
  col1        NUMBER DEFAULT 5,
  col2        NUMBER DEFAULT ON NULL 7,
  description VARCHAR2(30)
);

したがって、col2 に null を挿入しようとすると、これは自動的に 7 になります。

于 2016-05-06T10:42:57.997 に答える
3

このAskTom スレッドで説明されているように、DEFAULTキーワードは列挿入のスタンドアロン式としてのみ機能し、NVL などの関数や式と混合すると機能しません。

つまり、これは有効なクエリです。

INSERT INTO schema.my_table
    ( pk_column, other_column, not_null_column_with_default_value)
VALUES
    (:pk_column,:other_column, DEFAULT)

すべての行と、変数が null の場合はバインド変数または定数 DEFAULT のいずれかで動的クエリを使用できます。:not_null_column_with_default_valueこれは、文字列を の文字列DEFAULTに置き換えるのと同じくらい簡単$insertです。

ビューを照会してALL_TAB_COLUMNSを使用することもできますnvl(:your_variable, :column_default)。デフォルト値は列DATA_DEFAULTです。

于 2011-03-22T09:15:44.373 に答える
1

最もクリーンな方法は、INSERT ステートメントでそれらについて言及しないことだと思います。デフォルト値を満たすためにトリガーを書き始めることもできますが、それはあなたが目指しているものにとって重装備です。

アプリケーション コードを少し再構築することはできませんか? PHP では、たとえば次のように、面倒な if なしでクリーンな INSERT ステートメントを作成できます。

<?php
$insert['column_name1'] = 'column_value1';
$insert['column_name2'] = 'column_value2';
$insert['column_name3'] = '';
$insert['column_name4'] = 'column_value4';

// remove null values
foreach ($insert as $key => $value) {
  if (is_null($value) || $value=="") {
    unset($insert[$key]);
  }
}

// construct insert statement
$statement = "insert into table (". implode(array_keys($insert), ',') .") values (:". implode(array_keys($insert), ',:') .")";

// call oci_parse
$stid = oci_parse($conn, $statement);

// bind parameters
foreach ($insert as $key => $value) {
  oci_bind_by_name($stid, ":".$key, $value);
}

// execute!
oci_execute($stid);
?>
于 2011-03-22T09:17:11.710 に答える
1

パフォーマンスのより良いオプションは最初のものです。

とにかく、私が理解しているように、変更が難しいため、挿入列の名前と値を繰り返したくないでしょう。使用できる別のオプションは、returning句を使用して挿入を実行し、その後に更新を実行することです。

INSERT INTO schema.my_table
    ( pk_column, other_column, not_null_column_with_default_value)
VALUES
    (:pk_column,:other_column, :not_null_column_with_default_value)
RETURNING not_null_column_with_default_value 
INTO :insered_value

PHP で動作するようです。

nullこの後、insered_valueバインド変数を確認できます。null の場合は、次の更新を実行できます。

UPDATE my_table
   SET not_null_column_with_default_value  = DEFAULT
 WHERE  pk_column = :pk_column: 
于 2011-03-22T21:55:51.017 に答える
0

挿入するデータに対して 1 つの挿入ステートメントを使用したいと思います。挿入された値が null かどうかを確認する必要はありません。

その列のデフォルト値を使用してテーブルを定義します。例えば:

create table myTable
(
  created_date date default sysdate,
  ...
)
tablespace...

または既存のテーブルを変更します。

alter table myTable modify(created_date default sysdate);

これで、あなた (または myTable を使用している人) は、本来あるべきデフォルト値について心配する必要がなくなりました。この例では、列は引き続き NULL 可能であるため、誰かが明示的に NULL を挿入できます。これが望ましくない場合は、列も非 null にします。

編集: 上記が既に行われていると仮定すると、INSERT ステートメントで DEFAULT キーワードを使用できます。これのトリガーは避けます。

于 2011-03-22T10:50:39.133 に答える