怎么样写函数

So_CooL 2011-08-18 06:25:18
Create function f_get_knit_time(dept_id in varchar2,process_id in varchar2,beginDt in varchar2,endDt in varchar2)
return integer is result;
begin
select nvl( sum(QUANTITY * knit_time)/60,0) as knit_time
from WORK_CKM_KNITTIME a,(SELECT
WSM.LOT_NO,
WBM.CARD_SIZE,
count(*) QUANTITY
from WORKSCAN_SH_LIST WSL,
WORKSCAN_SH_MAIN WSM,
WORK_BAR_LIST WBL,
WORK_BAR_MAIN WBM,
work_staff ws,
work_process wp
WHERE WSM.PKEY = WSL.PKEY and
WBM.CARD_ID=WBL.CARD_ID AND
WSL.BAR_CODE=WBL.BAR_CODE and
ws.station_name ='电脑织机' and
wsm.object_id = ws.staff_id and
wsm.main_process = wp.process_id and ws.Dept_ID := dept_id and ws.process_id := process_id and WSM.scan_date >= to_date(''+beginDt+'','dd-MM-yyyy HH24:MI:SS') and WSM.scan_date <= to_date(''+endDt+''+ ' 23:59:59' ,'dd-MM-yyyy HH24:MI:SS')
GROUP BY WSM.LOT_NO,WBM.CARD_SIZE ) b where a.LOT_NO = b.LOT_NO and a.size_name = b.CARD_SIZE
end

select f_get_knit_time('16','+3','18-08-2011','18-08-2011') from dual;

请帮我看看这个函数再使用参数和调用函数是不是这样写.
...全文
74 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
luoyoumou 2011-08-19
  • 打赏
  • 举报
回复
-- 给个列子给你:

-- Oracle返回表值的函数

create or replace type empobj as object
( empno number(4),
ename varchar2(10),
sal number(7,2)
)
/

create or replace type emptb is table of empobj
/

create or replace function myemp(i_deptno number)
return emptb
is
Result emptb := emptb();
begin
result := emptb();
for i in (select empno, ename, sal from emp where deptno=i_deptno )
loop
result.extend;
result(result.count):=empobj(NULL,NULL,NULL);
result(result.count).empno := i.empno;
result(result.count).ename := i.ename;
result(result.count).sal := i.sal;
end loop;
return(result);
end;
/

select * from table(myemp(30));
luoyoumou 2011-08-19
  • 打赏
  • 举报
回复
-- 函数可以没有输入参数,但是函数必须有返回值!
luoyoumou 2011-08-19
  • 打赏
  • 举报
回复
-- 既然你要return integer,
-- 那么你在begin ... end 块里面的 end 前应该有 return 语句去返回一个整型值啊!
So_CooL 2011-08-19
  • 打赏
  • 举报
回复
还是不行
yixilan 2011-08-19
  • 打赏
  • 举报
回复
[Quote=引用楼主 so_cool 的回复:]
SQL code
Create function f_get_knit_time(dept_id in varchar2,process_id in varchar2,beginDt in varchar2,endDt in varchar2)
return integer is result;
begin
select nvl( sum(QUANTITY * knit_ti……
[/Quote]
咦?Select之后,要INTO的,不能直接写;
另外,你在函数一开始已经写了return integer is result;就应该在结束的时候,返回一个integer类型的值;
hanks_gao 2011-08-18
  • 打赏
  • 举报
回复
SQL語句參考二樓的。
hanks_gao 2011-08-18
  • 打赏
  • 举报
回复
create or replace function f_get_knit_time(dept_id in varchar2,process_id in varchar2,beginDt in varchar2,endDt in varchar2)
return INTEGER AS
select nvl( sum(QUANTITY * knit_time)/60,0) as knit_time
from WORK_CKM_KNITTIME a,(SELECT
WSM.LOT_NO,
WBM.CARD_SIZE,
count(*) QUANTITY
from WORKSCAN_SH_LIST WSL,
WORKSCAN_SH_MAIN WSM,
WORK_BAR_LIST WBL,
WORK_BAR_MAIN WBM,
work_staff ws,
work_process wp
WHERE WSM.PKEY = WSL.PKEY and
WBM.CARD_ID=WBL.CARD_ID AND
WSL.BAR_CODE=WBL.BAR_CODE and
ws.station_name ='电脑织机' and
wsm.object_id = ws.staff_id and
wsm.main_process = wp.process_id and ws.Dept_ID := dept_id and ws.process_id := process_id and WSM.scan_date >= to_date(''+beginDt+'','dd-MM-yyyy HH24:MI:SS') and WSM.scan_date <= to_date(''+endDt+''+ ' 23:59:59' ,'dd-MM-yyyy HH24:MI:SS')
GROUP BY WSM.LOT_NO,WBM.CARD_SIZE ) b where a.LOT_NO = b.LOT_NO and a.size_name = b.CARD_SIZE
end;
opps_zhou 2011-08-18
  • 打赏
  • 举报
回复
函数和存储过程中,是不能直接写 select 语句的,要么是 select into,要么就是用游标
调用函数,你写的方法是可以的

1,617

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧