2013-03-21 49 views
1

所以我需要從表中選擇只能在運行時識別的記錄。這就是我所知道的,但我有點卡住了。任何幫助,建議或指出如何更容易/正確地做到這一點將不勝感激。需要幫助爲oracle做動態查詢

DECLARE 
TABLE_NAME VARCHAR2(255); 
QUERY_STR VARCHAR2(1000); 
BEGIN 
SELECT CASE WHEN UPPER(APP.MODULE_LONG_NAME) LIKE 'PLEDGE%' THEN 'PLEDGE_HDR' ELSE 'CONTACT_HDR' END 
INTO TABLE_NAME 
FROM REQST_HDR RH 
INNER JOIN LKUP_REQST_TYPE LRT ON LRT.REQST_TYPE_ID = RH.REQST_TYPE_ID 
INNER JOIN APP_MODULE_MSTR APP ON APP.MODULE_ID = LRT.MODULE_ID; 

QUERY_STR := 'SELECT * FROM ' || TABLE_NAME || '--MORE FILTERING'; 

--SOMEHOW SHOW RESULTS OF QUERY_STR IN TABLE FORM. 
END; 

更新 - ,因爲我無法得到任何的解決方案的工作,我最終只使用COALESCE看到,因爲我只有兩個表從反正關閉基地我的查詢。感謝所有回答的人。

+0

您需要這是一個程序格式? – TechDo 2013-03-21 06:56:50

+0

我估計你需要一個存儲過程。 – Rachcha 2013-03-21 06:57:49

+0

不一定..我可以很容易地注入到C#的東西將更加讚賞..如果一個存儲過程是唯一的方式,我可以得到它的工作,然後存儲過程它是。 – Jesse 2013-03-21 06:59:16

回答

0

嘗試是這樣的:

CREATE OR REPLACE FUNCTION choose_a_function_name RETURN SYS_REFCURSOR IS 
TABLE_NAME VARCHAR2(255); 
QUERY_STR VARCHAR2(1000); 
res sys_refcursor; 
BEGIN 
SELECT CASE WHEN UPPER(APP.MODULE_LONG_NAME) LIKE 'PLEDGE%' THEN 'PLEDGE_HDR' ELSE 'CONTACT_HDR' END 
INTO TABLE_NAME 
FROM REQST_HDR RH 
INNER JOIN LKUP_REQST_TYPE LRT ON LRT.REQST_TYPE_ID = RH.REQST_TYPE_ID 
INNER JOIN APP_MODULE_MSTR APP ON APP.MODULE_ID = LRT.MODULE_ID; 

QUERY_STR := 'SELECT * FROM ' || TABLE_NAME || '--MORE FILTERING'; 

OPEN res FOR QUERY_STR; 

RETURN res; 

END; 
0

複製/粘貼看到以表格形式下面的查詢結果:

DECLARE 
    emp_cur_rc  SYS_REFCURSOR; 
    emp_rec   scott.emp%ROWTYPE; 
    -- 
    v_sql   VARCHAR2(200); 
    v_tab_name  VARCHAR2(200):= 'scott.emp'; 
    v_field_name VARCHAR2(200):= 'job'; 
    v_list   VARCHAR2(200):= '''MANAGER'', ''CLERK'''; 
BEGIN 
    v_sql:= 'SELECT * FROM '|| v_tab_name ||' WHERE '||v_field_name ||' IN ('||v_list||')'; 

OPEN emp_cur_rc FOR v_sql; 
LOOP 
    FETCH emp_cur_rc INTO emp_rec; 
    EXIT WHEN emp_cur_rc%NOTFOUND; 
    dbms_output.put_line(emp_rec.empno||chr(9)||emp_rec.ename||chr(9)||emp_rec.job); 
END LOOP; 
CLOSE emp_cur_rc; 
END; 
/