Oracle PL/SQL记录。我可以输入几个值吗?

Oracle PL/SQL记录。我可以输入几个值吗?,oracle,plsql,record,Oracle,Plsql,Record,我在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_grou

我在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;

为了解决眼前的问题,您将收到一个未找到数据错误,因为您开始在
prod\u id
10处循环,并依次上升到表中存在的最大
prod\u id
。如果您的ID中有任何间隙,则会出现错误。您可以通过以下错误处理来解决此问题:

声明
mr类型为记录
(
产品Id测试产品。产品Id%类型,
组ID testProducts。组ID%类型,
产品名称testProducts。产品名称%TYPE
);
奥布先生;
maxd数;
开始
从testProducts中将MAX(prod_Id)选择到maxd中;
因为我在10。。NVL(最大,1)
环
开始
选择产品标识、组标识、产品名称
进入obj_先生
来自testProducts
其中prod_Id=i;
DBMS|u OUTPUT.put|u line(obj|u mr.prod|id| |'|'|'| obj|u mr.GROUP|u id|'|'| obj|u mr.prod| u name);
例外情况
当找不到数据时
然后
DBMS_OUTPUT.put_line('prod_id不存在:'|| i);
结束;
端环;
结束;
/
要回答您关于多行的问题,记录类型不能有多行,但表类型可以有多行。如果定义了记录类型的表类型,则可以在该表类型中选择多行。请参阅下面的代码以了解如何执行此操作的示例

声明
mr类型为记录
(
产品Id测试产品。产品Id%类型,
组ID testProducts。组ID%类型,
产品名称testProducts。产品名称%TYPE
);
mr类型是mr的表格;
obj_mr_t mr_t;
开始
选择产品标识、组标识、产品名称
批量收集到obj_先生
来自testProducts
按产品id排序的订单;
因为我在1。。obj_先生t.伯爵
环
DBMS_OUTPUT.put_行(
obj|u mr|t(i).prod|u id|'|'|'| obj|u mr|t(i).GROUP|u id|'|'|'| obj|u mr t(i).prod|u name);
端环;
结束;
/

为了解决眼前的问题,您将收到一个未找到数据的错误,因为您开始在
prod\u id
10处循环,并依次上升到表中存在的最大
prod\u id
。如果您的ID中有任何间隙,则会出现错误。您可以通过以下错误处理来解决此问题:

声明
mr类型为记录
(
产品Id测试产品。产品Id%类型,
组ID testProducts。组ID%类型,
产品名称testProducts。产品名称%TYPE
);
奥布先生;
maxd数;
开始
从testProducts中将MAX(prod_Id)选择到maxd中;
因为我在10。。NVL(最大,1)
环
开始
选择产品标识、组标识、产品名称
进入obj_先生
来自testProducts
其中prod_Id=i;
DBMS|u OUTPUT.put|u line(obj|u mr.prod|id| |'|'|'| obj|u mr.GROUP|u id|'|'| obj|u mr.prod| u name);
例外情况
当找不到数据时
然后
DBMS_OUTPUT.put_line('prod_id不存在:'|| i);
结束;
端环;
结束;
/
要回答您关于多行的问题,记录类型不能有多行,但表类型可以有多行。如果定义了记录类型的表类型,则可以在该表类型中选择多行。请参阅下面的代码以了解如何执行此操作的示例

声明
mr类型为记录
(
产品Id测试产品。产品Id%类型,
组ID testProducts。组ID%类型,
产品名称testProducts。产品名称%TYPE
);
mr类型是mr的表格;
obj_mr_t mr_t;
开始
选择产品标识、组标识、产品名称
批量收集到obj_先生
来自testProducts
按产品id排序的订单;
因为我在1。。obj_先生t.伯爵
环
DBMS_OUTPUT.put_行(
obj|u mr|t(i).prod|u id|'|'|'| obj|u mr|t(i).GROUP|u id|'|'|'| obj|u mr t(i).prod|u name);
端环;
结束;
/

是否确定for循环以10而不是1开始?将一些数据放入表
testProducts
或处理异常(应处理)是否确定for循环以10而不是1开始?将一些数据放入表
testProducts
或处理异常(应处理)