1

所以我需要从只能在运行时识别的表中选择记录。这就是我所得到的,但我有点卡住了。任何帮助、建议或指出如何更容易/正确地做到这一点将不胜感激。

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,因为无论如何我只有两个表来作为查询的基础。感谢所有回答的人。

4

2 回答 2

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; 
于 2013-03-21T07:08:39.163 回答
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;
/
于 2013-03-21T12:55:04.890 回答