执行具有多个值的存储过程

时间:2014-04-29 20:49:59

标签: oracle plsql

我有以下存储过程,如何使用 多个状态代码执行此操作???

PROCEDURE process_orders (p_statuses VARCHAR2)
AS
  CURSOR v_c
  IS
     SELECT *
       FROM orders a
      WHERE status_code IN (p_statuses);
BEGIN
  DBMS_OUTPUT.put_line ('Start');
  FOR v_rec IN v_c
  LOOP
     DBMS_OUTPUT.put_line (v_rec.order_id);
  END LOOP;

  DBMS_OUTPUT.put_line ('End');
EXCEPTION
  WHEN OTHERS
  THEN
     DBMS_OUTPUT.put_line (SQLCODE || '-' || SQLERRM);
END process_orders ;

如何传递多个状态代码,例如' OPEN'' INPROCESS'' PENDING'

EXEC process_orders('OPEN');

存储过程应该执行如下的查询:

SELECT *
           FROM orders a
          WHERE status_code IN ('OPEN','INPROCESS','PENDING');

1 个答案:

答案 0 :(得分:2)

最简单的方法是声明并传递集合

CREATE TYPE status_tbl
    IS TABLE OF VARCHAR2(50);

CREATE OR REPLACE PROCEDURE process_orders (p_statuses status_tbl)
AS
  CURSOR v_c
  IS
     SELECT *
       FROM order a
      WHERE status_code IN (SELECT column_value
                              FROM TABLE(p_statuses));
BEGIN
  DBMS_OUTPUT.put_line ('Start');
  FOR v_rec IN v_c
  LOOP
     DBMS_OUTPUT.put_line (v_rec.order_id);
  END LOOP;

  DBMS_OUTPUT.put_line ('End');
END;

您可以通过传递状态值集合来调用该过程

BEGIN
  process_orders( status_tbl( 'OPEN', 'INPROCESS', 'PENDING' ));
END;

请注意,捕获所有异常(WHEN OTHERS)的异常处理程序无法重新抛出它们(使用RAISE)并且应该完全避免将错误消息写入dbms_output成本。在最佳情况下,您只会丢失错误消息的实际行号。但实际上,您丢失了错误的行号,丢失了错误堆栈的堆栈跟踪,您无法通知调用方存在错误,因此调用方继续处于无效状态的数据,并且您经常完全丢失错误,因为调用者可能没有启用dbms_output缓冲区,可能没有足够大的大小,并且在调用完成后可能无法读取缓冲区。