默认情况下的Oracle过程和to_date显示错误

时间:2012-11-14 21:01:51

标签: oracle default to-date

我正在使用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 个答案:

答案 0 :(得分:1)

你正在通过九个值,但程序只期望八个。从表定义中,您似乎在过程中缺少AgencyLtrCode

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

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

insert_agency_procedure(agency_id=>9003, ...);

答案 1 :(得分:1)

首先,INSERT_AGENCY_PROCEDURE过程被定义为采用8个参数,但您尝试传入9个参数。您似乎尝试传入AgencyLtrCode,但该过程不会将AgencyLtrCode作为参数。你要么必须停止尝试传递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

您缺少表格的名称。

答案 2 :(得分: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;

答案 3 :(得分:0)

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

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