Вставить / обновить записи в базе данных Oracle SQL? - PullRequest
0 голосов
/ 16 ноября 2018

Я недавно начал использовать Oracle.До этого я работал с SQL Server 2008/2012.Я заметил некоторые различия между Oracle и SQL Server.Я создал таблицы в SQL Server с некоторыми базовыми столбцами, такими как Имя, Фамилия, адрес электронной почты и т. Д. Вот пример структуры моей таблицы:

Name          Data Type  Size   Not Null
RECORDID      NUMBER            true    //This is primary key (auto increment)  
FIRST         VARCHAR2   50     true        
LAST          VARCHAR2   50     true        
EMAIL         VARCHAR2   320    true        
PHONE         CHAR       10     true        
FILEPATH      VARCHAR2   1000   false       
TYPE          CHAR       1      true        
SUBJECT       VARCHAR2   100    true        
DESCRIPTION   VARCHAR    4000   true    // This should be varchar(max)  
ACTIONDATE    DATE              true    

Я использовал параметр Identity Column в Oracle SQL Developer, чтобы установитьRecordID к последовательности столбцов.Это отличается от SQL Server, и я ищу такое же поведение.Этот столбец должен автоматически увеличиваться для каждой новой строки, добавляемой в таблицу.

Это правильный способ установки столбца идентификаторов в Oracle?Вот пример моего оператора вставки:

<cfquery name="insertRec" datasource="test">
    INSERT INTO Table1 (
        RecordID, First, Last, Email, Phone, 
        FilePath, Type, Subject, Description, ActionDate 
    )VALUES(
        RecID_SEQ1.NEXTVAL,
        <cfqueryparam cfsqltype="cf_sql_varchar" value="trim(#form.first#)" maxlength="50">,
        <cfqueryparam cfsqltype="cf_sql_varchar" value="trim(#form.last#)" maxlength="50">,
        <cfqueryparam cfsqltype="cf_sql_varchar" value="trim(#form.email#)" maxlength="50">,
        <cfqueryparam cfsqltype="cf_sql_char" value="trim(#form.phone#)" maxlength="10">,
        <cfqueryparam cfsqltype="cf_sql_varchar" value="trim(#form.file#)" maxlength="1000">,
        <cfqueryparam cfsqltype="cf_sql_char" value="trim(#form.type#)" maxlength="1">,
        <cfqueryparam cfsqltype="cf_sql_varchar" value="trim(#form.subject#)" maxlength="100">,
        <cfqueryparam cfsqltype="cf_sql_varchar" value="trim(#form.appdescr#)" maxlength="4000">,
        CURRENT_TIMESTAMP
    )
</cfquery>

В транзакции выше, как установить идентификатор автоматического увеличения?Также я хотел бы вернуть идентичность области так же, как в SQL Server.Есть ли способ добиться этого в Oracle?Если у кого-то есть какие-либо предложения относительно того, как этого можно достичь или как улучшить мой код выше, пожалуйста, дайте мне знать.Я только начал с Oracle, и это ново для меня.

CREATE TABLE "MYDB"."MYTABLE" 
   (    "RECORDID" NUMBER, 
    "FIRST" VARCHAR2(20 BYTE), 
    "LAST" VARCHAR2(20 BYTE), 
    "EMAIL" VARCHAR2(20 BYTE), 
    "PHONE" CHAR(10 BYTE), 
    "FILEPATH" VARCHAR2(20 BYTE), 
    "TYPE" CHAR(1 BYTE), 
    "SUBJECT" VARCHAR2(20 BYTE), 
    "DESCRIPTION" VARCHAR2(20 BYTE), 
    "ACTIONDATE" DATE, 
    "PRIORITY" CHAR(1 BYTE)
   ) SEGMENT CREATION DEFERRED 
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  TABLESPACE "MYDB" ;
--------------------------------------------------------
--  DDL for Index MYTABLE_PK
--------------------------------------------------------

  CREATE UNIQUE INDEX "MYDB"."MYTABLE_PK" ON "MYDB"."MYTABLE" ("RECORDID") 
  PCTFREE 10 INITRANS 2 MAXTRANS 255 NOCOMPRESS LOGGING
  TABLESPACE "MYDB" ;
--------------------------------------------------------
--  DDL for Trigger MYTABLE_TRG
--------------------------------------------------------

  CREATE OR REPLACE TRIGGER "MYDB"."MYTABLE_TRG" 
BEFORE INSERT ON MYTABLE
FOR EACH ROW 
BEGIN
  <<COLUMN_SEQUENCES>>
  BEGIN
    NULL;
  END COLUMN_SEQUENCES;
END;
/
ALTER TRIGGER "MYDB"."MYTABLE_TRG" ENABLE;
--------------------------------------------------------
--  DDL for Trigger MYTABLE_TRG1
--------------------------------------------------------

  CREATE OR REPLACE TRIGGER "MYDB"."MYTABLE_TRG1" 
BEFORE INSERT ON MYTABLE
FOR EACH ROW 
BEGIN
  <<COLUMN_SEQUENCES>>
  BEGIN
    IF INSERTING AND :NEW.RECORDID IS NULL THEN
      SELECT ADPR_SEQ1.NEXTVAL INTO :NEW.RECORDID FROM SYS.DUAL;
    END IF;
  END COLUMN_SEQUENCES;
END;
/

ALTER TRIGGER "MYDB"."MYTABLE_TRG1" ENABLE;

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Это то, что вы хотите - и оно доступно в базе данных версии 12c и выше.

enter image description here

Это генерирует код, который выглядит следующим образом -

CREATE TABLE TABLE4 
(
  COLUMN1 NUMBER GENERATED ALWAYS AS IDENTITY INCREMENT BY 1 START WITH 1 MINVALUE 1 NOT NULL 
, COLUMN2 VARCHAR2(20) 
, CONSTRAINT TABLE4_PK PRIMARY KEY 
  (
    COLUMN1 
  )
  ENABLE 
);

Затем сделать вставку и вернуть сгенерированный идентификатор -

declare
 my_new_record integer;
begin
 insert into table4(column2) values ('Hi') returning column1 into my_new_record;
 dbms_output.put_line('your new record ID is: ' || my_new_record);
end;
/

enter image description here

Если вы не включены12c, вы все еще можете делать все это - у вас просто есть TRIGGER и SEQUENCE для создания и поддержки.

0 голосов
/ 16 ноября 2018

Чтобы расширить то, что сказал этот джеффсмит, у вас нет столбца идентификаторов. На самом деле, у вас даже нет ограничения первичного ключа, только уникальный столбец. Столбец идентификации будет выглядеть так:

create table mytable (
    recordid number generated always by default on null as identity ...

Тогда вам не нужно указывать этот столбец в операторе INSERT при создании новой строки.

Если вы собираетесь использовать этот шаблон последовательности с триггером для вставки столбца, вы получите новый идентификатор, выполнив что-то вроде этого:

insert into mytable ( first, ... ) 
values ( 'john', ... )
returning recordid into :myrecordid

Это заполнит myrecordid показателем новой строки.

...