2014-12-05 39 views
2
PROCEDURE drawComponent (title IN VARCHAR2) IS 
BEGIN 
    htp.p('<tr>'); 
    htp.p('<td class="row-hdr"><strong>' || title || '</strong></td>'); 
    for rec in (SELECT CELLS.ID as CELLID, CELLS.NUM as CELLNUM, CELLS.A_ID as ID, TBL.REMOVED as REMOVED FROM CELLS LEFT OUTER JOIN TBL ON CELLS.A_ID = TBL.ID ORDER BY CELLS.NUM) 
... 

我需要添加CELLSA_IDTBL如PARAMS上述過程。我不確定類型和語法。如何將查詢參數傳遞給過程?

澄清:

程序將被調用多次,不同的表,不同的列。身體是一樣的,只有我提到的那些參數是不同的。

+0

你是什麼意思「將'cells','a_id','tbl'添加爲params?請使用您的問題下的[編輯](https://stackoverflow.com/posts/27314371/edit)鏈接進一步闡述此問題。 – nop77svk 2014-12-05 11:12:39

+0

重複使用相同的代碼進行多個呼叫。我已經更新了我的問題。 – Pablo 2014-12-05 11:15:23

+0

如果您需要在執行時決定表名和連接條件,您將需要使用動態SQL 您可以'DBMS_SQL'或'EXECUTE_IMMEDIATE'以及那個類型 – vishad 2014-12-05 11:16:21

回答

1

您可以(ab)使用DYNAMIC SQL將表名稱作爲parameter傳遞給procedure

SQL> CREATE OR REPLACE 
    2 PROCEDURE p(
    3  table_name IN VARCHAR2) 
    4 AS 
    5 TYPE ref_typ 
    6 IS 
    7 REF 
    8 CURSOR; 
    9  var_ref ref_typ; 
10  emp_no NUMBER ; 
11 BEGIN 
12  OPEN var_ref FOR 'SELECT EMPNO FROM '||table_name; 
13  LOOP 
14  FETCH var_ref INTO emp_no ; 
15  EXIT 
16 WHEN var_ref%NOTFOUND; 
17  DBMS_OUTPUT.PUT_LINE('empno --> '||emp_no); 
18 END LOOP; 
19 CLOSE var_ref; 
20 END; 
21/

Procedure created. 

讓我們執行程序並查看。

SQL> set serveroutput on 
SQL> BEGIN 
    2  p('emp'); 
    3 END; 
    4/
empno --> 7369 
empno --> 7499 
empno --> 7521 
empno --> 7566 
empno --> 7654 
empno --> 7698 
empno --> 7782 
empno --> 7788 
empno --> 7839 
empno --> 7844 
empno --> 7876 
empno --> 7900 
empno --> 7902 
empno --> 7934 

PL/SQL procedure successfully completed. 

SQL> 
+0

如何修改上面的內容,以查詢「 SELECT * FROM'|| table_name',然後使用點訪問每列,例如'rec.EMPNO'?什麼類型的變量rec應該是獲取'INTO'? – Pablo 2014-12-05 13:05:25

+0

或至少如何使用上述方法查詢和獲取多列? – Pablo 2014-12-05 13:35:42

+0

您需要使用'COLLECTION'類型。搜索'%ROWTYPE'。 – 2014-12-05 13:39:15