Ваш тип table_varchar
не выполняет магический анализ строки, содержащей значения, разделенные запятыми, в отдельные подстроки.Вы все еще должны это сделать.
Вот хорошая маленькая функция, которая выполняет анализ для вас.Он использует встроенный тип системы DBMS_SQL.VARCHAR2A
вместо типа таблицы, но результат аналогичен:
FUNCTION EXTRACT_TOKENS(p_string IN VARCHAR2,
p_separators IN VARCHAR2)
RETURN DBMS_SQL.VARCHAR2A
IS
arrTokens DBMS_SQL.VARCHAR2A;
BEGIN
WITH sel_string AS
(SELECT p_string AS fullstring FROM DUAL)
SELECT SUBSTR(fullstring, beg + 1, end_p - beg - 1) AS token
BULK COLLECT INTO arrTokens
FROM (SELECT beg, LEAD(beg) OVER (ORDER BY beg) AS end_p, fullstring
FROM (SELECT beg, fullstring
FROM (SELECT LEVEL beg, fullstring
FROM sel_string
CONNECT BY LEVEL <= LENGTH(fullstring))
WHERE INSTR(p_separators, SUBSTR(fullstring, beg, 1)) > 0
UNION ALL
SELECT 0, fullstring FROM sel_string
UNION ALL
SELECT LENGTH(fullstring) + 1, fullstring FROM sel_string))
WHERE end_p IS NOT NULL AND
end_p > beg + 1;
RETURN arrTokens;
END EXTRACT_TOKENS;
Вы можете использовать это, изменив свою процедуру на:
CREATE OR REPLACE PROCEDURE SP_INSERTDOCUMENTDETAILS_BD
(
BatchId IN NUMBER,
strDocumentIds IN varchar2
)
IS
var_table_varchar DBMS_SQL.VARCHAR2A ;
begin
var_table_varchar := EXTRACT_TOKENS(strDocumentIds, ',');
for elem in 1 .. var_table_varchar.count loop
Insert into documentdetails
(DocumentID, BatchID, DocumentSRCGUID, Name, documentType, ExtractionStatus, InjectionStatus)
values
(DocumentID_SEQ.NEXTVAL, BatchId, var_table_varchar(elem), ',' , 1, 1);
end loop;
end SP_INSERTDOCUMENTDETAILS_BD;
Обратите внимание, что это все равно не будет работать, потому что список полей в вашем операторе INSERT
имеет семь названных полей, в то время как предложение VALUES
содержит только шесть значений, но я уверен, что вы можете это исправить.
Удачи.