哪位PL/SQL高手帮帮忙,第一次用PL/SQL写存储过程遇到问题不知道怎么解决,多多指教! (200分)

  • 主题发起人 主题发起人 GipsyCN
  • 开始时间 开始时间
是不是PL/SQL Developer有问题?
一个最简单的过程编译都不行:
create or replace procedure AAA is
begin

end AAA;
哪位同仁能给些相关资料或者相关站点吗?
我手头只有一本讲PL/SQL的书。
感谢各位!
 
上面那段是肯定错误的,在oracle中一个pl/sql块至少要有一条语句,象
begin
end;
这样一条语句也没有的,是错误的。
如果你想不做任何操作,可以这样:
begin
null; /*null;就是空操作*/
end;
至于最上面的命令,太长了,实在没时间看清楚,在sqlplus执行上面的命令,出现“警告:出现编译错误”之后
你再执行show error把错误贴出来吧,大家研究研究

至于你说oracle慢,有可能是
1、没配置好,oracle手工配置很麻烦、很讲究
2、oracle在低配置的机器上运行不好,高配置的机器以及大数据量运行是最快的
看:
http://www.oracle.com/features/9i/benchmarks/ad_benchmark_bv.html
What's the Fastest Database on IBM's Fastest Computer?
When IBM wanted to show off their fastest computer, IBM chose Oracle.
(在ibm最快的机器上运行最快的数据库是什么?当ibm演示他们最快的计算机,ibm选择了oracle
而不是ibm自己的db2)
 
感谢皮皮大侠!
错误提示如下:
PROCEDURE SP_AGGR_FEE 出现错误:

LINE/COL ERROR
-------- -----------------------------------------------------------------
118/5 PLS-00103: 出现符号 "SP_AGGR_FEE"在需要下列之一时:
loop
 
沙隆巴斯的主人和PiPi两位大侠:
我把过程体BEGIN和END中间只写一句:null;编译时错误提示在如下变量声名处:
type tyQryCur IS REF CURSOR;
curSubDataSet tyQryCur;
curSubDataSet_Rec curSubDataSet%ROWTYPE;--错误在此处!
错误提示为:
PLS-00320: 此表达式的类型说明不完整或格式不正确

有劳两位在Up一下,感谢!
 
〉 PLS-00103: 出现符号 "SP_AGGR_FEE"在需要下列之一时: loop
这个错误是因为再上几行endloop错了,需要空格: end loop 不能连起来写
 
type tyQryCur IS REF CURSOR;
curSubDataSet tyQryCur;
curSubDataSet_Rec curSubDataSet%ROWTYPE
---------------------------------------------
type tyQryCur IS REF CURSOR 没有定义返回的是什么类型,那么curSubDataSet%ROWTYPE
是什么东西是未知的了。
如果你定义: type tyQryCur IS REF CURSOR return row或者记录类型
那么它返回的类型可知,curSubDataSet%ROWTYPE 就没问题了
注意return后面的类型,可以是一个record类型,也可以是一个rowtype类型,比如:表%rowtype
 
Pipi大侠,你好,终于你又出现了。
我是根据DFW上一个帖子"怎样实现根据不同条件定义一个游标"这样做的。
来自:yyanghhong, 时间:2002-1-12 4:43:00, ID:851977
type ty_Quecur is ref cursor ;
a_Quecur ty_Quecur;
Que_Sql varchar2 (500);
c_key number ;
begin
if p_key<>-1 then
Que_Sql :='select LogCode_Location_Key from ETL.LogCode_Location where '||
' Application_key='||App_Key||
' and parent_LogCode_Location_key='||p_key||
' and Code_Location='''||CodeLocationName||'''';
else
Que_Sql :='select LogCode_Location_Key from ETL.LogCode_Location where '||
' Application_key='||App_Key||
' and parent_LogCode_Location_key is null'||
' and Code_Location='''||CodeLocationName||'''';
end if;

c_key:=-1;
open a_Quecur for Que_Sql;
loop
fetch a_Quecur into c_key;
exit when a_Quecur%notfound;
end loop;
close a_Quecur;

以前没搞过PL/SQL,还希望多多指教。
 
pipi说的是对的。

ref cursor 是定义了一个有确定返回类型的游标,它可以不用定义数据集是
从哪来的(SELECT子句),而在打开它时再使用。

你的游标应该定义成下面这样:
CURSOR c2 RETURN dept%ROWTYPE IS
SELECT * FROM dept WHERE deptno = 10;
 
沙隆巴斯的主人:
问题是这样的:我这个游标的SQL语句是动态变化的,也要“根据不同条件定义一个游标”,有什么高见吗?
 
可以这样,先定义
TYPE myCursor IS REF CURSOR RETURN emp%ROWTYPE;
然后在要用的地方
IF 条件 = 1 THEN
OPEN myCursor FOR SELECT * FROM emp WHERE comm IS NOT NULL;
ELSIF 条件 = 2 THEN
OPEN myCursor FOR SELECT * FROM emp WHERE sal > 2500;
ELSIF 条件 = 3 THEN
OPEN myCursor FOR SELECT * FROM emp WHERE deptno = 20;
END IF;

 
如果没有emp表,是不是还要建一个临时表emp呢?
 
如果游标的各种不同sql的返回的类型是一致的,那么你可以定义一个确定的return类型
如果不同sql的返回的类型也不一样,那么就不要使用curSubDataSet%ROWTYPE,而是
定义几个不同类型的变量来接收fetch的值
 
不一定是用 table%rowtype 的形式
也可以用record的形式定义一个类型(record和delphi的record类似)
 
我只是举了个EMP的例子,它可以是任何一个表或多个表,只要你select clause的
返回结果集兼容你前面在ref cursor中定义的返回类型就可以了
 
感谢两位,希望继续关注。
我的意思是:根据SQL的Clause的不同,检索到不同的数据到同一个Cursor中,
然后遍历该Cursor,对每条记录再进行处理。不但是rowtype的问题。
现在要解决的问题是怎样“根据不同条件定义一个游标”。

 
跟你说个大致的思路,具体怎么做自己再查资料

这里面的关键是类型匹配,那么你就该考虑如何使它们匹配?
可以用强制类型转换,例如:to_date,to_char之类的

其实这还关系到在做系统设计的时候是否考虑到了概念的统一的问题,
解决问题有时候要从一个较高的层次来着手
 
你就干脆举出实际的例子吧,你要用到的不同的sql命令有哪些?大的理论我不会,就事论事好一点
 
感谢各位,特别是沙隆巴斯的主人和PiPi,深得其惠。
 
多人接受答案了。
 
再次感谢Pipi继续关注。
这个存储过程因为有点业务逻辑,所以在这里不易于“就事论事”。我还是用这两天时间
逛逛书店吧。

现在我感觉问题出在怎样“根据不同条件定义一个游标”,
按照DFW上一个帖子上的做法,行不通,所以我还是多看看书吧。
当然, 希望你能继续关注这个问题,我的QQ号码是29216300,希望交个朋友,多向你学习。。
 
后退
顶部