+ -
当前位置:首页 → 问答吧 → 请教PLS_00306问题

请教PLS_00306问题

时间:2011-09-14

来源:互联网

本人新手,写了两个存储过程,其中一个调用另一个存储过程,报PLS-00306:调用“BACKUPDEVICE”时参数个数或类型错误。找了半天没发现参数个数或类型的错误,向高手请教!

code:

CREATE OR REPLACE PROCEDURE BACKUPDEVICE
(
STATIONID IN OUT NUMBER,
DEVICEID IN OUT NUMBER,
DEVICEIP IN OUT NUMBER,
DEVICENAME IN OUT VARCHAR2,
DEVICETYPE IN OUT NUMBER
)
AS
BEGIN
INSERT INTO DEVICE
VALUES (STATIONID, DEVICEID, DEVICEIP, DEVICENAME,DEVICETYPE);
END;

CREATE OR REPLACE PROCEDURE station
(
bstationID number,
bDEVICEID  NUMBER,
bDEVICEIP  NUMBER,
bDEVICENAME  VARCHAR2,
bDEVICETYPE  NUMBER
)
as
begin
execute BACKUPDEVICE;
STATIONID:=bstationID ;
DEVICEID:=bDEVICEID  ;
DEVICEIP:=bDEVICEIP  ;
DEVICENAME:=bDEVICENAME  ;
DEVICETYPE:=bDEVICETYPE  ;
end;

   表DEVICE中的参数个数和类型我已经检查过,和存储过程中的一致,execute也已经授权。执行execute BACKUPDEVICE就报错。

作者: dobopo   发布时间: 2011-09-14

要传参啊

作者: dingjun123   发布时间: 2011-09-14

这个是存储过程语法问题,execute BACKUPDEVICE;  此处调用语法不对,
1)不需要execute
2)BACKUPDEVICE 的参数缺失,应该是 BACKUPDEVICE(bstationID, bDEVICEID   ,bDEVICEIP   ,bDEVICENAME ,bDEVICETYPE );
3)下面这部分是多余的,写法也不对
   STATIONID:=bstationID ;
DEVICEID:=bDEVICEID  ;
DEVICEIP:=bDEVICEIP  ;
DEVICENAME:=bDEVICENAME  ;
DEVICETYPE:=bDEVICETYPE  ;

作者: sohay   发布时间: 2011-09-14

不好意思,新手一个,能说清楚点吗!
execute  BACKUPDEVICE(bSTATIONID, bDEVICEID, bDEVICEIP, bDEVICENAME, bDEVICETYPE);这样也不行啊?

作者: dobopo   发布时间: 2011-09-14

我刚才也没完全说对,因为BACKUPDEVICE里的参数是 in out 类型,所以先要定义变量接受参数值,可以下面这样写:
CREATE OR REPLACE PROCEDURE station(bstationID  NUMBER,
                                    bDEVICEID   NUMBER,
                                    bDEVICEIP   NUMBER,
                                    bDEVICENAME VARCHAR2,
                                    bDEVICETYPE NUMBER) AS
    v_bstationID  NUMBER := bstationID;--接收参数值
    v_bDEVICEID   NUMBER := bDEVICEID;
    v_bDEVICEIP   NUMBER := bDEVICEIP;
    v_bDEVICENAME VARCHAR2(100) := bDEVICENAME;
    v_bDEVICETYPE NUMBER := bDEVICETYPE;
BEGIN
    BACKUPDEVICE(v_bstationID,
                 v_bDEVICEID,
                 v_bDEVICEIP,
                 v_bDEVICENAME,
                 v_bDEVICETYPE);
END;

作者: sohay   发布时间: 2011-09-14

为什么不需要execute?你说的STATIONID:=bstationID ;写法哪里有问题?
先谢了

作者: dobopo   发布时间: 2011-09-14

语法问题,在sqlplus下面调用存储过程 可以写成 execute backupdevice;
                在存储过程里调用就不需要了。

作者: sohay   发布时间: 2011-09-14

如果BACKUPDEVICE里的参数是都是 in  类型是否可以直接BACKUPDEVICE(bstationID,bDEVICEID,bDEVICEIP,bDEVICENAME,bDEVICETYPE)?

作者: dobopo   发布时间: 2011-09-14

可以

作者: sohay   发布时间: 2011-09-14