带有新信息的PL / SQL覆盖文件,无需附加

时间:2016-02-17 15:57:24

标签: oracle pdf plsql utl-file

我在我的FTP文件夹上构建PDF以通过守护进程发送它,该文件没问题,但是每次我把它放在那里这个文件都附有信息,PDF自然只会读取LAST指令,但为了创建一个干净的文件,我需要每次创建一个空白的PDF。

  1. 创建PDF
  2. 写信息(UTL_FILE.PUT_LINE)
  3. 关闭文件
  4. 但如果我需要创建另一个包含相同图层但新信息的文件,我的过程就是创建一个带有某个名称的文件,然后找到旧文件并附上APPEND信息。

    我需要删除该文件并添加新信息,我该怎么做以避免附加该信息?

    代码:(它是PL_FPDF库,修改为在目录中写入文件)

    Mat tempFrame;
    cvtColor(BallFrame, tempFrame, COLOR_BGR2GRAY);
    GaussianBlur(tempFrame, tempFrame, Size(15, 15), 2, 2); // remove noise
    Mat imBw;
    threshold(tempFrame, imBw, 220, 255, THRESH_BINARY); // High threshold to get better results
    std::vector<std::vector<Point> > contours;
    std::vector<Vec4i> hierarchy;
    findContours(imBw, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
    Point2f center;
    float radius = 0.0;
    for (int i = 0; i < contours.size(); i++)
    {
        double area = contourArea(contours[i]);
    if (area > 1 && area < 4000) {
            minEnclosingCircle(contours[i], center, radius);
            if (radius < 50) // eliminate wide narrow contours
            {
                // You can use `matchShape` here to match your marker shape
            }
        }
    
    }
    

    PDF的内部代码如下所示:

    --some code!
    elsif (myDest = 'F') then
        -- DFVD -- Enviar a directorio
        -- Content Restriction
        v_len := 1;
    
        for i in pdfDoc.first..pdfDoc.last loop
            v_clob := to_clob(pdfDoc(i));
            if v_clob is not null then
                v_in := 1;
                v_out := 1;
                v_lang := 0;
                v_warning := 0;
                v_len := dbms_lob.getlength(v_clob);
    
                dbms_lob.convertToBlob(v_blob, v_clob, v_len, v_in, v_out, dbms_lob.default_csid, v_lang, v_warning);
    
    
                dbms_lob.append(v_doc, dbms_lob.substr(v_blob, v_len));   
            end if;
        end loop;
    
        l_blob_len := DBMS_LOB.getlength(v_doc);
        l_file := UTL_FILE.fopen('FTP_DIR',myName,'w', 32767);
    
        WHILE l_pos < l_blob_len LOOP
            DBMS_LOB.read(v_doc, l_amount, l_pos, l_buffer);
            UTL_FILE.put_raw(l_file, l_buffer, TRUE);
            l_pos := l_pos + l_amount;
        END LOOP;
    
        UTL_FILE.fclose(l_file);
    else
    --some code!
    

    但文件还可以:

    enter image description here

1 个答案:

答案 0 :(得分:2)

经过短暂的研究后我找不到任何东西,所以我创建了一个补丁&#34;解决方案可能适用于这种情况:

--some code!
elsif (myDest = 'F') then
    -- DFVD -- Enviar a directorio
    -- Content Restriction
    v_len := 1;

    for i in pdfDoc.first..pdfDoc.last loop
        v_clob := to_clob(pdfDoc(i));
        if v_clob is not null then
            v_in := 1;
            v_out := 1;
            v_lang := 0;
            v_warning := 0;
            v_len := dbms_lob.getlength(v_clob);

            dbms_lob.convertToBlob(v_blob, v_clob, v_len, v_in, v_out, dbms_lob.default_csid, v_lang, v_warning);


            dbms_lob.append(v_doc, dbms_lob.substr(v_blob, v_len));   
        end if;
    end loop;

    //CHECK IF FILE EXISTS
    begin
        l_file := UTL_FILE.fopen('FTP_DIR',myName,'r');
        if UTL_FILE.is_open(l_file) then
            UTL_FILE.fclose(l_file);
        end if;     
    exception
        when others then
            NULL;
    end; 
    //CHECK IF FILE EXISTS

    l_blob_len := DBMS_LOB.getlength(v_doc);
    l_file := UTL_FILE.fopen('FTP_DIR',myName,'w', 32767);

    WHILE l_pos < l_blob_len LOOP
        DBMS_LOB.read(v_doc, l_amount, l_pos, l_buffer);
        UTL_FILE.put_raw(l_file, l_buffer, TRUE);
        l_pos := l_pos + l_amount;
    END LOOP;

    UTL_FILE.fclose(l_file);
else
--some code!

现在程序检查文件是否存在以及是否存在&#34; fremove&#34;该文件以确保创建一个新文件。