разобрать файл CSV .. проблема с управлением первичным ключом? - PullRequest
0 голосов
/ 14 февраля 2011

Я только что создал java-файл для анализа csv-файлов и сохранил их в базе данных oracle ... но мне нужен идентификатор поля, который действует как первичный ключ ... и я немного запутался при зацикливании ...

1 Ответ

1 голос
/ 15 февраля 2011

Я думаю, все, что вам нужно сделать, это использовать последовательность (как предложено Роннисом)

как таковой

CREATE SEQUENCE FIELD_ID_SEQ START WITH 1 INCREMENT BY 1 NOCYCLE NOCACHE; 
/*NOTE THE SEQUENCE, WHILE INCREMENTING, IS NOT GUARANTEED TO BE 1,2,3,4...N ->expect gaps in the #*/

Теперь либо в вашем Java-приложении, где вы сохраняете данные:

"INSERT INTO TABLE_OF_CSV(FIELD_ID, FIELD_COLA, FIELD_COLB) VALUES(FIELD_ID_SEQ.NEXTVAL, ?,?);"

OR


Теперь, если вы используете процедуру (или процедуру в пакете), вы можете сделать это (обратите внимание, это возвращает первичный ключ обратно вызывающему приложению)

create procedure insertIntoCSVTable(pCOLA IN TABLE_OF_CSV.FIELD_COLA%TYPE 
                                  , pCOLB IN TABLE_OF_CSV.FIELD_COLB%TYPE
                                  , pFIELD_ID OUT TABLE_OF_CSV.FIELD_ID%TYPE)
AS
BEGIN

    INSERT INTO TABLE_OF_CSV(FIELD_ID, FIELD_COLA, FIELD_COLB) 
    VALUES(FIELD_ID_SEQ.NEXTVAL, pCOLA, pCOLB)
    RETURNING FIELD_ID
    INTO pFIELD_ID
    ;

END insertIntoCSVTable;

зацикливание не требуется, если вы уже зацикливаете свой код Java (при условии вставки строка за строкой)


OR


Вы можете использовать триггер для вставки нового значения в таблицу: создать или заменить

TRIGGER TABLE_OF_CSV_TRG BEFORE INSERT ON TABLE_OF_CSV 
FOR EACH ROW 
BEGIN
  <<COLUMN_SEQUENCES>>
  BEGIN
    IF :NEW.FIELD_ID IS NULL THEN
      SELECT FIELD_ID_SEQ.NEXTVAL INTO :NEW.FIELD_ID FROM DUAL;
    END IF;
  END COLUMN_SEQUENCES;
END;

...