【问题标题】:How to pass query params to procedure?如何将查询参数传递给程序?
【发布时间】:2014-12-05 10:59:12
【问题描述】:
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 作为参数。我不确定类型和语法。

澄清:

过程将被多次调用,针对不同的表、不同的列。 body是一样的,只是我提到的那些参数不同。

【问题讨论】:

  • “添加cellsa_idtbl”作为参数是什么意思?请使用您问题下方的edit 链接进一步详细说明此问题。
  • 重复使用相同的代码进行多次调用。我已经更新了我的问题。
  • 如果您需要在执行时决定表名和连接条件,您将需要使用动态 SQL,您可以使用 DBMS_SQLEXECUTE_IMMEDIATE 以及相应的类型

标签: oracle plsql oracle-apex


【解决方案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>

【讨论】:

  • 我如何修改上面,查询'SELECT * FROM '||table_name,然后使用点访问每一列,例如rec.EMPNO?获取 INTO 的变量 rec 应该是什么类型?
  • 或者至少如何使用上述方法查询和获取多个列?
  • 你需要使用COLLECTION类型。搜索%ROWTYPE
  • 好的,刚刚创建了row CELLS%ROWTYPE,现在可以访问列。谢谢
  • 感谢您的反馈。如果答案对您有帮助,请标记为已回答。这将有助于其他寻找类似问题的人。
猜你喜欢
  • 2017-03-08
  • 2017-05-28
  • 2018-09-30
  • 2018-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-27
  • 2014-08-23
相关资源
最近更新 更多