【问题标题】:PL/SQL Records. Can i put in records few values?PL/SQL 记录。我可以输入几个值吗?
【发布时间】:2020-11-17 13:14:29
【问题描述】:

我正在使用 Apex Oracle PL/SQL 并试图了解记录的工作原理。 有一段代码。我不明白为什么我会收到异常“找不到数据”。 我可以在记录中放几行吗?

create table testProducts 
    (
        prod_id number not null,
         group_id number (5) not null,
        prod_name varchar2(50) not null,
        constraint fk_group_id foreign key (group_id)
        references testGroups(group_id)
    )



declare
    type mr is record (
        prod_Id testProducts.prod_Id%type
    );
    obj_mr mr;

    maxd number;

egin
    select max(prod_Id) into maxd from testProducts;
    for i in 10..maxd loop
        select testProducts.prod_id into obj_mr from testProducts where 
        testProducts.prod_Id = i;
        dbms_output.put_line(obj_mr.prod_id);
       
    end loop;
end;

【问题讨论】:

  • 你确定你的 for 循环从 10 开始而不是从 1 开始吗?
  • 把一些数据放到表testProducts 或者处理异常(应该处理)

标签: oracle plsql record


【解决方案1】:

为了解决您的直接问题,您会收到 no data found 错误,因为您从 prod_id 10 开始循环并按顺序上升到表中存在的最大 prod_id。如果您的 ID 中有任何空白,那么您将收到错误消息。您可以通过一些错误处理来解决它,如下所示:

DECLARE
    TYPE mr IS RECORD
    (
        prod_Id      testProducts.prod_Id%TYPE,
        GROUP_ID     testProducts.GROUP_ID%TYPE,
        prod_name    testProducts.prod_name%TYPE
    );
    
    obj_mr   mr;

    maxd     NUMBER;
BEGIN
    SELECT MAX (prod_Id) INTO maxd FROM testProducts;

    FOR i IN 10 .. NVL (maxd, 1)
    LOOP
        BEGIN
            SELECT prod_id, GROUP_ID, prod_name
              INTO obj_mr
              FROM testProducts
             WHERE prod_Id = i;

            DBMS_OUTPUT.put_line (obj_mr.prod_id || '|' || obj_mr.GROUP_ID || '|' || obj_mr.prod_name);
        EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
                DBMS_OUTPUT.put_line ('prod_id does not exist: ' || i);
        END;
    END LOOP;
END;
/

要回答您关于多行的问题,RECORD 类型不能有多行,但 TABLE 类型可以。如果您定义了 RECORD 类型的 TABLE 类型,则可以在该 TABLE 类型中选择多行。有关如何执行此操作的示例,请参见下面的代码。

DECLARE
    TYPE mr IS RECORD
    (
        prod_Id      testProducts.prod_Id%TYPE,
        GROUP_ID     testProducts.GROUP_ID%TYPE,
        prod_name    testProducts.prod_name%TYPE
    );

    TYPE mr_t IS TABLE OF mr;

    obj_mr_t   mr_t;
BEGIN
      SELECT prod_id, GROUP_ID, prod_name
        BULK COLLECT INTO obj_mr_t
        FROM testProducts
    ORDER BY prod_id;

    FOR i IN 1 .. obj_mr_t.COUNT
    LOOP
        DBMS_OUTPUT.put_line (
            obj_mr_t (i).prod_id || '|' || obj_mr_t (i).GROUP_ID || '|' || obj_mr_t (i).prod_name);
    END LOOP;
END;
/

【讨论】:

    猜你喜欢
    • 2017-04-22
    • 1970-01-01
    • 2014-01-03
    • 2012-01-23
    • 2019-11-30
    • 2011-02-26
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多