web-dev-qa-db-fra.com

Insertion de valeurs dans des tables Oracle SQL

J'essaie d'insérer des valeurs dans une table "Employé" dans Oracle SQL. J'ai une question concernant la saisie de valeurs déterminées par une clé étrangère:

Mes employés ont 3 attributs qui sont déterminés par des clés étrangères: State, Position et Manager. J'utilise un INSERT INTO instruction pour insérer les valeurs et saisir manuellement les données. Dois-je rechercher physiquement chaque référence pour saisir les données ou existe-t-il une commande que je peux utiliser? Par exemple.

INSERT INTO Employee 
(emp_id, emp_name, emp_address, emp_state, emp_position, emp_manager)
VALUES 
(001, "John Doe", "1 River Walk, Green Street", 3, 5, 1000)

Cela devrait remplir la table des employés avec (John Doe, 1 River Walk, Green Street, New York, Sales Executive, Barry Green). New York est state_id=3 dans la table State; Le directeur des ventes est position_id=5 dans la table positions; et Barry Green est manager_id=1000 dans la table manager.

Existe-t-il un moyen de saisir les valeurs de texte des tables référencées, afin qu'Oracle reconnaisse le texte et le compare à l'ID approprié? J'espère que cette question a du sens sera heureuse de clarifier quoi que ce soit.

Merci!

12
adohertyd

Vous pouvez étendre la fonction suivante afin d'extraire plus de paramètres de la base de données avant l'insertion:

--
-- insert_employee  (Function) 
--
CREATE OR REPLACE FUNCTION insert_employee(p_emp_id in number, p_emp_name in varchar2, p_emp_address in varchar2, p_emp_state in varchar2, p_emp_position in varchar2, p_emp_manager in varchar2) 
RETURN VARCHAR2 AS

   p_state_id varchar2(30) := '';
 BEGIN    
      select state_id 
      into   p_state_id
      from states where lower(emp_state) = state_name;

      INSERT INTO Employee (emp_id, emp_name, emp_address, emp_state, emp_position, emp_manager) VALUES 
                (p_emp_id, p_emp_name, p_emp_address, p_state_id, p_emp_position, p_emp_manager);

    return 'SUCCESS';

 EXCEPTION 
   WHEN others THEN
    RETURN 'FAIL';
 END;
/
9
alfasin
INSERT
INTO    Employee 
        (emp_id, emp_name, emp_address, emp_state, emp_position, emp_manager)
SELECT  '001', 'John Doe', '1 River Walk, Green Street', state_id, position_id, manager_id
FROM    dual
JOIN    state s
ON      s.state_name = 'New York'
JOIN    positions p
ON      p.position_name = 'Sales Executive'
JOIN    manager m
ON      m.manager_name = 'Barry Green'

Notez que mais une seule faute d'orthographe (ou un espace supplémentaire) entraînera une non-correspondance et rien ne sera inséré.

7
Quassnoi

Vous pouvez insérer dans une table à partir d'un SELECT.

INSERT INTO
  Employee (emp_id, emp_name, emp_address, emp_state, emp_position, emp_manager)
SELECT
  001,
  'John Doe',
  '1 River Walk, Green Street',
  (SELECT id FROM state WHERE name = 'New York'),
  (SELECT id FROM positions WHERE name = 'Sales Executive'),
  (SELECT id FROM manager WHERE name = 'Barry Green')
FROM
  dual

Ou, de même ...

INSERT INTO
  Employee (emp_id, emp_name, emp_address, emp_state, emp_position, emp_manager)
SELECT
  001,
  'John Doe',
  '1 River Walk, Green Street',
  state.id,
  positions.id,
  manager.id
FROM
  state
CROSS JOIN
  positions
CROSS JOIN
  manager
WHERE
      state.name     = 'New York'
  AND positions.name = 'Sales Executive'
  AND manager.name   = 'Barry Green'

Bien que celui-ci suppose que toutes les recherches existent. Si, par exemple, il n'y a pas de nom de poste "Sales Executive", rien ne serait inséré avec cette version.

4
MatBailie