我在Oracle中有一个存储过程,它返回一个select语句游标引用。我希望能够传递列名和排序方向(例如:'CompanyName DESC')并能够对结果进行排序,或者传递过滤器,例如'CompanyID> 400'并且能够将其应用于select语句。完成此任务的最佳方法是什么?这个表位于一个旧的数据库中,有90列,我不想为每种可能的组合做逻辑。
答案 0 :(得分:2)
我认为你想要一个带有OPEN-FOR
和USING
的光标。
CREATE OR REPLACE FUNCTION sort_table (
p_sort VARCHAR2
)
IS
TYPE cursor_type IS REF_CURSOR;
cur_out cursor_type;
lv_cursor_txt VARCHAR2(300);
BEGIN
lv_cursor_txt = 'SELECT * FROM table :sort';
OPEN cur_out FOR lv_cursor_txt USING p_sort;
-- Opening the cursor isn't probably what you want, but I'm not sure how to associate the variables except on open
RETURN cur_out;
END;
这不是一个很好的例子,但我希望它有所帮助。
Oracle在Dynamic SQL页面中讨论了这个问题。 DBMS_SQL包也可以提供帮助。
答案 1 :(得分:1)
请参阅此处:http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1288401763279和http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:6711305251199
我特别喜欢这种方法:http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1288401763279#4988761718663
答案 2 :(得分:1)
http://forums.oracle.com/forums/thread.jspa?threadID=2177728&tstart=0
CASE WHEN:P4_SORT_ORDER = 1那么 ROW_NUMBER()OVER(按上标(ENAME)排序)
或解码(:Sort_var,1,ROW_NUMBER()OVER(ORDER BY UPPER(ENAME)),2,ROW_NUMBER()OVER(ORDER BY UPPER(地址)))
答案 3 :(得分:0)
正如您可能已经想到的那样,R. Bemrose的答案是使用动态SQL实现起来更简单。出于这个原因,它可能是最常使用的。如果你这样做,一定要按照他/她做的方式,使用绑定变量(例如USING p_sort),而不是将字符串连接到lv_cursor_txt。此方法比连接提供更好的性能和安全性。
第二种方法使用的应用程序上下文,我没有看到太多,但我怀疑如果你经常调用查询会提供更好的查询性能。
祝你好运。