将值插入记录类型表

Posted

技术标签:

【中文标题】将值插入记录类型表【英文标题】:Inserting values into table of records type 【发布时间】:2019-09-16 08:31:53 【问题描述】:

我正在创建一个过程,我想将多个值存储到记录类型的表中,我试图通过光标插入值,但我得到了这个错误:

错误(14,7):PL/SQL:语句被忽略

错误(14,12):PLS-00306:调用中的参数数量或类型错误 '+'

错误(15,7):PL/SQL:语句被忽略

错误(15,12):PLS-00382:表达式类型错误

错误中提到的行是这两行:

n := n+1;
          ulaz(n) := bank_id_rec(tmp_row.bank_id);

create or replace PROCEDURE BULK_STATUS_JOB
    IS
      CURSOR tmp_cursor
      IS
        SELECT bank_id FROM mdm_tbank_customer;
      n INTEGER :=0;
      ulaz bank_id_tab;
      izlaz bank_service_status_tab;
      rec itf_return_rec;
    BEGIN
      OPEN tmp_cursor;
      LOOP
        FOR n in tmp_cursor LOOP
          n := n+1;
          ulaz(n) := bank_id_rec(tmp_row.bank_id);
       END LOOP;
        EXIT
      WHEN tmp_cursor%notfound;
      END LOOP;  
        rec := mdm_tbank_itf_sb.get_tbank_service_status_bulk(ulaz, izlaz);
        FOR i IN izlaz.first..izlaz.last
        LOOP
          DBMS_OUTPUT.PUT_LINE(ulaz(i).bank_id);
          DBMS_OUTPUT.PUT_LINE(izlaz(i).bank_id || ': '||izlaz(i).service_status);
        END LOOP;
    EXCEPTION
    WHEN OTHERS THEN
      dbms_output.put_line(SQLERRM);
      IF tmp_cursor%ISOPEN THEN
        CLOSE tmp_cursor;
      END IF;
    END BULK_STATUS_JOB;

【问题讨论】:

这是否意味着您已经解决了 ORA-01722 in your other question? 【参考方案1】:

你有问题

FOR n in tmp_cursor LOOP
          n := n+1;

你已经为循环标识符和局部变量使用了相同的名称,但是当它在循环范围内使用时,n 代表 tmp_cursor。所以 n := n+1 代表tmp_cursor := tmp_cursor + 1; 无效。

所以请将标识符更改为其他名称(比如说 nn)并在整个循环中使用它,如下所示。

FOR nn in tmp_cursor LOOP -- nn represents loop identifier
              n := n+1; -- n represents your local variable declared by you

另外,还有一些其他问题似乎是不必要的,请参阅以下最终代码中的 cmets

create or replace PROCEDURE BULK_STATUS_JOB
    IS
      CURSOR tmp_cursor
      IS
        SELECT bank_id FROM mdm_tbank_customer;
      n INTEGER :=0;
      ulaz bank_id_tab;
      izlaz bank_service_status_tab;
      rec itf_return_rec;
    BEGIN
      --OPEN tmp_cursor; -- not needed
      --LOOP -- not needed
        FOR nn in tmp_cursor LOOP -- changed loop variable name to nn
          n := n+1;
          ulaz(n) := bank_id_rec(nn.bank_id); --- used nn.bank_id
       END LOOP;
        --EXIT -- not needed
      --WHEN tmp_cursor%notfound; -- not needed
      --END LOOP;  -- not needed
        rec := mdm_tbank_itf_sb.get_tbank_service_status_bulk(ulaz, izlaz);
        FOR i IN izlaz.first..izlaz.last
        LOOP
          DBMS_OUTPUT.PUT_LINE(ulaz(i).bank_id);
          DBMS_OUTPUT.PUT_LINE(izlaz(i).bank_id || ': '||izlaz(i).service_status);
        END LOOP;
    EXCEPTION
    WHEN OTHERS THEN
      dbms_output.put_line(SQLERRM);
      IF tmp_cursor%ISOPEN THEN
        CLOSE tmp_cursor;
      END IF;
    END BULK_STATUS_JOB;

干杯!!

【讨论】:

使用SELECT bank_id_rec(bank_id) BULK COLLECT INTO ulaz FROM ..应该更快。 如果这段代码接近生产,你不应该简单地在异常处理程序中显示错误消息。您应该将错误写入日志表和/或将其传播到未经处理的情况下,以使故障显而易见。还没有错误记录实用程序?查看记录器:github.com/OraOpenSource/Logger

以上是关于将值插入记录类型表的主要内容,如果未能解决你的问题,请参考以下文章

如何从表中选择记录并插入另一个表?

如何将值插入表中并使用一个按钮更新另一个表中的值?

EF - 对于已创建的实体:无法将值 NULL 插入“Id”列、“Languages”表;列不允许空值

将值插入行类型的 Pyspark 中的 Hive 表

将值从 Excel 工作表导出到 Access 记录

将记录插入查找表