解决方案 »
- 各位大哥,求一SQL语法,或者解决办法. (题目搞错了,重发一贴)
- 在线等。分组后取每一组条的第一条数据
- 求jsp+oralce分页sql语句
- SELECT CITYCODE into d_qsd FROM XCSDM where citytel=p_qsd;如果查不出记录赋给d_qsd 程序就会报错,怎么进行错误处理?
- 高分求解:如何在存储过程中建立一个临时表,然后把查询结果放到临时表中?
- 监听器问题总结——大讨论,以及我现在的问题,请积极参与!
- 触发器给我带来的灾难,快来帮忙,在线等
- 关于oracle job的问题,
- 如何取消角色密码。
- 修改sql语句
- 问一下大家怎么在论坛里提问的时候发图片了?
- 求助!Oracle 模糊查询大数据量太慢了,居然要20秒以上才出现!
1、这句话“满足以上2个条件的结果集被查询出来”,什么意思?哪2个条件?不是2个条件吧?
2、调用时传的参数null,'10045',null,'01-7月 -10',null,null,和表里的字段怎么对应?谁是谁?
3、你想返回什么内容?
--用不着存储过程
SELECT TOPICD,
COMMNAME,
TIMEBEGIN,
TIMEEND,
MARKMONEY,
ADDRESS
FROM( SELECT CASE WHEN TOPICD IS NULL THEN 1 ELSE 0 END C1,
CASE WHEN COMMNAME = '10045' THEN 1 ELSE 0 END C2,
CASE WHEN TIMEBEGIN IS NULL THEN 1 ELSE 0 END C3,
CASE WHEN TIMEEND = '01-7月 -10' THEN 1 ELSE 0 END C4,
CASE WHEN MARKMONEY IS NULL THEN 1 ELSE 0 END C5,
CASE WHEN ADDRESS IS NULL THEN 1 ELSE 0 END C6,
TOPICD,
COMMNAME,
TIMEBEGIN,
TIMEEND,
MARKMONEY,
ADDRESS
FROM TABLE_NAME)
WHERE C1+C2+C3+C4+C5+C6 = 2;
楼主:如果SQL好用的话,你还要用存储过程实现么?
可能写的乱了,是这个意思
下面那个表中的列和查询语句et_query(...)中的6个参数一一对应。“满足以上2个条件”是我假设我的查询方式是et_query('a','b',null,null,null,null),要查询的就是
select topic,commname from 表XX
where topic = 'a'
and commname = 'b'; 的意思抱歉描述的乱了
昨天想了一晚上也没弄懂
sql写出来了,存储过程还难么。 CREATE OR REPLACE PROCEDURE et_query(
参数1 IN 类型,
参数2 IN 类型,
参数3 IN 类型,
参数4 IN 类型,
参数5 IN 类型,
参数6 IN 类型,
参数7 OUT = SYS_REFCURSOR =
)AS
BEGIN
OPEN 参数7 FOR
SELECT TOPICD,
COMMNAME,
TIMEBEGIN,
TIMEEND,
MARKMONEY,
ADDRESS
FROM( SELECT CASE WHEN NVL(TOPICD,0) = NVL(参数1,0) THEN 1 ELSE 0 END C1,
CASE WHEN NVL(COMMNAME,0) = NVL(参数2,0) THEN 1 ELSE 0 END C2,
CASE WHEN NVL(TIMEBEGIN,0) = NVL(参数3,0) THEN 1 ELSE 0 END C3,
CASE WHEN NVL(TIMEEND,SYSDATE)= NVL(参数4,SYSDATE) THEN 1 ELSE 0 END C4,
CASE WHEN NVL(MARKMONEY,0) = NVL(参数5,0) THEN 1 ELSE 0 END C5,
CASE WHEN NVL(ADDRESS,0) = NVL(参数6,0) THEN 1 ELSE 0 END C6,
TOPICD,
COMMNAME,
TIMEBEGIN,
TIMEEND,
MARKMONEY,
ADDRESS
FROM TABLE_NAME)
WHERE C1+C2+C3+C4+C5+C6 = 2;
END;
例如:
1 我传入参数
begin
et_query('a','b','c','d','e','f');
end;
(这是符合6个参数的查询)2 就相当于select 列1,列2,列3...,列 6 from 表
where 列1 = 'a'
and 列2 = 'b'
...
and 列6 = 'f' ;
--更正个地方
--参数7 OUT = SYS_REFCURSOR = 不知道咋的多了俩等于号 去掉
参数7 OUT SYS_REFCURSOR--另外说一句 下面这个条件就是同时只满足俩条件, 改成 >=2 就是同时满足2个以上条件
--改成 =3 就是同时满足3个条件 其余的不用解释了吧。WHERE C1+C2+C3+C4+C5+C6 = 2;
明白了 谢谢! 拿回去慢慢研究
感谢BenChi 和 yixilan 的热心回复,不过我估计yixilan 现在还没弄懂我的意思,不过非常感谢 :)
--我只写了三个参数,你有几个就写个,与之对应的if判断加上就可以了
create or replace procedure sp_test
(
i_param1 in varchar2,
i_param2 in varchar2,
i_param3 in varchar2,
o_ret out sys_refcursor
) as
strsql varchar2(4000);
begin
strsql := 'select * from table where 1=1 ';
if i_param1 is not null then
strsql := strsql || ' and param1=''' || i_param1 || ''' ';;
end if;
if i_param2 is not null then
strsql := strsql || ' and param2=''' || i_param1 || ''' ';;
end if;
if i_param3 is not null then
strsql := strsql || ' and param3=''' || i_param1 || ''' ';;
end if;
open o_ret for strsql;
end;
不过我结贴了 不能给分了 - -|| SOR..