请教‘游标变量为绑定变量输入数据’的问题

[复制链接]
查看11 | 回复9 | 2009-7-22 09:30:00 | 显示全部楼层 |阅读模式
目标:动态执行以下语句
insert into tmp_oa2
(value, value2, value3)
select '中山一路', count(distinct a.userid), count(a.sm_no)
from digit_assist a,
(select * from serv_st where permark = '1') b,
house c
where a.userid = b.userid
and b.houseno = c.houseno
and c.addr like '%中山一路%';
其中地址(例:中山一路),从tmp_oa的Value字段获取
我尝试如下方法:
declare
cursor get_addr is
select value from tmp_oa;
insrt varchar2(500) := 'insert into tmp_oa2(value, value2, value3)' ||

'select :1, count(distinct a.userid), count(a.sm_no)

from digit_assist a,

(select * from serv_st where permark = ''1'' ) b,

house c

where a.userid = b.userid

and b.houseno = c.houseno

and c.addr like ''%:2%''';
addstmp_oa.value%type;
begin
open get_addr;
loop
fetch get_addr
into adds;
execute immediate insrt
using adds, adds;
exit when get_addr%notfound;
end loop;
close get_addr;
end;
报错:bind varialble does not exist
应该是and c.addr like ''%:2%''' 有问题,,但不知道怎么改
求高手!!
回复

使用道具 举报

千问 | 2009-7-22 09:30:00 | 显示全部楼层
在select的字段中可以使用绑定变量?
还有我一般动态sql字符串都是用q'!select * from t where t='222' and a like '%:0%'!'这个去写的,你那个双引号不对吧...
回复

使用道具 举报

千问 | 2009-7-22 09:30:00 | 显示全部楼层
在select的字段中可以使用绑定变量?
还有我一般动态sql字符串都是用q'!select * from t where t='222' and a like '%:0%'!'这个去写的,你那个双引号不对吧...
回复

使用道具 举报

千问 | 2009-7-22 09:30:00 | 显示全部楼层
select的字段中是可以使用绑定变量的
改成 and c.addr =:2 是可以的
就是不知道要实现like '%中山一路%'在动态SQL中怎么写
回复

使用道具 举报

千问 | 2009-7-22 09:30:00 | 显示全部楼层
曲线救国
tmp_oa 的 Value 改写成 %中山一路%
动态SQL写成 like ||':2'
回复

使用道具 举报

千问 | 2009-7-22 09:30:00 | 显示全部楼层
and c.addr like ''%:2%'''====>
and c.addr like :2
execute .... using ... '%中山一路%' 这样就可以了,绑定变量应该是一个整体的东西
回复

使用道具 举报

千问 | 2009-7-22 09:30:00 | 显示全部楼层
SQL> DECLARE
2 v_sql VARCHAR2(2000);
3 v_cnt NUMBER;
4 BEGIN
5 v_sql := 'SELECT COUNT(*)FROM trademark
6 WHERE NAME LIKE ''%:name%''';
7 EXECUTE IMMEDIATE v_sql INTO v_cnt USING 'TD';
8 DBMS_OUTPUT.put_line(v_cnt);
9 END;
10/

DECLARE
v_sql VARCHAR2(2000);
v_cnt NUMBER;
BEGIN
v_sql := 'SELECT COUNT(*)FROM trademark
WHERE NAME LIKE ''%:name%''';
EXECUTE IMMEDIATE v_sql INTO v_cnt USING 'TD';
DBMS_OUTPUT.put_line(v_cnt);
END;

ORA-01006: 绑定变量不存在
ORA-06512: 在 line 8

SQL>
SQL> DECLARE
2 v_sql VARCHAR2(2000);
3 v_cnt NUMBER;
4 BEGIN
5 v_sql := 'SELECT COUNT(*)FROM trademark
6 WHERE NAME LIKE :name';
---:name不需要引号继续包起来,ORACLE知道他是个字符串7 EXECUTE IMMEDIATE v_sql INTO v_cnt USING '%TD%';
8 DBMS_OUTPUT.put_line(v_cnt);
9 END;
10/

2

PL/SQL procedure successfully completed
回复

使用道具 举报

千问 | 2009-7-22 09:30:00 | 显示全部楼层
问题是 USING '%TD%';
我这里TD要用 一个库表的某个字段作为输入数据

回复

使用道具 举报

千问 | 2009-7-22 09:30:00 | 显示全部楼层
你这个写动态语句干嘛??
回复

使用道具 举报

千问 | 2009-7-22 09:30:00 | 显示全部楼层
那用什么方法呢?
有几百个需要匹配的地址,存在一个表里
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行