执行如下程序段:
1:   declare
2:       myapple number(10);
3:   begin
4:       dbms_output.put_line(myapple);
5:       myapple:=myapple+1;
6:       dbms_output.put_line(myapple);
7:   end;
这个程序段执行以后,什么结果都没有。
那么系统在执行第二句后,是否会为myapple分配空间,是否会为它赋默认初值?
如果没有初始值,那么第四句话不会有输出,但是为什么执行第五句话后仍然没有输出?

解决方案 »

  1.   

    myapple变量没有赋初值就为null,任何数+null仍为null!
    SQL> DECLARE
      2    myapple NUMBER(10);
      3  BEGIN
      4    IF myapple IS NULL THEN
      5      dbms_output.put_line('myapple=null');
      6    END IF;
      7    dbms_output.put_line(myapple);
      8    myapple := myapple + 1;
      9    IF myapple IS NULL THEN
     10      dbms_output.put_line('myapple + 1=null');
     11    END IF;
     12    dbms_output.put_line(myapple);
     13  END;
     14  /
    myapple=null
    myapple + 1=nullPL/SQL 过程已成功完成。SQL> PL/SQL 过程已成功完成。
      

  2.   

    是否分配空间不清楚,没研究过。但是不会给变量赋默认初始值。
    既然变量都没有赋值,那这句myapple:=myapple+1的执行结果肯定也是没有值的。个人认为这一句有问题,既然变量没赋值,+1也还是相当于没有赋值,因此第五句当然不会有输出
      

  3.   

     declare
     myapple number(10) := 1;
     begin
     dbms_output.put_line(myapple);
     myapple:=myapple+1;
      dbms_output.put_line(myapple);
    end;
    数据库底层实现  只是说下我的看法 myapple number(10);定义了变量 应该有所谓的分配空间(不过数据库里好像不这么说),至于初始值应该是null,第四句话不会有输出是因为null+number=null
      

  4.   

    myapple 没有出示赋值,Oracle会认为它的值是null,即使后面计算了myapple:=myapple+1 ,仍然改不了null。  可以在声明的时候这样:myapple number(10):=0;
      

  5.   

    需要:set serveroutput on这样 dbms_output.put_line 才有输出
      

  6.   

    楼上的正解,不过,无论是serveroutput on还是off,null值都是put_line不出来的。
    请看下述过程:
    SQL> set serveroutput on
    SQL> exec dbms_output.put_line(null);PL/SQL procedure successfully completed.SQL> exec dbms_output.put_line(null+1);PL/SQL procedure successfully completed.SQL> exec dbms_output.put_line(1+null);PL/SQL procedure successfully completed.SQL> exec dbms_output.put_line(1+1);                               
    2PL/SQL procedure successfully completed.SQL> set serveroutput off
    SQL> exec dbms_output.put_line(1+1);  PL/SQL procedure successfully completed.SQL>