我正在开发一个在Oracle数据库中执行批量插入的应用程序(~ 12 k,但可能不止于此)。下面是SQL脚本:
DECLARE
errstr VARCHAR2(4000) := '';
errors NUMBER;
i NUMBER;
er NUMBER;
bk1 acct_common.type_tabnumber;
bk2 acct_common.type_tabdate;
bk3 acct_common.type_tabnumber;
bk49 acct_common.type_tabnumber;
BEGIN
bk1 := :1;
bk2 := :2;
bk3 := :3;
bk49 := :49;
FORALL i IN 1..11655
INSERT INTO table_name (
col1,
col2,
col3,
col49
) VALUES (
bk1(i),
bk2(i),
bk3(i),
bk49(i)
);
END;
插入失败,出现以下错误:
oci error 6531 (ORA-06531: Reference to uninitialized collection ORA-06512: at line 126 ORA-22160: element at index [1] does not exist ORA-06512: at line 106 )
由于有数千条记录,我无法找出哪个记录存在数据问题。(* 此查询是使用PHP动态生成的,并使用Oracle OCI 8执行 *)
有人可以请帮助我如何调试/打印失败的脚本的具体记录数据?真的很感激你的帮助.谢谢!
2条答案
按热度按时间wfsdck301#
如异常所述,您尚未初始化集合。
假设
:1
,:2
,:3
和:49
是绑定变量,并且你正在绑定一个包中定义的PL/SQL关联数组。基于oci_bind_array_by_name
documentation,你可以使用这样的东西(未经测试,因为我没有PHP环境):ni65a41a2#
集合的初始化方式如下例所示:
上一个例子将用一些元素初始化集合。或者它可以是这样的:
你不能像你希望的那样把一个集合作为一个简单的绑定变量传递。那是从Oracle端传递的。至于向Oracle发送数据的客户端应用程序,我不知道你如何在那里批量绑定一个集合。