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