1

我正在使用 11g 我有桌子

CREATE TABLE Agency
(
AgencyID          int   not null PRIMARY KEY,
AgencyName        VARCHAR2(30) not null,
AgencyLtrCode     VARCHAR2(10) not null,
IsActive          VARCHAR2(3) DEFAULT 'yes'NOT NULL,
LastListSentData  DATE DEFAULT SYSDATE ,
LetterSendDate    DATE DEFAULT SYSDATE ,
CertificationDate DATE DEFAULT SYSDATE ,
CeresNo       int,
AgencyAreaID      int not null,
CONSTRAINT fk_Agency FOREIGN KEY (AgencyAreaID) REFERENCES AgencyArea(AriaID)
);

我使用过程在其中插入新记录

create or replace PROCEDURE insert_AGENCY_Procedure(
       AGENCYID IN AGENCY.AGENCYID%TYPE,
       AGENCYNAME IN AGENCY.AGENCYNAME%TYPE,
       AGENCYLTRCODE IN AGENCY.AGENCYLTRCODE%TYPE,  
       ISACTIVE IN AGENCY.ISACTIVE%TYPE DEFAULT 'yes',
       LASTLISTSENTDATA IN AGENCY.LASTLISTSENTDATA%TYPE DEFAULT SYSDATE,
       LETTERSENDDATE IN AGENCY.LETTERSENDDATE%TYPE DEFAULT SYSDATE,
       CERTIFICATIONDATE IN AGENCY.CERTIFICATIONDATE%TYPE DEFAULT SYSDATE,
       CERESNO IN AGENCY.CERESNO%TYPE,
       AGENCYAREAID IN AGENCY.AGENCYAREAID%TYPE)
IS BEGIN
  INSERT INTO AGENCY("AGENCYID", "AGENCYNAME","AGENCYLTRCODE","ISACTIVE","LASTLISTSENTDATA","LETTERSENDDATE","CERTIFICATIONDATE","CERESNO","AGENCYAREAID") 
  VALUES             (AGENCYID, AGENCYNAME,AGENCYLTRCODE,ISACTIVE,LASTLISTSENTDATA,LETTERSENDDATE,CERTIFICATIONDATE,CERESNO,AGENCYAREAID);
  COMMIT;
END;​​

现在它抛出错误“第 17 行错误:PLS-00103:遇到符号“”“第 17 行只有 END;在上面

当我提交插入看起来像

BEGIN
insert_AGENCY_Procedure(9003,'Some Other Church', 'SomOTCh','no',10-10-2011,10/10/2011,10/10/2011,17,2   );
END;

它抛出错误

ORA-06550: line 2, column 4:
PLS-00306: wrong number or types of arguments in call to 'INSERT_AGENCY_PROCEDURE'
ORA-06550: line 2, column 4:
PL/SQL: Statement ignored

或其他插入

BEGIN
insert_AGENCY_Procedure(9003,'Some Other Church',SomOTCh',DEFAULT,DEFAULT,DEFAULT,DEFAULT,17,2   );
END;

它抛出错误

ORA-06550: line 2, column 64:
PLS-00103: Encountered the symbol "DEFAULT" when expecting one of the following:

   ( - + case mod new not null 

问题是我的程序有什么问题?我试图解决这个问题但卡住了:(

4

4 回答 4

1

您正在传递九个值,但该过程只需要八个。从表定义中,您似乎AgencyLtrCode在过程中丢失了。

在第一次通话中,您将日期传递为10-10-2011or 10/10/2011,这将被评估为(不同的)数字而不是日期。您至少需要将它们括在单引号中,但实际上应该指定日期掩码,to_date('10/10/2011', 'DD/MM/YYYY')而不是依赖隐式转换。

一般来说,如果您想使用默认值,只需将这些参数保留,不要传递DEFAULT; 这在这种情况下是无效的。但是因为你有在默认值之后传递的值,你需要命名参数,即

insert_agency_procedure(agency_id=>9003, ...);
于 2012-11-14T21:15:31.263 回答
1

首先,该INSERT_AGENCY_PROCEDURE过程被定义为采用 8 个参数,但您尝试传入 9 个参数。看来您正在尝试传入 anAgencyLtrCode但该过程没有将 anAgencyLtrCode作为参数。您要么必须停止尝试传递,AgencyLtrCode要么需要修改过程以接受该参数。

其次,您需要将日期传递给给定声明的程序。您的实际过程调用将出错,因为您为日期参数传入的不是日期(并且不能隐式转换为日期)。假设我们消除了第三个参数(这似乎是AgencyLtrCode上面讨论的),你会想要类似的东西

BEGIN
  insert_AGENCY_Procedure(9003,
                          'Some Other Church', 
                          'no', 
                          to_date('10-10-2011', 'DD-MM-YYYY'), 
                          to_date('10/10/2011', 'DD/MM/YYYY'),
                          to_date('10/10/2011','DD/MM/YYYY'),
                          17,
                          2   );
END;

第三,你的程序不正确。参数LASTLISTSENTDATALETTERSENDDATECERTIFICATIONDATE被定义为日期,因此您不应调用to_date它们。如果这样做,则强制 Oracle 使用会话的 隐式将日期NLS_DATE_FORMAT转换为字符串,然后使用显式格式掩码将字符串转换回日期。如果会话NLS_DATE_FORMAT不是您所期望的,那将失败。

最后,在过程声明中间声明可选参数很少是正确的。如果要使用位置绑定并且希望能够省略参数,则可选参数需要位于参数列表的末尾。您可以在参数列表的中间定义可选参数,然后使用命名绑定(如DazzaL演示),但这很少是您想要强制未来开发人员使用的。

在您更新的过程中,AgencyLtrCode参数的声明似乎不正确

AGENCYLTRCODE IN AGENCYLTRCODE%TYPE

需要是

AGENCYLTRCODE IN AGENCY.AGENCYLTRCODE%TYPE

您缺少表的名称。

于 2012-11-14T21:17:04.007 回答
0

没有 DEFAULT 关键字,您只需省略默认值。

在您的情况下,您在 API 中间有默认值,因此您必须使用 NAMED 表示法:

begin
  insert_agency_procedure(agencyid => 9003,
                          agencyname => 'Some Other Church',
                          isactive => 'SomOTCh',
                          ceresno => 17,
                          agencyareaid => 2 );
end;
/
or mixed:
begin
  insert_agency_procedure(9003, 'Some Other Church',
                          'SomOTCh',
                          ceresno => 17,
                          agencyareaid => 2 );
end;
/

在你给出的第一个例子中:

BEGIN
insert_AGENCY_Procedure(9003,'Some Other Church', 'SomOTCh','no',10-10-2011,10/10/2011,10/10/2011,17,2   );
END;

你不能只输入这样的日期。首先引用它们。其次,始终使用格式掩码。

BEGIN
insert_AGENCY_Procedure(9003,'Some Other Church', 'SomOTCh','no',
                        to_date('10-10-2011', 'dd-mm-yyyy'),
                        to_date('10-10-2011', 'dd-mm-yyyy'),
                        to_date('10-10-2011', 'dd-mm-yyyy'),17,2   );
END;
于 2012-11-14T21:12:03.683 回答
0

我认为您需要将日期字符串括在单引号中(如果您提供日期,考虑到您有这些参数的默认值):

BEGIN
insert_AGENCY_Procedure(9003,'Some Other Church', 'SomOTCh','no','10-10-2011','10/10/2011','10/10/2011',17,2 );
END;
于 2012-11-14T21:12:44.610 回答