Oracle存储过程如果不存在则返回

时间:2015-04-10 14:06:33

标签: oracle if-statement procedure not-exists

我一直是MS SQL的严格使用者,但我们的任务是编写一个Oracle存储过程,比较2个表以查找缺失的数据。如果订单丢失,我需要写一些会返回1的东西。到目前为止,我有以下几点,但它甚至没有接近工作。我搜索网络的结果很少。任何帮助将不胜感激。

CREATE OR REPLACE PROCEDURE SP_PO_CHECK


AS

BEGIN

IF NOT EXISTS ( SELECT PO FROM ORDERS, PO_LIST, WHERE Order_PO = PO; ) THEN RETURN 0; ELSE RETURN 1

END;

4 个答案:

答案 0 :(得分:1)

尝试这样的事情:

RETURN CASE WHEN (SELECT COUNT(*) FROM ORDERS, PO_LIST, WHERE Order_PO = PO; ) <> (SELECT COUNT(*) FROM ORDERS) THEN 0 ELSE 1 END

答案 1 :(得分:1)

首先,它需要是功能而不是程序。

然后你需要定义如何在两个表中检查存在。您可以使用主表左连接到详细信息表并检查它是否为某些必需列返回NOT NULL(我使用rowid因为它始终不为null)。 或者您可以使用NOT EXISTS子句。

然后你需要使用INTO子句将结果返回到PL_SQL变量 最后返回变量作为函数的结果。

CREATE OR REPLACE FUNCTION SP_PO_CHECK
RETURN NUMBER
AS
 l_total_cnt number; 
 l_match_cnt number;
BEGIN
  select count(*), -- total count of record only in po_list. I assume that this is your drive table. If not you can switch tables or use full outer join
         count(orders.rowid) -- count of records exist in both tables
    into l_total_cnt, l_match_cnt
    from po_list
    left join orders
      on Order_PO = PO;

  if l_total_cnt =  l_match_cnt then 
    return 1;
  else 
    return 0; 
  end if;

END SP_PO_CHECK;

答案 2 :(得分:1)

识别这种情况的正确查询是:

select count(*)
from   po_list p
where  not exists (
         select 1
         from   orders o
         where  o.order_po = p.po)
  and  rownum = 1;

一旦找到问题po,这将立即停止查询,并返回0或1。

所以选择它到一个变量并返回1 - 它的值:

create or replace function missing_order
as
  missing_po_found integer;
begin
  select count(*)
  into   missing_po_found
  from   po_list p
  where  not exists (
           select 1
           from   orders o
           where  o.order_po = p.po)
  and    round = 1;

  return 1 - missing_o_found;
end;

没有运行,所以不是100%确定没有拼写错误。

答案 3 :(得分:1)

您可以使用MINUS

CREATE PROCEDURE SP_PO_CHECK (
  hasSamePOs  OUT NUMBER
)
AS
  p_rowcount
BEGIN
  SELECT COUNT(1)
  INTO   p_rowcount
  FROM   (
           SELECT PO FROM PO_LIST
           MINUS
           SELECT PO FROM ORDERS
         );
  hasSamePOs := CASE WHEN p_rowcount > 0 THEN 0 ELSE 1 END;
END;
/

或者

CREATE PROCEDURE SP_PO_CHECK (
  hasSamePOs   OUT NUMBER
)
AS
BEGIN
  SELECT CASE WHEN EXISTS (
                SELECT PO FROM PO_LIST
                MINUS
                SELECT PO FROM ORDERS
              )
              THEN 0
              ELSE 1
              END
  INTO   hasSamePOs
  FROM   DUAL;
END;
/