-1

以下のinsert into selectステートメントを実行しているときにORA 00937、以下のクエリがテーブルのサブ選択の1つを処理できないため、取得しAPPLICATIONSます。その値をハードコーディングしたくありません。助言がありますか?

前もって感謝します。

insert into CONFIGURATION_PARAMETER_VALUES
( ID
, NAME
, DESCRIPTION
, DATA_TYPE
, VALUE_STRING
, VALUE_INTEGER
, VALUE_DATE
, VALUE_FLOAT
, VALUE_TIMESTAMP
, APPLICATION_ID
, DELETED
) 
select NVL(MAX(ID),0)+1
       , 'Alert_Statuses_AllExceptNoStatus'
       , 'Suspicious'
       , 'String'
       , 'RBS_EIM_AL_008'
       , null
       , null
       , null
       , null
       , (select ID from APPLICATIONS where name = 'Rabobank v 1.0.0.0')
       , 'N'
  from CONFIGURATION_PARAMETER_VALUES
4

2 に答える 2

1

手遅れでなければSEQUENCE、カウントする代わりに a を実装することをお勧めします。厳密な数値順序は得られない場合があります (ギャップがある可能性があります) が、毎回一意の値が得られます。

CREATE SEQUENCE Config_Parm_Values_Seq START WITH <1 + your current max ID>;

INSERTまた、現在の状態では次のように動作することに注意してください。

  • テーブルにレコードがない場合は、何も挿入されません。
  • テーブルにレコードがある場合、実行するたびにテーブルの行数が 2 倍になります。

したがって、シーケンスを使用しない場合でもINSERTINSERT ... SELECT. この例では、次のシーケンスを使用しています。

insert into CONFIGURATION_PARAMETER_VALUES
( ID
, NAME
, DESCRIPTION
, DATA_TYPE
, VALUE_STRING
, VALUE_INTEGER
, VALUE_DATE
, VALUE_FLOAT
, VALUE_TIMESTAMP
, APPLICATION_ID
, DELETED
) VALUES (
       Config_Parm_Values_Seq.NEXTVAL -- Use seqname.nextval to get
                                      -- the next value from the sequence
       , 'Alert_Statuses_AllExceptNoStatus'
       , 'Suspicious'
       , 'String'
       , 'RBS_EIM_AL_008'
       , null
       , null
       , null
       , null
       , (select MAX(ID) from APPLICATIONS where name = 'Rabobank v 1.0.0.0')
       , 'N')
于 2013-04-10T13:30:04.100 に答える
0

問題は、SELECT使用しているステートメントにありますSELECT NVL(MAX(ID), 0) + 1MAXリストで関数を使用SELECTしているため、 a を使用する必要がありますがGROUP BY、これはここでは解決策ではありません。

次のようなものを使用します。

insert into CONFIGURATION_PARAMETER_VALUES
( ID
, NAME
, DESCRIPTION
, DATA_TYPE
, VALUE_STRING
, VALUE_INTEGER
, VALUE_DATE
, VALUE_FLOAT
, VALUE_TIMESTAMP
, APPLICATION_ID
, DELETED
) 
select (SELECT MAX(ID) FROM configuration_parameter_values) + 1
        -- above line instead of NVL(MAX(ID),0)+1
        -- You can also put NVL function around the subquery.
       , 'Alert_Statuses_AllExceptNoStatus'
       , 'Suspicious'
       , 'String'
       , 'RBS_EIM_AL_008'
       , null
       , null
       , null
       , null
       , (select ID from APPLICATIONS where name = 'Rabobank v 1.0.0.0')
       -- Warning: The above subquery can generate a TOO_MANY_ROWS exception.
       -- Use the solution in the other answer to avoid this.
       , 'N'
  from CONFIGURATION_PARAMETER_VALUES
于 2013-04-10T13:08:02.467 に答える