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;

更新 - 解決策を機能させることができなかったので、とにかくクエリのベースとなるテーブルが2つしかなかったため、COALESCEを使用することになりました。答えてくれたみんなありがとう。

4

2 に答える 2

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 に答える
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 に答える