问题描述
我创建了从fnd_lobs表读取csv文件并在特定目录中生成文本文件的过程。 它可以通过PL sql和表单正常工作,但是当由oracle并发程序调用时,它没有生成文件。.有什么解决办法
declare
Errbuf varchar2(150);
RETcode varchar2(150);
begin
XXTE_BSS_ERP_INT.EXTRACT_DATA_FNDLOBS(8279962,8619864,Errbuf,RETcode);
end;
Procedure EXTRACT_DATA_FNDLOBS(P_MO_NUMBER Number,P_LINE_ID Number,errbuf out VARCHAR2,retcode out VARCHAR2) is
CURSOR cur_new_attmt IS
SELECT fl.file_id,fl.file_name,fl.file_data,dbms_lob.getlength(fl.file_data) file_length
FROM FND_DOCUMENTS D,FND_ATTACHED_DOCUMENTS AD,Fnd_Lobs FL
WHERE D.DOCUMENT_ID = AD.DOCUMENT_ID
and fl.file_id = D.Media_Id
and ad.entity_name = 'TRANSACT MOVE ORDER'
and to_number(ad.pk1_value) = P_LINE_ID;
v_start NUMBER DEFAULT 1;
v_bytelen NUMBER DEFAULT 32000;
v_len_copy NUMBER;
v_raw_var RAW(32000);
v_output utl_file.file_type;
v_inv_file_name VARCHAR2(100);
V_FILE_NAME Varchar2(250);
v_position NUMBER;
V_CST_CHAR varchar2(32760);
V_CHECK_STEP Varchar2(200);
--v_first_rec BOOLEAN DEFAULT TRUE;
V_GENERATED_FILE UTL_FILE.FILE_TYPE;
v_row varchar2(1000);
v1 varchar2(1000);
V_MOVE_ORDER_NUM Varchar2(20);
V_LINE_NUM number;
Att_line_num number;
att_SER_NUM varchar2(30);
att_INV_ITEM_ID number;
V_INV_ITEM_ID Number;
--V_FM_SERIAL_NUM Varchar2(30);
V_ITEM_CODE Varchar2(30);
V_FM_SERIAL_NUM Mtl_Serial_Numbers.Serial_Number%TYPE;
V_LEN Number;
V_COUNT number := 1;
V_TRX_TEMP_ID number;
V_LINE_TRX_ID Number;
--------------check file--------------------
V_EXIST BOOLEAN;
V_BLK_SIZE BINARY_INTEGER;
BEGIN
V_CHECK_STEP := 'Extract Data from attached file';
v_position := 10;
FOR rec_inv IN cur_new_attmt LOOP
BEGIN
v_inv_file_name := NULL;
v_inv_file_name := rec_inv.file_name;
v_position := 20;
-- define output directory AND OPEN THE file IN WRITE BYTE MODE,V_FILE_NAME := 'CRM_CPE_TRANS_' || '-' || rec_inv.file_id || '.txt';
v_output := utl_file.fopen('USER_DIR',V_FILE_NAME,'W' /*'wb'*/,32760);
v_position := 30;
-- maximum size OF buffer parameter IS 32767 BEFORE
-- which you have TO flush your buffer
IF rec_inv.file_length < 32760 THEN
utl_file.put_raw(v_output,rec_inv.file_data);
--V_CST_CHAR := utl_raw.cast_to_varchar2(dbms_lob.substr(rec_inv.file_data));
--utl_file.put_line(v_output,V_CST_CHAR);
utl_file.fflush(v_output);
ELSE
v_position := 40;
v_start := 1;
v_bytelen := 32000;
v_len_copy := rec_inv.file_length;
dbms_output.put_line(v_len_copy);
WHILE v_start < rec_inv.file_length AND v_bytelen > 0 LOOP
dbms_lob.READ(rec_inv.file_data,v_bytelen,v_start,v_raw_var);
utl_file.put_raw(v_output,v_raw_var);
utl_file.fflush(v_output);
v_start := v_start + v_bytelen;
v_len_copy := v_len_copy - v_bytelen;
IF v_len_copy < 32000 THEN
v_bytelen := v_len_copy;
END IF;
END LOOP;
v_position := 80;
utl_file.fclose(v_output);
END IF;
v_position := 90;
dbms_output.put_line(' File_name:' || V_FILE_NAME);
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(rpad(NVL(v_inv_file_name,'NA'),31) ||
rpad('ERROR',21) || 'POSITION: ' ||
v_position || 'Error :' ||
SUBSTR(sqlERRM,1,1000));
END;
END LOOP;
dbms_output.put_line('==========Insert File Data Into TABLE==========');
begin
V_GENERATED_FILE := UTL_FILE.FOPEN('USER_DIR','R');
IF UTL_FILE.IS_OPEN(V_GENERATED_FILE) THEN
LOOP
BEGIN
V_CHECK_STEP := 'Open the generated file from FND_LOBS and read data';
UTL_FILE.GET_LINE(V_GENERATED_FILE,v_row);
V_LEN := LENGTH(v_row);
v1 := substr(v_row,V_LEN);
v1 := REPLACE(REPLACE(v_row,CHR(13),','),CHR(10),');
V_CHECK_STEP := 'Mapping the attached data to Serials table';
if V_COUNT = 1 then
-- rmv hdr
null;
V_COUNT := V_COUNT + 1;
else
V_MOVE_ORDER_NUM := REGEXP_SUBSTR(v1,'[^,]+',1);
V_LINE_NUM := REGEXP_SUBSTR(v1,2);
V_ITEM_CODE := REGEXP_SUBSTR(v1,3);
V_FM_SERIAL_NUM := REGEXP_SUBSTR(v1,4);
begin
select b.inventory_item_id
into V_INV_ITEM_ID
from Mtl_System_Items_b b
where b.segment1 = V_ITEM_CODE
and b.organization_id = 541;
EXCEPTION
WHEN NO_DATA_FOUND THEN
null;
END;
select XXTE_BSS_MO_SEQ.Nextval into V_LINE_TRX_ID from dual;
INSERT INTO Xxte_Bss_Int_serials
(MOVE_ORDER_NUM,LINE_NUM,INV_ITEM_ID,INV_ITEM_CODE,FM_SERIAL_NUM,RUN_RESULT,RUN_MSG,MO_LINE_ID,CREATION_DATE,LINE_TRX_ID)
VALUES
(V_MOVE_ORDER_NUM,V_LINE_NUM,V_INV_ITEM_ID,V_ITEM_CODE,V_FM_SERIAL_NUM,'Done',Null,P_LINE_ID,sysdate,V_LINE_TRX_ID);
COMMIT;
V_CHECK_STEP := 'Check the attached Move order with transaction order number';
dbms_output.put_line('V_CHECK_STEP ' || V_CHECK_STEP);
if V_MOVE_ORDER_NUM != to_char(P_MO_NUMBER) then
Update Xxte_Bss_Int_serials
set RUN_RESULT = 'Error',RUN_MSG = V_CHECK_STEP
where MOVE_ORDER_NUM = V_MOVE_ORDER_NUM
and MO_LINE_ID = P_LINE_ID
and LINE_TRX_ID = V_LINE_TRX_ID;
commit;
end if;
V_CHECK_STEP := 'Check the attached Line number with transaction order number';
begin
select MTRL.Line_Number
into att_line_num
from MTL_TXN_REQUEST_LInes MTRL
where MTRL.Line_Id = P_LINE_ID;
if V_LINE_NUM != att_line_num then
Update Xxte_Bss_Int_serials
set RUN_RESULT = 'Error',RUN_MSG = V_CHECK_STEP
where MOVE_ORDER_NUM = V_MOVE_ORDER_NUM
and MO_LINE_ID = P_LINE_ID
and LINE_TRX_ID = V_LINE_TRX_ID;
commit;
end if;
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('Error: ' || V_CHECK_STEP ||
' ' || 'Line NUmber: ' ||
V_LINE_NUM);
END;
V_CHECK_STEP := 'Check the attached ITEM CODE with transaction order number';
begin
select MTRL.Inventory_Item_Id
into att_INV_ITEM_ID
from MTL_TXN_REQUEST_LInes MTRL
where MTRL.Line_Id = P_LINE_ID;
if V_INV_ITEM_ID != att_INV_ITEM_ID then
Update Xxte_Bss_Int_serials
set RUN_RESULT = 'Error',RUN_MSG = V_CHECK_STEP
where MOVE_ORDER_NUM = V_MOVE_ORDER_NUM
and MO_LINE_ID = P_LINE_ID
and LINE_TRX_ID = V_LINE_TRX_ID;
commit;
end if;
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('Error: ' || V_CHECK_STEP ||
' ' || 'ITEM CODE: ' ||
V_ITEM_CODE);
/*EXIT;*/
end;
V_CHECK_STEP := 'Check the attached Serial with transaction order number';
begin
select count(MSN.Serial_Number)
into att_SER_NUM
from MTL_SERIAL_NUMBERS MSN
where MSN.Inventory_Item_Id = V_INV_ITEM_ID
and MSN.Serial_Number = V_FM_SERIAL_NUM
and msn.current_status = 3
and msn.current_organization_id = 541
and msn.current_subinventory_code in
(select distinct l.from_subinventory_code
from Mtl_Txn_Request_Lines l
where l.line_id = P_LINE_ID);
if att_SER_NUM = 0 then
/*if att_SER_NUM != V_FM_SERIAL_NUM then*/
Update Xxte_Bss_Int_serials
set RUN_RESULT = 'Error',RUN_MSG = V_CHECK_STEP
where MOVE_ORDER_NUM = V_MOVE_ORDER_NUM
and MO_LINE_ID = P_LINE_ID
and LINE_TRX_ID = V_LINE_TRX_ID;
commit;
end if;
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('Error: ' || V_CHECK_STEP ||
' ' || 'Serial Number: ' ||
V_FM_SERIAL_NUM);
end;
end if; -- reomove headers
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('ERROR ' || 'V_CHECK_STEP: ' ||
V_CHECK_STEP || ' ' ||
SUBSTR(sqlERRM,1000));
EXIT;
END;
------------------logs-----------------------------
FND_FILE.PUT_LINE(FND_FILE.LOG,V_MOVE_ORDER_NUM || ' -> ' || ' [ Serial = ' ||
V_FM_SERIAL_NUM || ' ] : ');
END LOOP;
END IF;
UTL_FILE.FCLOSE(V_GENERATED_FILE);
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('ERROR ' || 'V_CHECK_STEP: ' || V_CHECK_STEP);
WHEN Others THEN
dbms_output.put_line('ERROR ' || 'V_CHECK_STEP: ' || V_CHECK_STEP);
end;
dbms_output.put_line('==========CHECK TEMP TRANSACTION==========');
V_CHECK_STEP := 'Check allocation temp transaction';
begin
select TEMP.TRANSACTION_TEMP_ID
into V_TRX_TEMP_ID
from MTL_MATERIAL_TRANSACTIONS_TEMP TEMP
where TEMP.Transaction_Source_Id = P_MO_NUMBER
and TEMP.Trx_Source_Line_Id = P_LINE_ID;
dbms_output.put_line('TEMP_TRANSACTION_ID = ' || V_TRX_TEMP_ID);
EXCEPTION
WHEN NO_DATA_FOUND THEN
Update Xxte_Bss_Int_serials
set RUN_RESULT = 'Error',RUN_MSG = V_CHECK_STEP
where MOVE_ORDER_NUM = V_MOVE_ORDER_NUM
and LINE_NUM = P_LINE_ID;
dbms_output.put_line('TEMP_TRANSACTION_ID = ' || V_TRX_TEMP_ID);
end;
--for i in C_TRX_TEMP loop
if V_TRX_TEMP_ID is not null then
dbms_output.put_line('----------======================----------');
dbms_output.put_line('==========Calling INSERT SERIALS==========');
dbms_output.put_line('----------======================----------');
V_CHECK_STEP := 'Calling INSERT SERIALS';
INSERT_SERIAL_TRX(V_TRX_TEMP_ID /*i.transaction_temp_id*/,P_MO_NUMBER);
else
dbms_output.put_line('Check allocation');
update XXTE_BSS_INT_SERIALS b
set b.status = 'N'
where b.move_order_num = to_char(P_MO_NUMBER)
and b.mo_line_id = P_LINE_ID
and LINE_TRX_ID = V_LINE_TRX_ID;
end if;
EXCEPTION
WHEN NO_DATA_FOUND THEN
--end loop;---------logs----------------
FND_FILE.PUT_LINE(FND_FILE.LOG,'TEEEEEE FILE_NAME');
-------------------------------
WHEN others THEN
FND_FILE.PUT_LINE(FND_FILE.LOG,'TEEEEEE FILE_NAME');
end;
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)