我在使用一个IN和三个OUT参数创建存储过程时遇到问题。基本上我有三个查询,我想放在存储过程中。
如何将OUT参数与每个查询联系起来?
CREATE OR REPLACE PROCEDURE 'SP_NAME'(
@phone_number IN VARCHAR2
REG OUT INTEGER
EMAIL OUT VARCHAR2
VALID OUT INTEGER )
AS
BEGIN
--I just need 1 or 0 to valid if exists on the table
SELECT COUNT (phone_number) FROM users
WHERE phone_number = @phone_number
-- this should bring me the email a different table
SELECT email FROM details_users
WHERE phone_number = @phone_number
-- and this bring if exists in oooother table
SELECT count(phone_number) FROM suscribers
WHERE phone_number = @phone_number
END;
答案 0 :(得分:1)
您修改后的业务逻辑包含三个表格。如果没有任何关于表内容相关的指示,最好将它们保存为单独的查询。
这是我的解决方案(具有有效的Oracle语法)。
CREATE OR REPLACE PROCEDURE SP_NAME (
p_phone_number IN VARCHAR2
, p_REG OUT INTEGER
, p_EMAIL OUT VARCHAR2
, p_VALID OUT INTEGER )
AS
l_usr_cnt pls_integer;
l_email details_users.email%type;
l_sub_cnt pls_integer;
BEGIN
SELECT COUNT (*) into l_usr_cnt
FROM users u
WHERE u.phone_number = p_phone_number;
begin
select du.email into l_email
from details_users du
where du.phone_number = p_phone_number;
exception
when others then
l_email := null;
end;
SELECT COUNT (*) into l_sub_cnt
FROM suscribers s -- probably a typo :-/
WHERE s.phone_number = p_phone_number;
if l_usr_cnt != 0 then
p_reg := 1; -- "true"
else
p_reg := 0; -- "false"
end if;
p_email := l_email;
if l_sub_cnt != 0 then
p_valid := 1;
else
p_valid := 0;
end if;
END;
请注意,允许直接从查询填充OUT参数,如下所示:
SELECT COUNT (*)
into p_reg
FROM users u
WHERE u.phone_number = p_phone_number;
但是,使用局部变量并仅在过程结束时分配OUT参数是一种良好的做法。这是为了确保将一致的状态传递给调用程序(特别是如果被调用的过程抛出异常)。
另外,我使用p_
为所有参数名称添加了前缀。这也是可选的,但是很好的做法。具有不同的命名空间总是更安全,但是当参数名称与表列名称匹配时(即phone_number
)尤其重要。
答案 1 :(得分:0)
您可以使用以下查询,然后将结果分配给每个输出参数。我注意到第一个和第三个查询是相同的。是复制/粘贴错误吗?或者你的意思是电话号码是否有效?
SELECT COUNT (phone_number) INTO REG FROM users
WHERE phone_number = @phone_number;
SELECT email INTO EMAIL FROM users
WHERE phone_number = @phone_number;
REG := VALID;