我正在使用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
问题是我的手术有什么问题?我试图解决这个问题,但卡住了:(
答案 0 :(得分:1)
你正在通过九个值,但程序只期望八个。从表定义中,您似乎在过程中缺少AgencyLtrCode
。
在第一次通话中,您将日期传递为10-10-2011
或10/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;
第三,您的程序不正确。参数LASTLISTSENTDATA
,LETTERSENDDATE
和CERTIFICATIONDATE
被定义为日期,因此您不应在其上调用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;