急!!oracle的存储过程(100分)

E

erbird

Unregistered / Unconfirmed
GUEST, unregistred user!
我建了一个表
Create Sequence SeInfoID
Start With 1
Increment By 1;

CREATE OR REPLACE TRIGGER YW_Info_RIGGER
BEFORE INSERT
ON YW_Info FOR EACH ROW
BEGIN
SELECT SeInfoID.NEXTVAL INTO :NEW.InfoID FROM DUAL;
END;
/

DROP TABLE YW_Info;
CREATE TABLE YW_Info(
InfoID number PRIMARY KEY, --信息ID
AcceptNum varchar2(14) NOT NULL Unique, --受理编号
PhoneCode varchar2(8) NOT NULL, --电话号码
Client varchar2(40), --客户名称
FormerClient varchar2(40), --原客户名称
Account varchar2(20), --用户帐号名
IDCard varchar2(18), --身份证号
RegisterDate date, --登记日期
FinishDate date, --竣工日期
InstallAddr varchar2(40), --装机地址
PicID number DEFAULT 0); --图片库的ID

现在我要写一个存储过程,功能是根据受理编号录入图片,下面是我写的存储过程:
CREATE OR REPLACE PROCEDURE PM_InfoAcceptProc
(cAccept IN OUT varchar2)
AS
curAcceptNum YW_Info.ACCEPTNUM%type;
BEGIN
SELECT ACCEPTNUM
INTO curAcceptNum
FROM YW_Info
WHERE AcceptNum Like '%'||cAccept||'%';
END;
/
但是在delphi中用ADOConnect通过Microsoft OLE DB Provider for Oracle连接时,
让ADOStoredProc的active为true时出错:未找到数据。存储过程创建时是正确的。

还有,这个存储过程不能满足我的要求,我不单是select acceptnum而已,我想
select * from YW_Info,选择所有的字段,如果这样做是不是要用到显式游标?
如果是,该怎么写??


 
请问有人能帮忙吗?
 
问题就是出在你的 procedure 中!
SELECT ACCEPTNUM
INTO curAcceptNum
FROM YW_Info
WHERE AcceptNum Like '%'||cAccept||'%';
这条语句返回单行时就不会出错,如果是多行记录,你调用该过程就会报错,
见意楼上:过程编译通过并不代表过程就没有错,所以写完后应当用数据测试一下,到底是用条件覆盖,还是语句覆盖,
OR 路径覆盖测试那就要看你的需求。
当然你的问题是要用到游标,但你的需求不明,代码就不好给出,一句话简单。
 
我的功能是:根据受理编号查询表YW_Info中的记录,模糊查询时查询到多条记录,隐式游标只能返回一
条记录,现在我用显示游标。
CREATE OR REPLACE PROCEDURE CX_InfoAcceptProc
(cAccept varchar2)
AS
c_Accept YW_Info%rowtype;
CURSOR curAccept is
SELECT *
FROM YW_Info
WHERE AcceptNum Like '%'||cAccept||'%';
BEGIN
open curAccept;
Loop
fetch curAccept into c_Accept;
Exit when curAccept%notfound;
End Loop;
close curAccept;
END;
/
在SQL/PLUS中用
begin
CX_INFOAcceptPROC;
end;
/
调试时提示错误:
*
ERROR 位于第 2 行:
ORA-06550: 第 2 行, 第 2 列:
PLS-00306: 调用 'CX_INFOAcceptPROC' 时参数数量或类型错误
ORA-06550: 第 2 行, 第 2 列:
PL/SQL: Statement ignored
在delphi中调用时提示:CommandText does not return a result set;
请问我该怎么做??
 
CREATE OR REPLACE PROCEDURE CX_InfoAcceptProc
(cAccept varchar2)
AS
c_Accept YW_Info.column_name%type;
CURSOR curAccept is
SELECT column_name
FROM YW_Info
WHERE AcceptNum Like '%'||cAccept||'%';
BEGIN
open curAccept;
Loop
fetch curAccept into c_Accept;
Exit when curAccept%notfound;
End Loop;
close curAccept;
END;

在SQL/PLUS中用
begin
CX_INFOAcceptPROC(此处必需参数值);
end;
/
朋友:你基本功太不过关了,+U啊!
 
原来我也是这样写的,但是%type只是使一列的类型相同,%rowtype是使一条记录的类型
相同,所以才能select * 而不是select column。不过现在关键问题不是这个,我在delphi
中这样用:
dmMain.spInfoAccept.Active:=False;
dmMain.spInfoAccept.Parameters.ParamByName('cAccept').Value:=Trim(CX_frmInputAccept.edtQueryA.Text);
dmMain.spInfoAccept.Active:=True;
dmMain.dsBrowInfo.DataSet:=dmMain.spInfoAccept;
ctrlPurview.WriteLog('进入信息查询模块');
if dmMain.spInfoAccept.RecordCount =0 then
{没有该受理编号}
MessageBox(Handle,'没有该受理编号','警告',MB_OK+MB_ICONWARNING)
else if dmMain.spInfoAccept.RecordCount =1 then begin
{同一个受理编号只找到一个记录}
{显示确认窗体}
If not Assigned(CX_frmBrowInfo) then
CX_frmBrowInfo:= TCX_frmBrowInfo.Create(Application);
CX_frmBrowInfo.ShowModal;
Self.Update;
每次执行查询时都报错:CommandText does not return a result set;
注:spInfoAccept是ADOStoredProc控件,edtQueryA输入受理编号的Edit。
 
请大家帮帮忙,在线等!
 
先在sqlplus中测试一下:exec CX_INFOAcceptPROC(var),其中var处要带入你的参数值。
你在procedure的定义中并没有设置输入参数的缺省值,必须显示带入。

如果在sqlplus中运行没有问题,则再在delphi环境下测试。
你所描述的错误好象会出现在存储过程处理了一些数据的情况下,如果存储过程没有合适
的数据进行处理,则不会出现错误。我一般情况下用的是bde,没有这样的问题。
查查其他的贴子,记得好象要升级ado还是什么的。
 
我解决了一些问题,新的问题请到
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1243028
看看,谢谢!
 
顶部