2013-08-10 2 views
1

Я пытаюсь создать процедуру, в которой вход является lname из таблицы Employee и output является sal и average из таблицы Information. Оба выхода - это числа, а среднее - десятичное число. Это то, что у меня есть до сих пор.Создание пакета с процедурой

CREATE OR REPLACE PACKAGE getSalAvgPack IS PROCEDURE getSalAvg 
(name IN Employee.lname%TYPE, 
pSal OUT NUMBER, 
pAvg OUT NUMBER); 
END; 
. 
/

Пакет компилируется в порядке.

CREATE OR REPLACE PACKAGE BODY getSalAvgPack IS PROCEDURE getSalAvg 
(name IN Employee.lname%TYPE, 
pSal OUT NUMBER, 
pAvg OUT NUMBER) 
IS 
BEGIN 
    SELECT Information.sal, Information.average 
    INTO pSal, pAvg 
    FROM Information 
    WHERE Information.eid=Employee.eid AND name=lname; 
END; 
END; 
. 
/

Когда я пытаюсь скомпилировать тело пакета я получаю эти ошибки

PL/SQL: SQL Statement ignored (for line 7, column 2) 
PL/SQL: ORA-00904: "LNAME": invalid identifier 
+1

Неужели людям в эти дни действительно не научат, как смотреть на свой собственный код? – APC

ответ

1

Вы должны присоединиться к Employee таблице:

SELECT Information.sal, Information.average 
    INTO pSal, pAvg 
    FROM Information join 
     Employee 
     on Information.eid=Employee.eid 
    WHERE name=lname; 
1

Это кажется, что вам не хватает объединения

SELECT Information.sal, Information.average 
    INTO pSal, pAvg 
    FROM Information 
     JOIN Employee ON (Information.eid = Employee.eid) 
WHERE name = Employee.lname; 

Как общий принцип, я бы настоятельно предложил использовать соглашение об именах для ваших параметров, которое отличает их от столбцов в ваших таблицах. Если name - столбец в той или иной таблице, с которой вы соединяетесь, ваш предикат будет сравнивать Employee.lname с этим столбцом, а не использовать параметр name из вашей процедуры. Общим соглашением является префикс всех параметров с p_, так что ваш запрос будет

SELECT Information.sal, Information.average 
    INTO p_Sal, p_Avg 
    FROM Information 
     JOIN Employee ON (Information.eid = Employee.eid) 
WHERE p_name = Employee.lname; 
+0

Спасибо. Как указать значение по умолчанию, если значение sal или average равно null? Просто скажите SELECT NVL (Information.sal, 'NA'), NVL (Information.average, 'NA') Кажется не работает – user2616744

+0

@ user2616744 - Во-первых, определите «не работает». Во-вторых, каковы типы данных? Я бы предположил, что «sal» и «average» являются числовыми столбцами. Если это так, для 'NVL' не имеет смысла пытаться вернуть строку, если значения являются« NULL », поскольку вы не можете преобразовать строку« NA »в число. Если оба столбца являются числовыми типами, 'NVL' должен будет возвращать числовые значения по умолчанию. Конечно, вы также можете определить процедуру возврата двух строк и преобразовать числовые данные в строку перед ее возвратом, но это, как правило, не очень хорошая идея. –

+0

Да, вы правы, они оба NUMBER, поэтому он должен быть 0, а не NA. Не могу поверить, что я этого не замечал. Благодаря! – user2616744

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