我是PL / SQL的新手。它一直很好,直到现在。 我查询这个查询工作正常。
declare
rec employees_practice%rowtype;
sam taxObligations%rowtype;
socialsecurity number;
rentallowance number;
transportation number;
taxableincome number;
incometaxliability number;
netpay number;
total number;
totaldeductions number;
begin
for rec in (select * from employees_practice)
loop
socialsecurity:=(5.5/100)*(rec.salary);
rentallowance:=(20/100)*(rec.salary);
if(rec.Category='S')
then transportation:= 150;
else transportation:=100;
end if;
taxableincome:=rec.Salary-socialsecurity+rentallowance+transportation;
for sam in (select * from taxObligations)
loop
if(taxableincome between sam.Minincome and sam.Maxincome)
then incometaxliability:= sam.MinimumBracketTax + (taxableincome-sam.Minincome)*(sam.TaxBracketRate/100);
else incometaxliability:=null;
end if;
end loop;
netpay:= taxableincome-incometaxliability;
total:= rec.Salary + rentallowance + transportation;
totaldeductions:=socialsecurity + incometaxliability;
-- Here, I used DBMS.... to give an output in different format.
end loop;
end;
我现在想要创建一个包含上述代码的函数,这样我就可以使用单个SQL或PL / SQL查询来调用它。这对我来说很头疼。
答案 0 :(得分:1)
您可以将其设为pipelined function:
首先你需要一个表类型:
create or replace type result_tab as table of varchar2(32767);
然后,使您的代码成为流水线函数:
create or replace function your_func return result_tab PIPELINED is
rec employees_practice%rowtype;
sam taxObligations%rowtype;
socialsecurity number;
rentallowance number;
transportation number;
taxableincome number;
incometaxliability number;
netpay number;
total number;
totaldeductions number;
begin
for rec in (select * from employees_practice)
loop
socialsecurity:=(5.5/100)*(rec.salary);
rentallowance:=(20/100)*(rec.salary);
if(rec.Category='S')
then transportation:= 150;
else transportation:=100;
end if;
taxableincome:=rec.Salary-socialsecurity+rentallowance+transportation;
for sam in (select * from taxObligations)
loop
if(taxableincome between sam.Minincome and sam.Maxincome)
then incometaxliability:= sam.MinimumBracketTax + (taxableincome-sam.Minincome)*(sam.TaxBracketRate/100);
else incometaxliability:=null;
end if;
end loop;
netpay:= taxableincome-incometaxliability;
total:= rec.Salary + rentallowance + transportation;
totaldeductions:=socialsecurity + incometaxliability;
-- Here, I used PIPE ROW() to give an output in different format.
pipe row('what ever you had in your dbms_output command');
end loop;
return;
end your_func;
现在,您可以这样调用/查询:
select * from table(your_func)
答案 1 :(得分:0)
如果一切正常,请尝试在存储的FUNCTION中使用CURSOR作为IN参数进行全部操作以返回NUMBER。了解变量类型和游标。 Oracle docs应该足以让您自己完成。
之后,如果您遇到代码问题,请在此处发布,您肯定会得到帮助。