利用动态SQL解决排序问题
2004-12-04 16:34
567 查看
我们常遇到一个存储过程要做都种排序的情况。通常order by 的条件只有一个固定的,这是远远不够的。需要用一个变量来替换它,而Oracle有不能识别Order by后面的字符串。该怎么办呢?先看看我的一个糟糕方案:
IF myorderby='OBJECTID DESC' then --按名称排序
OPEN outcur FOR SELECT * FROM(
SELECT rownum rowno,t.* FROM (
SELECT OBJECTID , HITS,POSTTIME FROM CARTOON ORDER BY OBJECTID DESC) t
WHERE rownum<endRow) WHERE rowno>=startRow;
elsif myorderby='HITS DESC' then --按点击率排序
OPEN outcur FOR SELECT * FROM(
SELECT rownum rowno,t.* FROM (
SELECT OBJECTID , HITS,POSTTIME FROM CARTOON ORDER BY HITS DESC') t
WHERE rownum<endRow) WHERE rowno>=startRow;
else --按时间排序
OPEN outcur FOR SELECT * FROM(
SELECT rownum rowno,t.* FROM (
SELECT OBJECTID , HITS,POSTTIME FROM CARTOON ORDER BY HITS DESC') t
WHERE rownum<endRow) WHERE rowno>=startRow;
END IF;
这虽然是通常使用的两种排序方式得以功过,但显得繁杂而且不够通用。
这时我的同事的好办法:
---------------------------------------------------------------------------
IF (myorderby is not null) then
mysql:='SELECT * FROM( SELECT rownum rowno,t.* FROM (
SELECT OBJECTID , HITS,POSTTIME FROM CARTOON ORDER BY '|| myorderby ||
') t WHERE rownum<' || endRow || ') WHERE rowno>=' || startRow;
else
mysql:='SELECT * FROM( SELECT rownum rowno,t.* FROM (
SELECT OBJECTID , HITS,POSTTIME FROM CARTOON ORDER BY posttime DESC) t
WHERE rownum<' || endRow || ') WHERE rowno>=' || startRow;
END IF;
OPEN outcur FOR mysql;
怎么样,感觉不同凡响吧。希望你能有更好的办法。
IF myorderby='OBJECTID DESC' then --按名称排序
OPEN outcur FOR SELECT * FROM(
SELECT rownum rowno,t.* FROM (
SELECT OBJECTID , HITS,POSTTIME FROM CARTOON ORDER BY OBJECTID DESC) t
WHERE rownum<endRow) WHERE rowno>=startRow;
elsif myorderby='HITS DESC' then --按点击率排序
OPEN outcur FOR SELECT * FROM(
SELECT rownum rowno,t.* FROM (
SELECT OBJECTID , HITS,POSTTIME FROM CARTOON ORDER BY HITS DESC') t
WHERE rownum<endRow) WHERE rowno>=startRow;
else --按时间排序
OPEN outcur FOR SELECT * FROM(
SELECT rownum rowno,t.* FROM (
SELECT OBJECTID , HITS,POSTTIME FROM CARTOON ORDER BY HITS DESC') t
WHERE rownum<endRow) WHERE rowno>=startRow;
END IF;
这虽然是通常使用的两种排序方式得以功过,但显得繁杂而且不够通用。
这时我的同事的好办法:
---------------------------------------------------------------------------
IF (myorderby is not null) then
mysql:='SELECT * FROM( SELECT rownum rowno,t.* FROM (
SELECT OBJECTID , HITS,POSTTIME FROM CARTOON ORDER BY '|| myorderby ||
') t WHERE rownum<' || endRow || ') WHERE rowno>=' || startRow;
else
mysql:='SELECT * FROM( SELECT rownum rowno,t.* FROM (
SELECT OBJECTID , HITS,POSTTIME FROM CARTOON ORDER BY posttime DESC) t
WHERE rownum<' || endRow || ') WHERE rowno>=' || startRow;
END IF;
OPEN outcur FOR mysql;
怎么样,感觉不同凡响吧。希望你能有更好的办法。
相关文章推荐
- windows 2003 安装sql server2000 出错
- 数据库SQLServer 驱动程序版本造成的中文问题。
- SQLServer数据库 No ResultSet Set was produced
- 精华的微软文章".NET 数据访问架构指南",特别是数据库连接的测试.即监视链接池化(1)
- 在Oracle9i中如何自行编译BBED工具
- 01数据库、DBMS和SQL
- mm.mysql mysql的jdbc驱动程序 (MVC)
- [导入]在 SQL Server 中合理的使用 LEFT OUTER JOIN 进行开发!
- Oracle PL/SQL入门之慨述
- MySql中常用命令
- ORACLE数据库的统计数据及其生成方式
- 数据库查询结果的动态排序
- 将小写金额转换为中文大写的SQL函数
- 将小写金额转换为英文大写的SQL函数
- 一个将数据分页的存储过程
- 被SQL Server 2005郁闷了
- 在 SQL Server 中合理的使用 LEFT OUTER JOIN 进行开发!
- Using Clobs with Oracle and Hibernate
- [转载] 编写安全的 Transact-SQL
- 对比.NET PetShop和Duwamish来探讨Ado.NET的数据库编程模式