2014-12-05 63 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