我想实现的功能是:五个变量,都是过程B的变量,我通过过程A调用过程B,首先是从account表中找出与变量account_相关的数据,放在临时表ACCOUNT_TEMP里,然后通过循环,把临时表中的数据当做过程B的参数,调用过程BProcedure A(sfdate_ in date, stodate_ in date, company_ in varchar2 ,account_ in varchar2 ,tjfg_ in varchar2)
is
  CA_  account.account%type;
  CB          DATE;
  CC          DATE;
  CD          VARCHAR2(20);
  CE          VARCHAR2(20);
  CF          VARCHAR2(20);
  CG          VARCHAR2(20);
  CH          VARCHAR2(20);
  CI          VARCHAR2(20);
  CJ          VARCHAR2(20);
CURSOR get_attr IS
   SELECT CA,CB,CC,CD,CE
   FROM ACCOUNT_TEMP;
beginif account_ is not null then
     select account into CA_ from account where account like account_||'%';
     insert into ACCOUNT_TEMP (
               CA,
               CB,
               CC,
               CD,
               CE,
               CF,
               CG,
               CH,
               CI,
               CJ)
     values (CA_,
             sfdate_,
             stodate_,
             company_,
             tjflag_,
               '',
               '',
               '',
               '',
               '');            
end if;
OPEN get_attr;
LOOP
fetch get_attr into CA_,CB,CC,CD,CE;
EXIT when get_attr%NOTFOUND;
A(CB , CC , CD  ,CA_ ,CE);
END LOOP;
end TJSJH;

解决方案 »

  1.   

    不知道你写这个干什么?
    所有的变量都是传入的参数
    还要先去account表找出account=account_的account值,再赋值给ca
    你又不做判断是否存在,如果没找到,此过程会出错
    如果找到了 那ca实际上等于account_
    另外不知道你account怎么控制,用like去判断可能会出现多条纪录的情况,也会出错
    如果不需要判断account是否存在,也没必要去查询account表你的TEMP表不删除的?
    这样的话,每次调用此过程,循环次数就会加1
      

  2.   

    谢谢hebo2005 回复我可能没说清楚,是这样,首先,我的变量都是从前台传入的参数,第二,我用like是因为我要实现的是这样,举个例子account表中的字段account有数据10,101,102,103,104,105,11,111,112,113,114我在前台传入的参数10,我就要把10,101,102,103,104,105,全部找出来放在TEMP表的CA字段中,然后把TEMP表中的这五条数据作为参数调用过程B.如果在前台传入的是11,则把11,111,112,113,114,全部找出来放在TEMP表的CA字段中,然后把TEMP表中的这四条数据作为参数调用过程B.第三,在把临时表中的数据当作参数调用过程B是要每条数据调用一次,也就是说前台传入11,那就要循环调用过程B五次。希望大家给些意见和建议,谢谢
      

  3.   

    account表中的字段account有数据10,101,102,103,104,105,11,111,112,113,114 
    你用LIKE就不对了,into只能是单一数据,你这样会出现多条数据,肯定报错的
    多条数据要用游标的
    照你的意思
    游标要改一下,临时表不需要了
    你这里变的只是account,其它参数都不变的
      

  4.   

    帮你改了下,你试试看PROCEDURE a (
       sfdate_    IN   DATE,
       stodate_   IN   DATE,
       company_   IN   VARCHAR2,
       account_   IN   VARCHAR2,
       tjfg_      IN   VARCHAR2
    )
    IS
       ca_   ACCOUNT.ACCOUNT%TYPE;   CURSOR get_attr
       IS
          SELECT ACCOUNT
            FROM ACCOUNT
           WHERE ACCOUNT LIKE account_ || '%';
    BEGIN
       OPEN get_attr;   LOOP
          FETCH get_attr
           INTO ca_;      EXIT WHEN get_attr%NOTFOUND;
          a (sfdate_, stodate_, company_, ca_, ce, tjflag_);
       END LOOP;
    EXCEPTION
       WHEN NO_DATA_FOUND
       THEN
          NULL;
       WHEN OTHERS
       THEN
          RAISE;
    END tjsjh;
      

  5.   

    上面的多写了个CEPROCEDURE a (
       sfdate_    IN   DATE,
       stodate_   IN   DATE,
       company_   IN   VARCHAR2,
       account_   IN   VARCHAR2,
       tjfg_      IN   VARCHAR2
    )
    IS
       ca_   ACCOUNT.ACCOUNT%TYPE;   CURSOR get_attr
       IS
          SELECT ACCOUNT
            FROM ACCOUNT
           WHERE ACCOUNT LIKE account_ || '%';
    BEGIN
       OPEN get_attr;   LOOP
          FETCH get_attr
           INTO ca_;      EXIT WHEN get_attr%NOTFOUND;
          a (sfdate_, stodate_, company_, ca_,  tjflag_);
       END LOOP;
    EXCEPTION
       WHEN NO_DATA_FOUND
       THEN
          NULL;
       WHEN OTHERS
       THEN
          RAISE;
    END tjsjh;
      

  6.   

    hebo2005 老大,谢谢不过老大,你这句话“你用LIKE就不对了,into只能是单一数据,你这样会出现多条数据,肯定报错的 ”我不太明白,“into”你指的是哪个?你说的删除动作我在循环后面加一句delete from ACCOUNT_TEMP;就可以了吧!老大,我上面的这个游标应该如何修改,可否帮帮忙。
      

  7.   

    在存储过程中
    select 
    into要求select的结果只能是一条纪录,不能出现多条纪录,否则会出错的
    所以
    select account into CA_ from account where account like account_ ¦ ¦'%';
    这条语句按你的数据,输入10,出来就是5条数据,就肯定会报错
      

  8.   

    老大,谢谢你的回复但是这条a (sfdate_, stodate_, company_, ca_,  tjflag_);我是要在过程A中的调用过程B,我改成   B (sfdate_, stodate_, company_, ca_,  tjflag_);可以吗?B中参数除了CA_是通过过程A得到的,其他的都是通过外部变量传入的,就是传给过程A之后,只在调用过程B的时候用了。