所以我需要从表中选择只能在运行时识别的记录。这就是我所要做的,但我有点卡住了。任何帮助,建议或指出如何更容易/正确地做到这一点将不胜感激。
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 :(得分: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;
答案 1 :(得分: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;
/