Oracle 存储过程如果不存在 Return
Oracle Stored Procedure If Not Exists Return
我一直是一个严格的 MS SQL 消费者,但我的任务是编写一个 Oracle 存储过程来比较 2 个表的缺失数据。如果订单丢失,我需要写一些 return 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;
尝试这样的事情:
RETURN CASE WHEN (SELECT COUNT(*) FROM ORDERS, PO_LIST, WHERE Order_PO = PO; ) <> (SELECT COUNT(*) FROM ORDERS) THEN 0 ELSE 1 END
首先它需要是函数而不是过程。
然后您需要定义如何在两个 table 中检查是否存在。您可以使用 master table left join to detail table 并检查它是否 returns NOT NULL 对于某些强制列(我使用 rowid 因为它始终不为 null)。
或者您可以使用 NOT EXISTS 子句。
然后您需要使用 INTO 子句将结果 return 转换为 PL_SQL 变量
最后 return 作为函数结果的变量。
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;
识别这种情况的正确查询是:
select count(*)
from po_list p
where not exists (
select 1
from orders o
where o.order_po = p.po)
and rownum = 1;
这样一发现问题po就停止查询,return枯0或1。
所以 select 将其转换为变量 return 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% 确定没有错字。
您可以使用 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;
/
我一直是一个严格的 MS SQL 消费者,但我的任务是编写一个 Oracle 存储过程来比较 2 个表的缺失数据。如果订单丢失,我需要写一些 return 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;
尝试这样的事情:
RETURN CASE WHEN (SELECT COUNT(*) FROM ORDERS, PO_LIST, WHERE Order_PO = PO; ) <> (SELECT COUNT(*) FROM ORDERS) THEN 0 ELSE 1 END
首先它需要是函数而不是过程。
然后您需要定义如何在两个 table 中检查是否存在。您可以使用 master table left join to detail table 并检查它是否 returns NOT NULL 对于某些强制列(我使用 rowid 因为它始终不为 null)。 或者您可以使用 NOT EXISTS 子句。
然后您需要使用 INTO 子句将结果 return 转换为 PL_SQL 变量 最后 return 作为函数结果的变量。
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;
识别这种情况的正确查询是:
select count(*)
from po_list p
where not exists (
select 1
from orders o
where o.order_po = p.po)
and rownum = 1;
这样一发现问题po就停止查询,return枯0或1。
所以 select 将其转换为变量 return 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% 确定没有错字。
您可以使用 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;
/