Как мне написать код PL / SQL, который проверяет, существует ли значение в имя_таблицы.имя столбца перед вставкой в него?

#sql #oracle #plsql

#sql #Oracle #plsql

Вопрос:

 insert into AIRPORT_DIM
select airportkey_Seq.nextval, AIRPORTID , CITY_NAME,NULL, NULL 
from TMP_AIRPORT;
 

как мне превратить приведенный выше код вставки SQL в код pl / sql, который проверяет, существует ли идентификатор АЭРОПОРТА вновь вставленной строки с другим именем city_name в таблице airport_dim?

если они существуют, то выполните

 insert into AIRPORT_DIM 
select airportkey_Seq.nextval, AIRPORTID ,NULL,CITY_NAME, sysdate
from TMP_airport;
 

ещё

 insert into airport_dim 
select airportkey_Seq.nextval, AIRPORTID , CITY_NAME,NULL, NULL
from TMP_airport;
 

Ниже приведены таблицы AIRPORT_DIM и TMP_airport.

 CREATE TABLE AIRPORT_DIM
(
AIRPORT_KEY NUMBER,
AIRPORT_CODE    VARCHAR2(8),
CITY_NAME_CURRENT   VARCHAR2(20),
CITY_NAME_NEW   VARCHAR2(20),
EFFECTIVE_DATE  TIMESTAMP(8)
)

CREATE TABLE TMP_AIRPORT
(
AIRPORTID   VARCHAR2(4),
CITY_NAME   VARCHAR2(20)
)
 

Комментарии:

1. Сделайте это за 2 прохода.

2. Вы можете обнаружить MERGE , что команда более эффективна.

3. инструкции insert кажутся немного искаженными. Я имею в виду, почему порядок столбцов не совпадает.

Ответ №1:

вы можете добиться этого следующим образом:

 INSERT INTO airport_dim 
select airportkey_Seq.nextval
       , AIRPORTID 
       , CASE WHEN ad.AIRPORT_KEY is null then CITY_NAME else null end
       , CASE WHEN ad.AIRPORT_KEY is null then null else CITY_NAME end 
       , CASE WHEN ad.AIRPORT_KEY is null then null CITY_NAME sysdate end 
from TMP_airport ta
LEFT JOIN AIRPORT_DIM ad
  ON ta.AIRPORTID = ad.AIRPORT_CODE