oracle sql动态执行问题(动态表名)

时间:2021-10-21 09:30:32
如题,其实是个典型的问题,网上查到的方法一般是动态拼接SQL语句执行,但现在我的SQL太长了,全部动态执行很难阅读,对于以后维护也很麻烦。


我有一个想法就是把动态的部分数据先查找出来,放到临时表或者游标什么的上面,或者是动态创建一个视图。但试过都不成功。不知道有没有人遇到过类似情况???又怎么样解决?

27 个解决方案

#1


oracle sql动态执行问题(动态表名)动态执行 ?还没理解?

#2


弄个动态语句配置表,分查找的字段,表,where条件 几列,然后程序里通过配置表动态生成sql语句

#3


在function里面,return ref cursor

#4


SQL人人拼,易不易读靠自己。

你完全可以在拼sql的时候把书写格式写成你易读的, 把拼接结果也写成你易读的

动态表名,不好意思只能用拼接

否则你只能,根据动态表的个数 写N个表名不同的sql。
oracle sql动态执行问题(动态表名)

#5


引用 2 楼 ssqtjffcu1 的回复:
弄个动态语句配置表,分查找的字段,表,where条件 几列,然后程序里通过配置表动态生成sql语句
你这个实质就是把数据库提到程序上执行了吧,我的意思是写全程在数据库层执行,存储过程或者函数或者包之类的

#6


引用 3 楼 qq1916685285 的回复:
在function里面,return ref cursor
你的意思是把表名作为参数传到函数里面,把查询结果作为游标返回?

#7


引用 4 楼 BenChiM888 的回复:
SQL人人拼,易不易读靠自己。

你完全可以在拼sql的时候把书写格式写成你易读的, 把拼接结果也写成你易读的

动态表名,不好意思只能用拼接

否则你只能,根据动态表的个数 写N个表名不同的sql。
其实主要差别就是拼接的时候,变量要
'where a='''||变量||''' and 其他字符串'
||但是直接写的时候变量周围不需要引号也不需要||连接

#8



sql_str := 'SELECT A.id   '||chr(13)||
           '       A.name '||chr(13)||
           ' FROM  A      '||chr(13)||
           ' WHERE A.ID = '||chr(39)||变量1||||chr(39);
--这有什么不好读的?

引用 7 楼 p2227 的回复:
引用 4 楼 BenChiM888 的回复:SQL人人拼,易不易读靠自己。

你完全可以在拼sql的时候把书写格式写成你易读的, 把拼接结果也写成你易读的

动态表名,不好意思只能用拼接

否则你只能,根据动态表的个数 写N个表名不同的sql。其实主要差别就是拼接的时候,变量要
SQL code1'where a='''||变量||''' and 其他字符串……

#9


引用 6 楼 p2227 的回复:
引用 3 楼 qq1916685285 的回复:在function里面,return ref cursor你的意思是把表名作为参数传到函数里面,把查询结果作为游标返回?


返回一个游标又能怎么样? 你能把一个结果集作为另一个查询的子查询?

#10


引用 5 楼 p2227 的回复:
引用 2 楼 ssqtjffcu1 的回复:弄个动态语句配置表,分查找的字段,表,where条件 几列,然后程序里通过配置表动态生成sql语句你这个实质就是把数据库提到程序上执行了吧,我的意思是写全程在数据库层执行,存储过程或者函数或者包之类的

我说的程序就是指数据库的存储过程拉,在存储过程里读取配置表,生成动态语句,然后动态执行。

#11


引用 10 楼 ssqtjffcu1 的回复:
引用 5 楼 p2227 的回复:引用 2 楼 ssqtjffcu1 的回复:弄个动态语句配置表,分查找的字段,表,where条件 几列,然后程序里通过配置表动态生成sql语句你这个实质就是把数据库提到程序上执行了吧,我的意思是写全程在数据库层执行,存储过程或者函数或者包之类的
我说的程序就是指数据库的存储过程拉,在存储过程里读取配置表, 生成动态语句,然后动态执行。
 ……
生成动态语句你的这一步怎么实现

#12


引用 9 楼 yuppy 的回复:
引用 6 楼 p2227 的回复:引用 3 楼 qq1916685285 的回复:在function里面,return ref cursor你的意思是把表名作为参数传到函数里面,把查询结果作为游标返回?

返回一个游标又能怎么样? 你能把一个结果集作为另一个查询的子查询?
我也不理解3楼的意思

#13


引用 8 楼 BenChiM888 的回复:
SQL code123456sql_str := 'SELECT A.id   '||chr(13)||           '       A.name '||chr(13)||           ' FROM  A      '||chr(13)||           ' WHERE A.ID = '||chr(39)||变量1||||chr(39);--这有什么……
那如果客户的需要又变了,另外又要连接多一张表进行查询,那你又怎么样可以快速地更改SQL进行测试?而不是等到存储过程在执行的过程中,查看变量再把语句提取才能看到才修改呢

#14


楼主能否把你的问题再详细描述一篇,最好有例子,想要的结果。现在我还不是很明白楼主你要解决的问题是什么

#15


引用 13 楼 p2227 的回复:
引用 8 楼 BenChiM888 的回复:SQL code123456sql_str := 'SELECT A.id   '||chr(13)||           '       A.name '||chr(13)||           ' FROM  A      '||chr(13)||           ' WHERE A.ID = '||chr(39)|……


本身根据需求不一样变化表名的处理方式就是垃圾的方式,既然你选择了这种方式,就要承担这种方式的后果
事情没有绝对的完美,只有相对的平衡
你选择了少写代码,动态拼接,就要承受这样带来后期维护的痛苦
你想减轻后期维护的痛苦,就像你说的客户需求变化,你就要在前期付出努力
鱼和熊掌不能兼得
oracle sql动态执行问题(动态表名)

#16


引用 14 楼 ssqtjffcu1 的回复:
楼主能否把你的问题再详细描述一篇,最好有例子,想要的结果。现在我还不是很明白楼主你要解决的问题是什么
呃,是这样子,我不是不知道现在的SQL怎么写,而是求高效率的写法。而现在觉得不高效率的是里面有一段表名动态查询的部分,对于维护不高效率。

情景就类似于这样吧  http://zhidao.baidu.com/question/489664010.html

#17


引用 15 楼 BenChiM888 的回复:
引用 13 楼 p2227 的回复:引用 8 楼 BenChiM888 的回复:SQL code123456sql_str := 'SELECT A.id   '||chr(13)||           '       A.name '||chr(13)||           ' FROM  A      '||chr(13)||           ' WHERE ……
前期表不是我建立的……

#18



begin 
    str_sql:=create table ||table_name||(||field1|| ||datatype1||,||field2|| ||datatype2||);
    execute immediate str_sql;   --动态执行DDL语句
    exception 
        when others then 
            null;
end ;

#19


引用 16 楼 p2227 的回复:
引用 14 楼 ssqtjffcu1 的回复:楼主能否把你的问题再详细描述一篇,最好有例子,想要的结果。现在我还不是很明白楼主你要解决的问题是什么呃,是这样子,我不是不知道现在的SQL怎么写,而是求高效率的写法。而现在觉得不高效率的是里面有一段表名动态查询的部分,对于维护不高效率。

情景就类似于这样吧 http://zhidao.baidu.com/question……

看了那情景,你的表是动态的,没办法,只能动态拼了,要不然你想要达到怎么个高效,方便维护?

#20


引用 18 楼 qq53090120 的回复:
SQL code12345678begin     str_sql:=create table ||table_name||(||field1|| ||datatype1||,||field2|| ||datatype2||);    execute immediate str_sql;   --动态执行DDL语句    exception         when ot……
您这语句没有多大意义吧,在查询的时候也是要动态拼接,为啥还要动态创建表呢

#21


引用 19 楼 ssqtjffcu1 的回复:
引用 16 楼 p2227 的回复:引用 14 楼 ssqtjffcu1 的回复:楼主能否把你的问题再详细描述一篇,最好有例子,想要的结果。现在我还不是很明白楼主你要解决的问题是什么呃,是这样子,我不是不知道现在的SQL怎么写,而是求高效率的写法。而现在觉得不高效率的是里面有一段表名动态查询的部分,对于维护不高效率。

情景就类似于这样吧 http://zhidao.……
就是不知道所以问……我是求思路的

#22


引用 21 楼 p2227 的回复:
引用 19 楼 ssqtjffcu1 的回复:引用 16 楼 p2227 的回复:引用 14 楼 ssqtjffcu1 的回复:楼主能否把你的问题再详细描述一篇,最好有例子,想要的结果。现在我还不是很明白楼主你要解决的问题是什么呃,是这样子,我不是不知道现在的SQL怎么写,而是求高效率的写法。而现在觉得不高效率的是里面有一段表名动态查询的部分,对于维护不高效率。

情……


思路已经告诉你了,你不听,咋办?

#23


引用 22 楼 BenChiM888 的回复:
引用 21 楼 p2227 的回复:引用 19 楼 ssqtjffcu1 的回复:引用 16 楼 p2227 的回复:引用 14 楼 ssqtjffcu1 的回复:楼主能否把你的问题再详细描述一篇,最好有例子,想要的结果。现在我还不是很明白楼主你要解决的问题是什么呃,是这样子,我不是不知道现在的SQL怎么写,而是求高效率的写法。而现在觉得不高效率的是里面有一段表名动态查询……
没有不听啊,在综合考虑中

#24


引用 23 楼 p2227 的回复:
引用 22 楼 BenChiM888 的回复:引用 21 楼 p2227 的回复:引用 19 楼 ssqtjffcu1 的回复:引用 16 楼 p2227 的回复:引用 14 楼 ssqtjffcu1 的回复:楼主能否把你的问题再详细描述一篇,最好有例子,想要的结果。现在我还不是很明白楼主你要解决的问题是什么呃,是这样子,我不是不知道现在的SQL怎么写,而是求高效率的写法……


呵呵,那祝好运。
oracle sql动态执行问题(动态表名)

#25


http://www.16kan.com/post/216040.html

#26


连功能都完成不了谈效率,谈笑话吧。

#27


该回复于2012-12-29 11:14:29被管理员删除

#1


oracle sql动态执行问题(动态表名)动态执行 ?还没理解?

#2


弄个动态语句配置表,分查找的字段,表,where条件 几列,然后程序里通过配置表动态生成sql语句

#3


在function里面,return ref cursor

#4


SQL人人拼,易不易读靠自己。

你完全可以在拼sql的时候把书写格式写成你易读的, 把拼接结果也写成你易读的

动态表名,不好意思只能用拼接

否则你只能,根据动态表的个数 写N个表名不同的sql。
oracle sql动态执行问题(动态表名)

#5


引用 2 楼 ssqtjffcu1 的回复:
弄个动态语句配置表,分查找的字段,表,where条件 几列,然后程序里通过配置表动态生成sql语句
你这个实质就是把数据库提到程序上执行了吧,我的意思是写全程在数据库层执行,存储过程或者函数或者包之类的

#6


引用 3 楼 qq1916685285 的回复:
在function里面,return ref cursor
你的意思是把表名作为参数传到函数里面,把查询结果作为游标返回?

#7


引用 4 楼 BenChiM888 的回复:
SQL人人拼,易不易读靠自己。

你完全可以在拼sql的时候把书写格式写成你易读的, 把拼接结果也写成你易读的

动态表名,不好意思只能用拼接

否则你只能,根据动态表的个数 写N个表名不同的sql。
其实主要差别就是拼接的时候,变量要
'where a='''||变量||''' and 其他字符串'
||但是直接写的时候变量周围不需要引号也不需要||连接

#8



sql_str := 'SELECT A.id   '||chr(13)||
           '       A.name '||chr(13)||
           ' FROM  A      '||chr(13)||
           ' WHERE A.ID = '||chr(39)||变量1||||chr(39);
--这有什么不好读的?

引用 7 楼 p2227 的回复:
引用 4 楼 BenChiM888 的回复:SQL人人拼,易不易读靠自己。

你完全可以在拼sql的时候把书写格式写成你易读的, 把拼接结果也写成你易读的

动态表名,不好意思只能用拼接

否则你只能,根据动态表的个数 写N个表名不同的sql。其实主要差别就是拼接的时候,变量要
SQL code1'where a='''||变量||''' and 其他字符串……

#9


引用 6 楼 p2227 的回复:
引用 3 楼 qq1916685285 的回复:在function里面,return ref cursor你的意思是把表名作为参数传到函数里面,把查询结果作为游标返回?


返回一个游标又能怎么样? 你能把一个结果集作为另一个查询的子查询?

#10


引用 5 楼 p2227 的回复:
引用 2 楼 ssqtjffcu1 的回复:弄个动态语句配置表,分查找的字段,表,where条件 几列,然后程序里通过配置表动态生成sql语句你这个实质就是把数据库提到程序上执行了吧,我的意思是写全程在数据库层执行,存储过程或者函数或者包之类的

我说的程序就是指数据库的存储过程拉,在存储过程里读取配置表,生成动态语句,然后动态执行。

#11


引用 10 楼 ssqtjffcu1 的回复:
引用 5 楼 p2227 的回复:引用 2 楼 ssqtjffcu1 的回复:弄个动态语句配置表,分查找的字段,表,where条件 几列,然后程序里通过配置表动态生成sql语句你这个实质就是把数据库提到程序上执行了吧,我的意思是写全程在数据库层执行,存储过程或者函数或者包之类的
我说的程序就是指数据库的存储过程拉,在存储过程里读取配置表, 生成动态语句,然后动态执行。
 ……
生成动态语句你的这一步怎么实现

#12


引用 9 楼 yuppy 的回复:
引用 6 楼 p2227 的回复:引用 3 楼 qq1916685285 的回复:在function里面,return ref cursor你的意思是把表名作为参数传到函数里面,把查询结果作为游标返回?

返回一个游标又能怎么样? 你能把一个结果集作为另一个查询的子查询?
我也不理解3楼的意思

#13


引用 8 楼 BenChiM888 的回复:
SQL code123456sql_str := 'SELECT A.id   '||chr(13)||           '       A.name '||chr(13)||           ' FROM  A      '||chr(13)||           ' WHERE A.ID = '||chr(39)||变量1||||chr(39);--这有什么……
那如果客户的需要又变了,另外又要连接多一张表进行查询,那你又怎么样可以快速地更改SQL进行测试?而不是等到存储过程在执行的过程中,查看变量再把语句提取才能看到才修改呢

#14


楼主能否把你的问题再详细描述一篇,最好有例子,想要的结果。现在我还不是很明白楼主你要解决的问题是什么

#15


引用 13 楼 p2227 的回复:
引用 8 楼 BenChiM888 的回复:SQL code123456sql_str := 'SELECT A.id   '||chr(13)||           '       A.name '||chr(13)||           ' FROM  A      '||chr(13)||           ' WHERE A.ID = '||chr(39)|……


本身根据需求不一样变化表名的处理方式就是垃圾的方式,既然你选择了这种方式,就要承担这种方式的后果
事情没有绝对的完美,只有相对的平衡
你选择了少写代码,动态拼接,就要承受这样带来后期维护的痛苦
你想减轻后期维护的痛苦,就像你说的客户需求变化,你就要在前期付出努力
鱼和熊掌不能兼得
oracle sql动态执行问题(动态表名)

#16


引用 14 楼 ssqtjffcu1 的回复:
楼主能否把你的问题再详细描述一篇,最好有例子,想要的结果。现在我还不是很明白楼主你要解决的问题是什么
呃,是这样子,我不是不知道现在的SQL怎么写,而是求高效率的写法。而现在觉得不高效率的是里面有一段表名动态查询的部分,对于维护不高效率。

情景就类似于这样吧  http://zhidao.baidu.com/question/489664010.html

#17


引用 15 楼 BenChiM888 的回复:
引用 13 楼 p2227 的回复:引用 8 楼 BenChiM888 的回复:SQL code123456sql_str := 'SELECT A.id   '||chr(13)||           '       A.name '||chr(13)||           ' FROM  A      '||chr(13)||           ' WHERE ……
前期表不是我建立的……

#18



begin 
    str_sql:=create table ||table_name||(||field1|| ||datatype1||,||field2|| ||datatype2||);
    execute immediate str_sql;   --动态执行DDL语句
    exception 
        when others then 
            null;
end ;

#19


引用 16 楼 p2227 的回复:
引用 14 楼 ssqtjffcu1 的回复:楼主能否把你的问题再详细描述一篇,最好有例子,想要的结果。现在我还不是很明白楼主你要解决的问题是什么呃,是这样子,我不是不知道现在的SQL怎么写,而是求高效率的写法。而现在觉得不高效率的是里面有一段表名动态查询的部分,对于维护不高效率。

情景就类似于这样吧 http://zhidao.baidu.com/question……

看了那情景,你的表是动态的,没办法,只能动态拼了,要不然你想要达到怎么个高效,方便维护?

#20


引用 18 楼 qq53090120 的回复:
SQL code12345678begin     str_sql:=create table ||table_name||(||field1|| ||datatype1||,||field2|| ||datatype2||);    execute immediate str_sql;   --动态执行DDL语句    exception         when ot……
您这语句没有多大意义吧,在查询的时候也是要动态拼接,为啥还要动态创建表呢

#21


引用 19 楼 ssqtjffcu1 的回复:
引用 16 楼 p2227 的回复:引用 14 楼 ssqtjffcu1 的回复:楼主能否把你的问题再详细描述一篇,最好有例子,想要的结果。现在我还不是很明白楼主你要解决的问题是什么呃,是这样子,我不是不知道现在的SQL怎么写,而是求高效率的写法。而现在觉得不高效率的是里面有一段表名动态查询的部分,对于维护不高效率。

情景就类似于这样吧 http://zhidao.……
就是不知道所以问……我是求思路的

#22


引用 21 楼 p2227 的回复:
引用 19 楼 ssqtjffcu1 的回复:引用 16 楼 p2227 的回复:引用 14 楼 ssqtjffcu1 的回复:楼主能否把你的问题再详细描述一篇,最好有例子,想要的结果。现在我还不是很明白楼主你要解决的问题是什么呃,是这样子,我不是不知道现在的SQL怎么写,而是求高效率的写法。而现在觉得不高效率的是里面有一段表名动态查询的部分,对于维护不高效率。

情……


思路已经告诉你了,你不听,咋办?

#23


引用 22 楼 BenChiM888 的回复:
引用 21 楼 p2227 的回复:引用 19 楼 ssqtjffcu1 的回复:引用 16 楼 p2227 的回复:引用 14 楼 ssqtjffcu1 的回复:楼主能否把你的问题再详细描述一篇,最好有例子,想要的结果。现在我还不是很明白楼主你要解决的问题是什么呃,是这样子,我不是不知道现在的SQL怎么写,而是求高效率的写法。而现在觉得不高效率的是里面有一段表名动态查询……
没有不听啊,在综合考虑中

#24


引用 23 楼 p2227 的回复:
引用 22 楼 BenChiM888 的回复:引用 21 楼 p2227 的回复:引用 19 楼 ssqtjffcu1 的回复:引用 16 楼 p2227 的回复:引用 14 楼 ssqtjffcu1 的回复:楼主能否把你的问题再详细描述一篇,最好有例子,想要的结果。现在我还不是很明白楼主你要解决的问题是什么呃,是这样子,我不是不知道现在的SQL怎么写,而是求高效率的写法……


呵呵,那祝好运。
oracle sql动态执行问题(动态表名)

#25


http://www.16kan.com/post/216040.html

#26


连功能都完成不了谈效率,谈笑话吧。

#27


该回复于2012-12-29 11:14:29被管理员删除