PL / SQL如何调用另一个过程

时间:2013-12-04 00:21:06

标签: sql oracle stored-procedures plsql oracle11g

我在调用DateTimeSP时遇到问题。我的错误日志:

PLS:00201 identifier 'Call.DateTimeSP' must be declared; statement ignored..

我的通话声明有什么问题,我的格式是对吗?

CREATE OR REPLACE
PROCEDURE "DeviceAssignSP" (iMachine IN VARCHAR2, oDevice OUT VARCHAR2, oRDO OUT VARCHAR2, oRCO OUT VARCHAR2, oUID OUT VARCHAR2, oDate OUT VARCHAR2, oTime OUT VARCHAR2, oSession OUT VARCHAR2, oNow OUT VARCHAR2)
AS
BEGIN

    SELECT a.DEVICE_CODE, a.RDO_CODE, a.RCO_CODE, b.USER_ID 
        INTO oDevice, oRDO, oRCO, oUID 
            FROM tbl_user_assign_device a 
                INNER JOIN tbl_user_information b ON a.PERSONNEL_NO = b.PERSONNEL_NO
                    WHERE DEVICE_CODE = iMachine AND USRDEVICE_STATUS = 'A' AND b.USER_STATUS = 'A' AND a.RDO_CODE = b.RDO_CODE AND rownum <= 1;

    IF oRDO IS NULL AND oRCO IS NULL THEN

        SELECT a.DEVICE_CODE, '000', '000000', b.USER_ID
            INTO oDevice, oRDO, oRCO, oUID
                FROM tbl_user_assign_device a 
                    INNER JOIN tbl_user_information b ON a.PERSONNEL_NO = b.PERSONNEL_NO
                        WHERE DEVICE_CODE = iMachine AND USRDEVICE_STATUS = 'A' AND b.USER_STATUS = 'A' AND rownum <= 1;

    ELSIF oRCO IS NULL THEN

        SELECT a.DEVICE_CODE, a.RDO_CODE, '000000', b.USER_ID
            INTO oDevice, oRDO, oRCO, oUID
                FROM tbl_user_assign_device a 
                    INNER JOIN tbl_user_information b ON a.PERSONNEL_NO = b.PERSONNEL_NO
                        WHERE DEVICE_CODE = iMachine AND USRDEVICE_STATUS = 'A' AND b.USER_STATUS = 'A' AND a.RDO_CODE = b.RDO_CODE AND rownum <= 1;

    END IF;

    SELECT SEST_VAL 
        INTO oSession 
            FROM tbl_session_timeout 
                WHERE SEST_STATUS = 'A';

 Call."DateTimeSP"('DATE', oDate);

 Call."DateTimeSP"('TIME', oTime);

 Call."DateTimeSP"('NOWFORMAT', oNow);

END;

1 个答案:

答案 0 :(得分:1)

您不需要call从另一个存储过程调用一个存储过程。

CREATE OR REPLACE
PROCEDURE "DeviceAssignSP" (
  iMachine IN VARCHAR2, 
  oDevice OUT VARCHAR2, 
  oRDO OUT VARCHAR2, 
  oRCO OUT VARCHAR2, 
  oUID OUT VARCHAR2, 
  oDate OUT VARCHAR2, 
  oTime OUT VARCHAR2, 
  oSession OUT VARCHAR2, 
  oNow OUT VARCHAR2)
AS
BEGIN
  <<your SQL statements>>

  "DateTimeSp"( 'DATE', oDate );
  "DateTimeSp"( 'TIME', oTime);
  "DateTimeSp"( 'NOWFORMAT', oNow );
END;

由于您似乎是PL / SQL的新手,但有一些评论,但是......

  • 使用区分大小写的标识符(双引号中的过程名称)非常罕见。 SQL和PL / SQL通常是不区分大小写的。在命名和调用过程时按惯例使用混合大小写是完全合理的,但是强制每个人使用区分大小写的标识符并且用双引号丢弃它们的代码通常不太理想。
  • SQL语句的格式是唯一的。这可能不是一件好事。关于如何在PL / SQL中格式化SQL有几种不同的约定 - 使用它们中的任何一种都比仅仅越来越多地缩进每一行更有意义。
  • 具有8个输出参数的过程似乎有问题 - 很容易忘记或混淆那么多参数的顺序。也许您想要返回记录类型或对象类型?
  • 程序应修改数据。如果你只是在进行计算,那些通常属于函数(这使得你更希望一个函数返回一个记录或一个对象,而不是一个带有一堆OUT参数的函数)。