sql - 将值插入记录类型表
问题描述
我正在创建一个过程,我想将多个值存储到记录类型的表中,我试图通过光标插入值,但我得到了这个错误:
错误(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;
解决方案
你有一个问题
FOR n in tmp_cursor LOOP
n := n+1;
您为循环标识符和局部变量使用了相同的名称,但是当它在循环范围内使用时,n 代表 tmp_cursor。so
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
此外,还有一些其他似乎不必要的问题,请参阅以下最终代码中的注释
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;
干杯!!
推荐阅读
- python - 为什么 dict 类型的变量内容不能腌制?
- javascript - 魔方JS | 计算2个日期之间的差异
- javascript - 尝试使用 axios 访问 Wikipedia Api 但出现 CORS 策略错误
- swift - 快速舍入值导致分段错误
- javascript - 有没有办法让一个元素依赖于另一个元素?
- javascript - 如何更改 Google 表格中的图表位置?
- excel - vlookup多个值excel
- elasticsearch - elasticsearch nest 7.1 聚合字段通用速记字段表达式
- javascript - HTML输入框,如何防止按键时重复按键
- ruby-on-rails - 我如何在 URL 中间编写一个带有 RESTful 参数的 Rails 路由?