例二:
create or replace procedure dynamic_ship_detail(ship_str_ in string) is
row_no_          number:=1;
part_no_         varchar2(200);
part_name_       varchar2(200);
TYPE mycursor IS REF CURSOR; --定义游标类型
line_rec   mycursor;--定义游标实例
begin
  
  OPEN line_rec FOR ship_str_;
  LOOP 
     FETCH line_rec into part_no_,part_name_;
  insert into aa_ship_detail_tab
  values(1,0,row_no_,part_no_,part_name_);
  row_no_:=row_no_+1;
  EXIT WHEN line_rec%NOTFOUND; 
  END LOOP; 
  CLOSE line_rec;
  commit;
end dynamic_ship_detail;
这个进程能编译通过,然后我在PB中赋值给一字符串str_='select part_no,part_name from inventory_transaction_hist_tab where transaction_code='OESHIP' and date_applied>=to_date('2003-7-10','yyyy-mm-dd') and date_applied<=('2003-7-15','yyyy-mm-dd')'然后调用这个进程,并传入参数str_。但无法在表中查询到结果。PB中调用此进程无误。
 在SQLPLUS下调用该PROCEDURE,是否好用????

解决方案 »

  1.   

    --create or replace procedure dynamic_ship_detail(ship_str_ in string) is
    把string 改为varchar2看看
      

  2.   

    SQL> desc tabname;
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------------------
     ID                                                 NUMBER(10)
     NAME                                               VARCHAR2(10)SQL> select name from tabname;NAME
    ----------
    adfsdf
    sdfsdfSQL> create or replace procedure test(str in string) 
      2  is 
      3  h_name varchar2(10):=null;
      4  type mycursor is ref cursor;
      5  h_mycursor mycursor;
      6  begin
      7   open h_mycursor for str;
      8   loop
      9    fetch h_mycursor into h_name;
     10    exit when h_mycursor%notfound;
     11    dbms_output.put_line(h_name);
     12   end loop;
     13   close h_mycursor;
     14  end;
     15  /Procedure created.SQL> exec test('select name from tabname');
    adfsdf
    sdfsdfPL/SQL procedure successfully completed.SQL> 
      

  3.   

    我帮你改了一下,已经测试过
    create or replace procedure dynamic_ship_detail is
      row_no_          number:=1;
      part_no_         varchar2(200);
      part_name_       varchar2(200);
      ship_str_      varchar2(200);
      tran_code_     varchar2(300);
      from_date_     varchar2(20);
      to_date_       varchar2(20);
    TYPE mycursor IS REF CURSOR; --定义游标类型
    line_rec   mycursor;--定义游标实例
    begin  --ship_str_:='select part_no,part_name from inventory_transaction_hist_tab where transaction_code=tran_code_ and date_applied>=from_date_ and date_applied<=to_date_';--定义游标动态SQL语句
      tran_code_:= 'OESHIP';
      from_date_:='2002-01-10';
      to_date_:='2003-07-15';
      ship_str_:='select part_no,part_name from inventory_transaction_hist_tab where transaction_code='||
      chr(39)||tran_code_||chr(39)|| ' and  date_applied>=to_date('||chr(39)||from_date_||chr(39)||','||chr(39)||'yyyy-mm-dd'||chr(39)||')'
      ||' and  date_applied<=to_date('||chr(39)||to_date_||chr(39)||','||chr(39)||'yyyy-mm-dd'||chr(39)||')';
      OPEN line_rec FOR ship_str_;-- using tran_code_,from_date_,to_date_;
      LOOP 
         FETCH line_rec into part_no_,part_name_;
           EXIT WHEN line_rec%NOTFOUND; 
         insert into aa_ship_detail_tab
         values(row_no_,part_no_,part_name_);
         row_no_:=row_no_+1;
      END LOOP; 
      CLOSE line_rec;
      commit;
    end dynamic_ship_detail;
      

  4.   

    str_='select part_no,part_name from inventory_transaction_hist_tab where transaction_code=''OESHIP'' and date_applied>=to_date(''2003-7-10'',''yyyy-mm-dd'') and date_applied<=(''2003-7-15'',''yyyy-mm-dd'')'另外,fetch .... 后跟exit when ...
    修改为:
    LOOP 
      FETCH line_rec into part_no_,part_name_;
      EXIT WHEN line_rec%NOTFOUND; 
      insert into aa_ship_detail_tab
      values(1,0,row_no_,part_no_,part_name_);
      row_no_:=row_no_+1;
      END LOOP;
      

  5.   

    楼上的对偶创表aa_ship_detail_tab时没创(1,0这两个字段
      

  6.   

    谢谢各位。我今天还做了测试,如果传入进程的SQL语句不带参数,我的例二也是可以通过的。
    我现在主要问题是:我想再PB中动态生成SQL语句,然后将这个SQL语句传入ORACLE进程中生成动态游标。但从PB中生成的动态SQL语句如果查询条件(不是表连接查询条件)就不能产生数据。进程和PB中调用都不报错,但就是不产生数据,主要是动态游标没执行的原因。请问各位怎么解决?
    clzzcl(倾城之恋(SDK)) :你的方法主要是解决了调用动态游标时的参数传递问题。我明天改改你的程序再试试。
     beckhambobo(beckham) :你把SQL语句中参数的单引号该为两个单引号,这个我从来没用过,你测试过,这样可以吗。
    上面问题如果能解决传入进程的SQL语句能带单引号的问题,这个问题应该也是可以解决的。还望各位继续赐教。