PL / SQL的编译错误

时间:2014-05-21 05:24:27

标签: sql oracle plsql

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对吗?但我不知道如何解决它。 我的代码里面的错误是什么?

2 个答案:

答案 0 :(得分:3)

遗憾的是,这段代码没有多大意义。

您传递了两个date参数,date_indate_out。由于您传递了date个值,因此在to_date上调用to_date毫无意义 - date不接受in_date参数。

如果要在PL / SQL中引用变量,则引用该变量。您似乎正在使用恰好是过程参数的字符串名称的硬编码字符串值。

声明局部变量out_dateEND 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;