我写了个type包,定义了几个属性,然后在包的里面又写了个存储过程,在存储过程里,给type包的属性赋值,在通过plsqldevelop调试的时候,发现给type包的属性赋值后,这些属性的值却没有变,为什么啊?
是不是赋值的方法不对?谁能给指点一下?

解决方案 »

  1.   

    晕死,代码在公司,连u盘都不让带,不让往外考,记不太清啊大体就是这样:
    包头部分:
    create or replace type tp_1 as
      m_test1  varchar2(6);//包的一个属性  member procedure testprc(p_test1 varchar2(6)) 
    end;
    包体部分:
    create or replace type body tp_1 asprocedure testprc(p_test1 varchar2(6))  is
    begin
      m_test1:=p_test1//在调试的时候,到这一步,发现提示m_test1不是变量,在plsqldeveloper中的
                       //变量监视窗口显示p_test1的值并没有付给m_test1,为什么呀?
    end;测试这个包的存储过程的部分:
    create or replace procedure testtp_1 as
    vtp_1 tp_1;
    begin
      vtp_1.testprc('200601');
    end;经过调试发现,'200601'并没有传给m_test1为什么呀?
      

  2.   

    m_test1:=p_test1//在调试的时候,到这一步,发现提示m_test1不是变量,在plsqldeveloper中的
                      //变量监视窗口显示p_test1的值并没有付给m_test1,为什么呀? m_test1前面要加包名吧。
      

  3.   

    另外,
    create or replace type tp_1 as 
    似乎是创建一个类型。楼主可能记错了,是
    create or replace package tp_1 as 
      

  4.   

    SQL> create or replace package tp_1 as
      2    m_test1  varchar2(6);
      3    procedure testprc(p_test1 varchar2);
      4  end;
      5  /程序包已创建。SQL> create or replace package body tp_1 as
      2  procedure testprc(p_test1 varchar2 )  is
      3  begin
      4    tp_1.m_test1:=p_test1;
      5    dbms_output.put_line(tp_1.m_test1);
      6  end;
      7  end;
      8  /程序包主体已创建。SQL>
    SQL> exec tp_1.testprc('asdf');
    asdfPL/SQL 过程已成功完成。
      

  5.   

    对了,我的这个type是继承的
    包头是这样的create or replace type tp_1 under supertp_1 as 
      m_test1  varchar2(6);//包的一个属性   member procedure testprc(p_test1 varchar2(6)) 
    end; 
    supertp_1的代码记不太清了,但我觉着跟我的问题没关系
      

  6.   

    嗯,这样看来,你这个不是程序包,而是自定义类型的继承。
    自定义类型的属性赋值,只能在外部,内部会报错 PLS-00363: expression 'SELF.SP2' cannot be used as an assignment target。但是内部可以使用在外部赋的值。
    具体如下赋值:
    SQL> CREATE  OR  REPLACE  TYPE  supertp as OBJECT(
      2     sp1 varchar2(6),
      3     MEMBER   FUNCTION   YEN   (rate   IN   NUMBER)   RETURN   NUMBER
      4  ) not final;
      5  /类型已创建。SQL>
    SQL> CREATE   OR   REPLACE   TYPE   BODY   supertp   is
      2    MEMBER   FUNCTION   YEN(RATE   IN   NUMBER)   RETURN   NUMBER
      3    IS
      4    BEGIN
      5              RETURN   RATE*100;
      6    END;
      7    end;
      8  /类型主体已创建。SQL>
    SQL> create or replace type tp_c under supertp(
      2       sp2 varchar2(6),
      3       MEMBER   FUNCTION   YEN1   (rate   IN   NUMBER)   RETURN   NUMBER
      4  );
      5  /类型已创建。SQL>
    SQL> CREATE   OR   REPLACE   TYPE   BODY   tp_c   is
      2    MEMBER   FUNCTION   YEN1(RATE   IN   NUMBER)   RETURN   NUMBER
      3    IS
      4    BEGIN
      5     dbms_output.put_line(self.sp2);
      6              RETURN   RATE*100;
      7    END;
      8    end;
      9  /类型主体已创建。SQL>
    SQL>  declare
      2   a tp_c;
      3   b number;
      4   begin
      5   a:= tp_c('aaaa','bbbb');
      6   dbms_output.put_line(a.sp2);
      7   a.sp2 :='aaaa1';
      8   b :=a.yen1(100);
      9   dbms_output.put_line(a.sp2);
     10   dbms_output.put_line(b);
     11   end;
     12  /
    bbbb
    aaaa1
    aaaa1
    10000PL/SQL 过程已成功完成。