oracle中动态向游标添加where子句
我有 plsql 过程,它接受某些参数,例如 v_name、v_country、v_type。
我希望有一个带有这样的 select 语句的游标:
select column from table1 t1, table2 t2
where t1.name = v_name
and t1.country = v_country
and t1.id = t2.id
and t2.type = v_type
如果某些参数为空,我只能将相关的 where 子句添加到游标吗? 或者有更好的方法来实现这一点吗?
I have plsql procedure which accepts certain parameters e.g. v_name, v_country, v_type.
I wish to have a cursor with a select statement like this:
select column from table1 t1, table2 t2
where t1.name = v_name
and t1.country = v_country
and t1.id = t2.id
and t2.type = v_type
If certain parameters are empty can I only add the relevant where clauses to the cursor? Or is there a better way to accomplish this?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
使用它的最佳方法是使用 DBMS_SQL。
您创建一个代表 SQL 语句的字符串。 您仍然使用绑定变量。 这是痛苦的。
它是这样的(我还没有编译这个,但它应该接近):-
与仅仅编写内联 SQL 相比,这种方法是如此痛苦,除非你有大量的列,否则有时编写几个不同的版本会更容易使用这个语法:
The best way to use this is with DBMS_SQL.
You create a string that represents your SQL statement. You still use bind variables. It's painful.
It goes something like this (I haven't compiled this, but it should be close) :-
This approach is so painful compared to just writing the SQL inline that unless you have heaps of columns sometimes it's just easier writing a couple of different versions using this syntax:
这不是您直接要求的,但它可能是一个可以接受的解决方案:
It's not directly what you're asking, but it may be an acceptable solution:
一种方法是将查询构建为字符串,然后使用 立即执行
One way would be to build up your query as a string then use execute immediate
实现此目的的最佳方法是使用 Oracle 的应用程序上下文功能,该功能的最佳定义是最佳性能和安全性。
更快的方法是 hamishmcn 建议的,使用 EXECUTE IMMEDIATE。 我会每次选择它,而不是 WW 建议的 DBMS_SQL。
另一种编写速度最快但性能不佳的方法如下:
The best way to do this would be to use Oracle's Application Context feature, best defined as best performance and security.
The faster way would be what hamishmcn suggested, using EXECUTE IMMEDIATE. I'd choose that over WW's suggestion of DBMS_SQL every time.
Another way that's quickest to write but won't perform as well would be something like this:
您不必使用 dbms_sql 来解决此问题
并且您仍然可以通过使用引用光标来使用普通光标。
示例:
您可以通过使用命令“using”绑定变量来做得更好,如下所示:
You do not have to use dbms_sql to solve this problem
and you can still use normal cursor by using a ref cursor.
Sample:
You can make this better by binding the variables with the command 'using' like this: