Получить все данные из таблицы заработной платы, а также рассчитать валовую заработную плату (базовая + HRA + DA + CA + медицинская) с использованием хранимой процедуры? в Oracle - PullRequest
0 голосов
/ 14 января 2019

Я создал процедуру, которая вычисляет брутто-зарплату всех сотрудников из таблицы зарплат. При выполнении хранимой процедуры с использованием оператора execute Ошибка: возникает «недопустимый оператор SQL», а когда я выполняю процедуру с использованием блока PLSQL, то ошибка «: PLS-00905 Object HR.PROC_GROSSSALARY недопустим "происходит

- Создание хранимой процедуры -

create or replace procedure proc_grosssalary
AS
begin
   select s.*,(Basic+HRA+DA+CA+Medical) Gross_Salary from salary s;
end;

- Вызов SP с использованием EXECUTE -

execute proc_grosssalary;

- Вызов SP с использованием блока PLSQL -

begin 
   proc_grosssalary;
end;  

отображать все данные в таблице зарплат с вычисленным значением Gross_Salary в виде структуры таблицы

Ответы [ 5 ]

0 голосов
/ 14 января 2019

Задание выполнено:

create or replace procedure p1 
IS 
cursor c1 is select s.*,(Basic+HRA+CA+DA+Medical) Gross_Salary from salary s;
emp_rec c1%rowtype;
begin
  open c1;
  dbms_output.put_line('Emp_No   Basic   HRA       Gross_Salary');
  dbms_output.put_line('---------------------------------------');
loop
  fetch c1 into emp_rec;
  exit when c1%notfound;
  dbms_output.put_line(emp_rec.employee_number||'        '||emp_rec.Basic||'    '||emp_rec.HRA||' '||'     '||emp_rec.Gross_Salary);
end loop;
close c1;
end;

- Выполнение процедуры с использованием блока PLSQL -

begin 
  p1;
end;                                                                       

Ниже ожидается окончательный результат:

----------------------------------------------                                                                    
Employee_number   Basic   HRA     Gross_salary                                                                        
----------------------------------------------
 1                25000   10000   36750                                     
 2                7000    2800    11650                                     
 3                10000   4000    15950
0 голосов
/ 14 января 2019

Но .. Что ты хочешь делать? Если вы хотите рассчитать зарплату для каждого сотрудника, и у вас есть информация в одной строке, с простым SQL вы можете получить ее примерно так:

Select id_emp, name_emp, surname_emp, (Basic+HRAs+DA+CA+Medical) as salary
 from salary;

И это было бы быстрее, чем использование странных функций и процедур. Если вам это не нравится, создайте такое представление, и у вас будет столбец с рассчитанным окладом, более чистый и менее темный

0 голосов
/ 14 января 2019

Вам нужно использовать курсор, чтобы вы могли зацикливаться на записях в таблице.

Вот что я сделал -

#create a table for sample data
create table tsalary0918(Basic number,HRA number,DA number,CA number,Medical number)

#inserting sample data
insert into tsalary0918 values (100,100,100,100,100)

#checking if data is inserted
select * from tsalary0918;

#query output
BASIC   HRA DA  CA  MEDICAL
100 100 100 100 100

#create a stored procedure
create or replace procedure testproc
AS
    cursor cur is select s.*,(Basic +HRA + DA +CA +Medical ) Gross_salary  from tsalary0918 s;
begin
    for records in cur
    loop
        dbms_output.put_line('DA is ' || records.DA);
        dbms_output.put_line('Gross Salary is ' || records.Gross_salary);
    end loop;
end;
/

#execute the stored procedure
begin
testproc;
end;
/

#output of the above execution
dbms_output:
DA is 100
Gross Salary is 500

Проверить онлайн - https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=1744281398fe62a6cb42250641947249

0 голосов
/ 14 января 2019

Вам также следует рассмотреть возможность создания представления.

Create or replace view v_grosssalary  
as select s.*,(Basic+HRA+DA+CA+Medical) Gross_Salary 
from salary s;

и просто наберите select * from v_grosssalary, чтобы получить вывод.

С процедурами есть также команда PRINT (которая работает в SQL * Plus и SQL Developer) с использованием CURSOR переменных связывания

VARIABLE x REFCURSOR
create or replace procedure proc_grosssalary
AS

begin
    OPEN cursor :x for 
    select s.*,(Basic+HRA+DA+CA+Medical) Gross_Salary from salary s;
end;
 /

Print x -- This will display the required result.
0 голосов
/ 14 января 2019

Ваш синтаксис PL / SQL неверен

create or replace procedure proc_grosssalary (out gross_salary number)
AS
begin
   select (Basic+HRA+DA+CA+Medical) 
     into gross_salary
   from salary s;
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...