CREATE OR REPLACE PROCEDURE TEST(
inv_number IN NUMBER,
cust_id IN NUMBER,
date_in IN DATE,
date_out IN DATE,
Sub_tot IN NUMBER,
tax IN NUMBER,
total IN NUMBER)
IS
in_date DATE;
out_date DATE;
BEGIN
in_date = to_date('date_in','MM/DD/YY');
out_date = to_date('date_out','MM/DD/YY');
IF ( out_date-in_date <= 3 AND out_date-in_date >= 0 ) THEN
INSERT INTO INVOICE VALUES( inv_number, cust_id, date_in,date_out,
Sub_tot,tax,total);
ELSE
DBMS_OUTPUT.put_line( "Date_in and Date_out wrong");
COMMIT;
END TEST;
/
ERROR: Procedure created with compilation errors.
问题出在In_date和Out_date对吗?但我不知道如何解决它。 我的代码里面的错误是什么?
答案 0 :(得分:3)
遗憾的是,这段代码没有多大意义。
您传递了两个date
参数,date_in
和date_out
。由于您传递了date
个值,因此在to_date
上调用to_date
毫无意义 - date
不接受in_date
参数。
如果要在PL / SQL中引用变量,则引用该变量。您似乎正在使用恰好是过程参数的字符串名称的硬编码字符串值。
声明局部变量out_date
和END IF
只是复制输入参数中的数据是没有意义的。只需在代码中引用输入参数即可。
您错过了IF
声明中的commit
。
另外,在程序中嵌入insert
语句通常是个坏主意,因为这会使它们不可重用。最好在insert
语句中列出您想要CREATE OR REPLACE PROCEDURE ...
IS
BEGIN
IF ( date_out-date_in between 0 and 3 )
THEN
INSERT INTO INVOICE (<<list your columns>> )
VALUES( inv_number, cust_id, date_in,date_out,
Sub_tot,tax,total);
ELSE
DBMS_OUTPUT.put_line( 'Date_in and Date_out wrong');
END IF;
END TEST;
值的列,因为这样可以使您的代码更清晰,并且更容易支持。我也错过了你使用双引号来分隔你的字符串而不是单引号的事实。
我的猜测是你需要像
这样的东西{{1}}
答案 1 :(得分:1)
您无法从日期字段'in_date = to_date('date_in','MM/DD/YY');'
获取to_date
date_in已经是日期字段。
to_date将字符串更改为日期格式,to_char将日期更改为字符串,此处您不需要
和&#39; =&#39; - 比较,&#39;:=&#39; - 授予
工作代码
CREATE OR REPLACE PROCEDURE TEST(
inv_number IN NUMBER,
cust_id IN NUMBER,
date_in IN DATE,
date_out IN DATE,
Sub_tot IN NUMBER,
tax IN NUMBER,
total IN NUMBER)
IS
in_date DATE;
out_date DATE;
BEGIN
in_date := date_in;
out_date := date_out;
IF ( out_date-in_date <= 3 AND out_date-in_date >= 0 ) THEN
-- INSERT INTO INVOICE VALUES( inv_number, cust_id, date_in,date_out,
-- Sub_tot,tax,total);
dbms_output.put_line('true');
ELSE
DBMS_OUTPUT.put_line( 'Date_in='||to_char(date_in,'MM/DD/YY')|| ' and Date_out='||to_char(date_out,'MM/DD/YY')||' wrong');
--COMMIT;
END IF;
END TEST;
/
begin
TEST(inv_number =>1,
cust_id =>1,
date_in =>sysdate,
date_out =>sysdate+6,
Sub_tot=>1,
tax =>1,
total=>1);
end;