需要帮助为oracle制作动态查询

时间:2013-03-21 06:52:10

标签: sql oracle dynamic

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

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,因为我只有两个表来从我的查询中解决。感谢所有回答的人。

2 个答案:

答案 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;
/