Oracle中的存储过程,包含来自不同查询的三个OUT参数

时间:2018-03-17 21:01:44

标签: oracle select stored-procedures subquery

我在使用一个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;

2 个答案:

答案 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;