2 sinat 36169916 sinat_36169916 于 2016.09.18 17:33 提问

oracle将sql语句写成存储过程

想要把原sql语句写成存储过程,这样以后就直接调用存储过程来执行这一段语句了
求大神帮忙看看我写的是否正确,谢谢
原sql语句:
TRUNCATE TABLE tab1;
INSERT tab1
SELECT s.storecode,s.category,nvl(curr.vol,0)/s.avg_vol - 1 AS growth
FROM
(
SELECT periodcode,storecode,CATEGORY,vol FROM tab2 WHERE periodcode = &periodcode) curr,
(SELECT storecode,category,AVG(vol) avg_vol FROM tab2

GROUP BY storecode,CATEGORY HAVING AVG(vol) > 0) s
WHERE curr.storecode(+) = aveg.storecode
AND curr.category(+) = s.category

打包为存储过程:
create or replace procedure p_tab1
AS
BEGIN
TRUNCATE TABLE tab1;
INSERT tab1
SELECT s.storecode,s.category,nvl(curr.vol,0)/s.avg_vol - 1 AS growth
FROM
(
SELECT periodcode,storecode,CATEGORY,vol FROM tab2 WHERE periodcode = &periodcode) curr,
(SELECT storecode,category,AVG(vol) avg_vol FROM tab2

GROUP BY storecode,CATEGORY HAVING AVG(vol) > 0) s
WHERE curr.storecode(+) = aveg.storecode
AND curr.category(+) = s.category

COMMIT;
END;

2个回答

shihengzhen101
shihengzhen101   Rxr 2016.09.18 17:35

不太明白你的问题,你是要实现什么功能

shihengzhen101
shihengzhen101 回复sinat_36169916: 如果两个sql没有关系,直接写在一起就行,把两个SQL写在BEGIN和END之间就好
大约一年之前 回复
sinat_36169916
sinat_36169916 回复AlbertS: 恩呢,谢谢了,我在请问下,如果是两个sql语句,同时写为一个存储过程,要怎么写呢?
大约一年之前 回复
shihengzhen101
shihengzhen101 你先试试吧,我的电脑上没有oracle,只有mysql,一般sql只可以正常执行的,直接写到存储过程的定义中就行
大约一年之前 回复
sinat_36169916
sinat_36169916 回复AlbertS: 我还没有去测试,就想问问我这样子写的存储过程有什么问题吗?
大约一年之前 回复
shihengzhen101
shihengzhen101 回复sinat_36169916: 你不是已经写了吗?出现问题了?
大约一年之前 回复
sinat_36169916
sinat_36169916 想要把原sql语句写成存储过程,这样以后就直接调用存储过程来执行这一段语句了
大约一年之前 回复
qq221746
qq221746   2016.09.18 17:41

你那条truncate语句是ddl语句,不能直接那么写.
改成

execute immediate 'TRUNCATE TABLE tab1';

shihengzhen101
shihengzhen101 我怎么感觉可以呢,只不过我用的mysql
大约一年之前 回复
sinat_36169916
sinat_36169916 请问下,其他的还有什么错误吗?
大约一年之前 回复
sinat_36169916
sinat_36169916 好的,谢谢了
大约一年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片