2013-09-27 5 views
0
create table employee 
( 
employedID number, 
employeeName varchar2(30), 
deptid number, 
salary number 
); 

Create table department 
(
deptid number, 
deptname varchar2(30) 
); 

CREATE OR REPLACE PROCEDURE insertemp 
(
PemployedID IN number, 
PemployeeName IN varchar, 
Pdepid IN number, 
Psalary IN number 
) 

IS 
BEGIN 

IF Pdepid NOT IN (SELECT * from department.deptid) THEN 

INSERT INTO employee VALUES (PemployedID,’PemployeeName’,00,Psalary); 

ELSE 
INSERT INTO employee VALUES (PemployedID,’PemployeeName’,Pdepid, Psalary); 

END IF; 

COMMIT; 
END; 
/

Я пытаюсь создать хранимую процедуру, и я не знаком с синтаксисом SQl оракула. Если Pdepid не существует в табличном отделе, я хотел бы вставить запись в таблицу сотрудников с 00 в качестве Pdepid. Для этого я использую утверждения IF. Я получаю ошибки компиляции для этой процедуры.Ошибки компиляции для Oracle - хранимая процедура

+0

И что это ошибка? (подсказка: запустите 'show errors', чтобы увидеть его) –

+0

В нем говорится, что Sub Query невозможен в этой строке: - –

+1

IF Pdepid NOT IN (SELECT * from department.deptid) THEN –

ответ

2

Нечто подобное должно работать в Oracle:

CREATE OR REPLACE PROCEDURE insertemp 
(
PemployedID IN number, 
PemployeeName IN varchar, 
Pdepid IN number, 
Psalary IN number 
) 

IS 

v_tmp NUMBER; 
BEGIN 

SELECT COUNT(1) INTO v_tmp 
FROM department 
WHERE deptid = Pdepid; 

IF v_tmp = 0 THEN 

INSERT INTO employee VALUES (PemployedID,PemployeeName,00,Psalary); 

ELSE 
INSERT INTO employee VALUES (PemployedID,PemployeeName,Pdepid, Psalary); 

END IF; 


END; 

И вы можете упростить эту функцию так:

CREATE OR REPLACE PROCEDURE insertemp 
(
PemployedID IN number, 
PemployeeName IN varchar, 
Pdepid IN number, 
Psalary IN number 
) 

IS 
BEGIN 

INSERT INTO employee VALUES (PemployedID,PemployeeName, 
DECODE((SELECT COUNT(1) FROM department WHERE deptid = Pdepid), 0, 0, Pdepid),Psalary); 

END; 
+0

Это действительно умный, позвольте мне попробовать это –

Смежные вопросы