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!
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;
/
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é.
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.