pl/sql动态表查询问题 急!!!!!

[复制链接]
查看11 | 回复4 | 2012-5-21 10:19:41 | 显示全部楼层 |阅读模式
值得注意的是表的字段和表名都是靠参数传递的 动态查询 往各位大侠给改正 万分感谢!!!!!!

create or replace procedure aaaa (ziduan in varchar2,

biaoming in varchar2,

customerId in varchar2,

name1)is

v_sql varchar2(200);
v_fields varchar2(20);
fieldvarchar2(20);
field1varchar2(20);
v_1:='aaaaa';
v_2:='bbbb';
begin
v_sql:='select field:=ziduan from field1:=aaa where id=:customerId and name=:name1;
execute immediate v_sql into v_fieldsusing v_1 ,v_2;
end aaaa;
回复

使用道具 举报

千问 | 2012-5-21 10:19:41 | 显示全部楼层
v_sql:='select '||ziduan||' from '||biaoming||' where id=:customerId and name=:name1';
execute immediate v_sql into v_fieldsusing v_1 ,v_2;
回复

使用道具 举报

千问 | 2012-5-21 10:19:41 | 显示全部楼层

如果列名或者表名是动态确定的,建议使用dbms_sql, 这种方法效率更高!

回复

使用道具 举报

千问 | 2012-5-21 10:19:41 | 显示全部楼层
如果是写包程序的话, 一般也不用execute immediate statement.用dbms_sql对业务逻辑更好控制。 因为他把sql的parse和execute分开了。
回复

使用道具 举报

千问 | 2012-5-21 10:19:41 | 显示全部楼层
原帖由 bell6248 于 2010-2-5 15:33 发表

如果列名或者表名是动态确定的,建议使用dbms_sql, 这种方法效率更高!

是吗?
要用dbms_sql实现“软软解析”,你必须知道哪些游标是可再利用的,还要有个机制把它们缓存起来。在本例中就是一个即兴查询,要达到你说的效果就必须增加一些辅助结构,比如在内存中搞一个游标的INDEX BY数组,用表名和字段名做INDEX BY键,然后每次都看看是不是需要PARSE. 这样写起来是很费事的。
在10G中,连NATIVE DYNAMIC SQL(即EXECUTE IMMEDIATE这样的)都有自动游标缓存了,你完全不用dbms_sql来自己实现。
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行