【问题标题】:Find id then assign 1 if id found from table PL sql create procedure如果从表 PL sql 创建过程中找到 id,则查找 id 然后分配 1
【发布时间】:2022-01-09 13:21:50
【问题描述】:

我希望创建一个在数据库中查找给定客户 ID 的过程。如果客户存在,它将找到的变量设置为 1。否则,将找到的变量设置为 0。但是,我的调用代码块没有提供结果。我错过了什么还是我的 SELECT 语句应该是别的东西?谢谢。

CREATE OR REPLACE PROCEDURE find_customer(CUST_ID IN NUMBER, found OUT NUMBER) AS
    CUSTID NUMBER := CUST_ID;
BEGIN
    SELECT CUSTOMER_ID INTO CUSTID
    FROM CUSTOMERS
    WHERE CUSTOMER_ID = CUST_ID;
    IF CUST_ID = NULL THEN
    found := 1;
    END IF;
EXCEPTION
WHEN no_data_found THEN
found := 0;
END;
/
DECLARE
    CUSTOMER_ID NUMBER := 1;
    found NUMBER;
BEGIN
    find_customer(1,found);
    DBMS_OUTPUT.PUT_LINE (found);
END;

【问题讨论】:

    标签: sql oracle plsql


    【解决方案1】:

    我认为除了下面的部分之外没有任何其他内容。在您给定的示例中,不可能从中获取空值,因为任何空 id 都可能意味着该项目不存在。这意味着它不会返回一行,这会触发您捕获的 NO_DATA_FOUND 异常。

    这是你写的:

    IF CUST_ID = NULL THEN
      found := 1;
    END IF;
    

    这可能是你的意思:

    IF CUST_ID IS NOT NULL THEN
      found := 1;
    END IF;
    

    【讨论】:

      【解决方案2】:

      我会重写它以便

      • 您将参数与局部变量与列名区分开来
      • 使用表别名
      • 修复发现某物时发生的情况(is not null,第 11 行)
      • 测试时,使用您声明的变量,而不是常量 (1)

      所以:

      SQL> CREATE OR REPLACE PROCEDURE find_customer (par_cust_id  IN     NUMBER,
        2                                             par_found       OUT NUMBER)
        3  AS
        4     l_custid  NUMBER;
        5  BEGIN
        6     SELECT c.customer_id
        7       INTO l_custid
        8       FROM customers c
        9      WHERE c.customer_id = par_cust_id;
       10
       11     IF l_custid IS NOT NULL
       12     THEN
       13        par_found := 1;
       14     END IF;
       15  EXCEPTION
       16     WHEN NO_DATA_FOUND
       17     THEN
       18        par_found := 0;
       19  END;
       20  /
      
      Procedure created.
      

      测试:

      SQL> SET SERVEROUTPUT ON
      SQL> SELECT * FROM customers;
      
      CUSTOMER_ID
      -----------
              100
      
      SQL> DECLARE
        2     l_customer_id  NUMBER := 1;
        3     l_found        NUMBER;
        4  BEGIN
        5     find_customer (l_customer_id, l_found);
        6     DBMS_OUTPUT.put_line (l_found);
        7  END;
        8  /
      0
      
      PL/SQL procedure successfully completed.
      
      SQL> DECLARE
        2     l_customer_id  NUMBER := 100;
        3     l_found        NUMBER;
        4  BEGIN
        5     find_customer (l_customer_id, l_found);
        6     DBMS_OUTPUT.put_line (l_found);
        7  END;
        8  /
      1
      
      PL/SQL procedure successfully completed.
      
      SQL>
      

      【讨论】:

        【解决方案3】:

        您可以将其简化为:

        CREATE OR REPLACE PROCEDURE find_customer(
          p_cust_id IN  CUSTOMERS.CUSTOMER_ID%TYPE,
          p_found   OUT NUMBER
        ) AS
        BEGIN
          SELECT 1
          INTO   p_found
          FROM   CUSTOMERS
          WHERE  CUSTOMER_ID = p_cust_id;
        EXCEPTION
          WHEN no_data_found THEN
            p_found := 0;
        END;
        /
        

        如果任一方为NULLCUSTOMER_ID = p_cust_id 行将不匹配,因此您无需进一步检查。

        然后你可以调用它:

        DECLARE
          v_found NUMBER;
        BEGIN
          find_customer(1,v_found);
          DBMS_OUTPUT.PUT_LINE (v_found);
        END;
        /
        

        db小提琴here

        【讨论】:

          猜你喜欢
          • 2021-05-24
          • 2021-09-24
          • 2019-09-03
          • 2017-01-14
          • 2019-12-15
          • 1970-01-01
          • 2015-04-02
          • 2014-06-20
          • 1970-01-01
          相关资源
          最近更新 更多