我有以下存储过程,如何使用 多个状态代码执行此操作???
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');
答案 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
缓冲区,可能没有足够大的大小,并且在调用完成后可能无法读取缓冲区。