大家好,在Oracle的PL/SQL里怎么执行存储过程?

lihongyue 2005-07-13 02:56:45
例:
CREATE OR REPLACE PROCEDURE CRMSPL.TEST(strBegin in Date,strEnd in Date)
IS
aa varchar2(50);
BEGIN
SELECT ka_title into aa FROM EB_KNOWLEDGE_ARTICLE where KA_UNUSED2 >= strBegin and KA_UNUSED3 <= strEnd;
END;

还有SELECT的时候为什么INTO到一个临时表里,实在是不明白,请各位高手给我讲解一下,先谢谢了!
...全文
26991 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuyi8903 2005-07-15
  • 打赏
  • 举报
回复
是的。要用游标!
lihongyue 2005-07-13
  • 打赏
  • 举报
回复
fangyu82528(大俣治水) :谢谢你,在存储过程里要是想显示一个列表,是不是得用游标啊,然后用循环一条条显示出来啊,这样速度是不是非常慢啊,我刚接触ORACLE,以后向你多多学习!
fangyu82528 2005-07-13
  • 打赏
  • 举报
回复
在循环里有些数据一定要用变量存入一个值,再把这个值放入到想放入的地方,比如插入另一个表,如果不用变量也可以,但相应的循环也不能用了,要把程序写死,这样的话,重复的程序就要写 N 遍,我现在是在做辽宁省的项目,一共有14个地市,就算把程序写死也可以,就是把循环里的程序多写13遍,可是假如要是做全国的怎么办?所以还是用循环好的多,这样的话同要的程序,算出来一个地市的信息然后插入变量,再把变量放入想用的地方,就可以再去取下一个地市的信息了,再重复以上的过程就是电脑的事了,所以变量是很好的,希望你继续努力钻研 ^_^
liuyi8903 2005-07-13
  • 打赏
  • 举报
回复
PLSQL Developer在哪里有啊


可以在网上下载的.
lihongyue 2005-07-13
  • 打赏
  • 举报
回复
fangyu82528(大俣治水) :谢谢你,我实在是看不明白,用了INTO后面的变量后怎么省略了N多代码量啊,请详细解释一下好吗
yangyu9000(JIMMY(术士)) :我是在客户端的SQL里面调用的存储过程,你所说的
PLSQL Developer在哪里有啊
hjf1010 2005-07-13
  • 打赏
  • 举报
回复
这个网站有介绍的电子书,好好看看
http://www.netyi.net/in.asp?id=hjf1010
yangyu9000 2005-07-13
  • 打赏
  • 举报
回复
如果用的是PLSQL Developer
则是在命令窗口中执行exec test(sysdate,sysdate);
不能在SQL窗口中执行.
fangyu82528 2005-07-13
  • 打赏
  • 举报
回复
还有SELECT的时候为什么INTO到一个临时表里,实在是不明白,请各位高手给我讲解一下,先谢谢了!

这个问题我来回答一下

你select into的不是一个临时表,而是一个变量,这样做的好处在由于遇到循环时按行插入数据会非常的方便,比如,这是我写的程序片断:

--取营帐地市信息
CURSOR cur_bus_city
IS
SELECT city_code
FROM dim_admin.bs_city_id_t
WHERE city_level = 3;

BEGIN
OPEN cur_bus_city;
LOOP
FETCH cur_bus_city INTO v_city_code;
EXIT WHEN cur_bus_city%NOTFOUND;

if vv_pay_type = 5
then
begin
select nvl(month_fee,0)
into vn_month_fee0
from RPT_193_group_DETAIL_t
where pay_type = vv_pay_type
AND month_id = v_fee_month
and service_group_id = vv_group_id
and city_code =v_city_code
and service_kind_id = 7;
exception when others then
vn_month_fee0 := 0;
end;
begin
select nvl(sum(month_fee),0)
into vn_year_fee0
from RPT_193_group_DETAIL_t
where substr(month_id,0,4) = v_fee_year
and pay_type = vv_pay_type
and service_group_id = vv_group_id
and city_code=v_city_code
and service_kind_id = 7
group by city_code,service_group_id;
exception when others then
vn_year_fee0 := 0;

end;
end if;

INSERT INTO RPT_193_group_DETAIL_t
(
MONTH_ID ,
CITY_CODE ,
SERVICE_GROUP_ID ,
SERVICE_KIND_ID ,
MONTH_FEE ,
PAY_TYPE ,
YEAR_FEE0 ,
MONTH_FEE1 ,
YEAR_FEE1
)
VALUES (
v_fee_month,
v_city_code,
vv_group_id,
7,
vn_month_fee0,
7,
nvl(vn_year_fee0,0),
nvl(vn_month_fee1,0),
nvl(vn_year_fee1,0)
);

COMMIT;

end loop;
close cur_bus_city;


因为我是做电信项目的,所以我的程序需要按地市循环(这段程序只是我程序的一小部分),有了 SELECT INTO 后边的变量,就使我省去了写 N 多 代码的麻烦,你先看看,有什么不懂的我再给你解释 ^_^
lihongyue 2005-07-13
  • 打赏
  • 举报
回复
楼上的各位,谢谢你们的回答,可是不行啊,还是有错误,
General SQL error.
ORA-00900:无效SQL语句
晕死了要
lihongyue 2005-07-13
  • 打赏
  • 举报
回复
qiaozhiwei(乔):为什么要into到一个变量里啊,怎么和SQL SERVER不一样呢
lihongyue 2005-07-13
  • 打赏
  • 举报
回复
njhart2003() : 为什么查出多于一条的记录会报错呢?
qiaozhiwei 2005-07-13
  • 打赏
  • 举报
回复
是into到一个变量,不是临时表
zhpsam109 2005-07-13
  • 打赏
  • 举报
回复
up!
njhart2003 2005-07-13
  • 打赏
  • 举报
回复
pl/sql调用存储过程的格式
declare
start_date date:=sysdate-1; -- 开始时间
end_date date:=sysdate; -- 结束时间
begin
CRMSPL.TEST(start_date,end_date);
end;
/



你这个存储过程代码不完善哦

若查出多于一条的记录会报错的。

bzszp 2005-07-13
  • 打赏
  • 举报
回复
exec test(sysdate,sysdate);

17,377

社区成员

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

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