【问题标题】:Display stored procedure in an anonymous block without getting too many rows error在匿名块中显示存储过程而不会出现太多行错误
【发布时间】:2021-03-02 00:26:28
【问题描述】:

我有一个创建的存储过程,它有一个输入参数和两个输出参数。

我想在匿名 PL/SQL 块中显示存储过程。

代码

CREATE OR REPLACE PROCEDURE task_one
    (coun_id IN countries.country_id%TYPE,
     coun_name OUT countries.country_name%TYPE,
     reg_name OUT regions.region_name%TYPE) IS
BEGIN
    
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            DBMS_OUTPUT.PUT_LINE('Error! No data found!');
END;

在这里你可以看到我的桌子

当我尝试在匿名块中执行该过程时,我收到一个错误,即行数过多。 为了阻止错误,我认为我可以使用 for 循环。但是,它也没有奏效。也许我尝试的方式根本不对。

这是尝试显示存储过程的匿名块

DECLARE
    c_name countries.country_name%TYPE;
    r_name regions.region_name%TYPE;
BEGIN
    FOR c IN (SELECT country_name, region_name INTO c_name, r_name FROM Countries, Regions) LOOP
    (task_one('CA', c_name, r_name)
    DBMS_OUTPUT.PUT_LINE(c.c_name || ' ' || c.r_name);
    END LOOP;
END;

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    您的程序代码不完整,或者您没有发布所有内容。

    程序可能如下所示:

    CREATE OR REPLACE PROCEDURE task_one
        (coun_id IN countries.country_id%TYPE,
         coun_name OUT countries.country_name%TYPE,
         reg_name OUT regions.region_name%TYPE) IS
    BEGIN
        SELECT country_name, region_name
          INTO coun_name, reg_name
          FROM countries
          JOIN regions ON Countries.region_id = Regions.region_id
         WHERE country_id = coun_id;
        
    EXCEPTION
       WHEN NO_DATA_FOUND THEN
          DBMS_OUTPUT.PUT_LINE('Error! No data found!');
       WHEN TOO_MANY_ROWS THEN
          DBMS_OUTPUT.PUT_LINE('Error! Too many rows!');
          coun_name := NULL;
          reg_name := NULL;
    END;
    /
    

    您必须通过 region_id 连接这两个表。

    如果您还想收到“Too many rows”错误,因为您可能会返回一个 Country_id 的多个条目(数据中的错误?),您可以像示例中那样进行操作。

    然后您可以在匿名块中使用该过程,如下所示:

    DECLARE
        c_name countries.country_name%TYPE;
        r_name regions.region_name%TYPE;
    BEGIN
       task_one('CA', c_name, r_name);
       DBMS_OUTPUT.PUT_LINE(c_name || ' ' || r_name);
    END;
    /
    

    【讨论】:

    • 谢谢先生的回复!
    猜你喜欢
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多