Oracle存储过程动态查询问题

youyoubaihehua 2011-05-23 02:45:36
我在写程序的时候,大多时候都要用到多条件甚至上十个条件的查询,我一般都是用存储过程写成动态查询的形式

select * from student where student.I_id='||I_ID||'end ||
case when a>b then '' else name='||N_Name||' end ||
case when c>d then '' else sex='||S_Sex|| end
诸如上述查询形式,但很多人说不推荐使用动态查询。我实在想不出其他方式来解决多条件的查询,有高手指教一二吗?感激非常
...全文
390 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
youyoubaihehua 2011-05-25
  • 打赏
  • 举报
回复
问题我已经自己解决了,谢谢各位,给分结贴了
siegebaoniu 2011-05-25
  • 打赏
  • 举报
回复
帮顶,学习。对oracle存储过程很陌生。
tlzmm_2008 2011-05-24
  • 打赏
  • 举报
回复
你的写法不对呀。(:S_ShipNameChn is null or and ShipInfo.ShipNameChn like :S_ShipNameChn)
(:S_ShipNameEn is null or and ShipInfo.ShipNameEn like :S_ShipNameEn)
在这里,你把变量当成什么使用?列名?还是一个值?混淆了吧?
ICE-word 2011-05-24
  • 打赏
  • 举报
回复
帮顶,学习!!
youyoubaihehua 2011-05-24
  • 打赏
  • 举报
回复
继续求助
youyoubaihehua 2011-05-24
  • 打赏
  • 举报
回复
继续求助啊,高手进来指教啊
youyoubaihehua 2011-05-24
  • 打赏
  • 举报
回复
你说的此法应该可行,我在网上看到我所表述的另一种写法,感觉很简洁,就是不知道语法在哪出错了[Quote=引用 12 楼 vber1010 的回复:]
你在帖子里不是写了一种可以完成不同的查询条件吗?case when。。。
或者你多拼接几个字符串,如:
if .. then
open ref_cur for v_sql1 ...
elsif .. then
open ref_cur for v_sql2...
else
open ref_cur for v_sql3...
end if;
[/Quote]
vber1010 2011-05-24
  • 打赏
  • 举报
回复
你在帖子里不是写了一种可以完成不同的查询条件吗?case when。。。
或者你多拼接几个字符串,如:
if .. then
open ref_cur for v_sql1 ...
elsif .. then
open ref_cur for v_sql2...
else
open ref_cur for v_sql3...
end if;
youyoubaihehua 2011-05-24
  • 打赏
  • 举报
回复
因为where后面的条件是有选择的,不确定的条件表达式要怎么样写才是对的呢[Quote=引用 10 楼 vber1010 的回复:]
是我错了。

是不是你里面的and、or搞错了。
[/Quote]
vber1010 2011-05-24
  • 打赏
  • 举报
回复
是我错了。

是不是你里面的and、or搞错了。
youyoubaihehua 2011-05-24
  • 打赏
  • 举报
回复
改了,还是提示相同的错误,SQL语句没有正确结束[Quote=引用 7 楼 vber1010 的回复:]
using '%'|| S_ShipNameChn ||'%','%'|| S_ShipNameEn ||'%',I_InOutType,N_Nationality,S_ShipType;
换成
using '''%'|| S_ShipNameChn ||'%''','''%'|| S_ShipNameEn ||'%''',I_InOutType,N_Nationality,S_ShipTyp……
[/Quote]
youyoubaihehua 2011-05-24
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 tiamay 的回复:]
(:S_ShipNameEn is null or and ShipInfo.ShipNameEn like :S_ShipNameEn) 这里的Like好像有问题吧 你用Dbms_output.put_lint方法输出这个SQL 看是什么!
[/Quote]我也换了没用like的情况,直接等于的时候也是提示相同的错误
vber1010 2011-05-24
  • 打赏
  • 举报
回复
using '%'|| S_ShipNameChn ||'%','%'|| S_ShipNameEn ||'%',I_InOutType,N_Nationality,S_ShipType;
换成
using '''%'|| S_ShipNameChn ||'%''','''%'|| S_ShipNameEn ||'%''',I_InOutType,N_Nationality,S_ShipType;
tiamay 2011-05-24
  • 打赏
  • 举报
回复
(:S_ShipNameEn is null or and ShipInfo.ShipNameEn like :S_ShipNameEn) 这里的Like好像有问题吧 你用Dbms_output.put_lint方法输出这个SQL 看是什么!

youyoubaihehua 2011-05-24
  • 打赏
  • 举报
回复
帮忙啊,自己顶上去
youyoubaihehua 2011-05-24
  • 打赏
  • 举报
回复
我自己试了下用变量绑定的代码,但是老是提示我SQL代码没有正确结束。
PROCEDURE ShipBasicInfo_Get
(
S_ShipNameChn In ShipInfo.ShipNameChn %TYPE,
S_ShipNameEn In ShipInfo.ShipNameEn %TYPE,
I_InOutType In ShipInfo.INOUTTYPE %TYPE,
N_Nationality In ShipInfo.NATIONALITY %TYPE,
S_ShipType IN ShipInfo.SHIPTYPE %TYPE,
S_ShipInfo OUT T_ShipInfo
) is

S_SQL1 Varchar(4000);
begin
S_SQL1:='
Select * from ShipInfo Where 1=1
(:S_ShipNameChn is null or and ShipInfo.ShipNameChn like :S_ShipNameChn)
(:S_ShipNameEn is null or and ShipInfo.ShipNameEn like :S_ShipNameEn)
(:I_InOutType=''请选择'' or and ShipInfo.INOUTTYPE=:I_InOutType)
(:N_Nationality =''请选择'' or and ShipInfo.NATIONALITY=:N_Nationality)
(:S_ShipType=''请选择'' or and ShipInfo.SHIPTYPE=:S_ShipType) ';
Open S_ShipInfo For S_SQL1 using '%'|| S_ShipNameChn ||'%','%'|| S_ShipNameEn ||'%',I_InOutType,N_Nationality,S_ShipType;
end ShipBasicInfo_Get;
304的的哥 2011-05-23
  • 打赏
  • 举报
回复
使用绑定变量,快速高效!
tangren 2011-05-23
  • 打赏
  • 举报
回复
现在开发的管理系统一般都是OLTP系统,所以尽量要使用绑定变量的方式,
已减少SQL硬分析次数,提高性能。
SQL> set serveroutput on;

SQL> CREATE OR REPLACE PROCEDURE query_emp(i_empno VARCHAR2) IS
2 v_sql VARCHAR2(2000);
3 v_ename VARCHAR2(40);
4 BEGIN
5 v_sql := 'select ename from emp where empno=:empno';
6 EXECUTE IMMEDIATE v_sql
7 INTO v_ename
8 USING i_empno;
9 dbms_output.put_line(v_ename);
10 END;
11 /

Procedure created

SQL> exec query_emp('7369');

SMITH

PL/SQL procedure successfully completed

SQL>
gelyon 2011-05-23
  • 打赏
  • 举报
回复
不推荐并不代表喊你不用,很多时候动态拼接却是最基础的,你也可以采用变量替换的形式来做,都是一样的
execute immediate sql using p1,p2.....

17,382

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧