2017-04-17 44 views
0

我有一個方案我有一個表t1,它有兩個表名,他們是sanman。而現在這兩個表sanman每個表都有多個表的文件名如表san有兩個文件名(audi.txtmercedes.txt),第二臺man有一個文件名(hundai.txt)。我寫了一個過程,它可以返回相應表中存在的行數與相應的文件名。下面是該過程:關於程序執行方式oracle pl/sql問題

:SQL查詢

-- for creating t1 table-- 

CREATE TABLE HR.T1 
(
    NAMES  VARCHAR2(20 BYTE), 
    MAPPING_ID VARCHAR2(10 BYTE) 
); 

SET DEFINE OFF; 
Insert into HR.T1 
    (NAMES, MAPPING_ID) 
Values 
    ('san', '1'); 
Insert into HR.T1 
    (NAMES, MAPPING_ID) 
Values 
    ('man', '1'); 
COMMIT; 

-----------sql query for 'san' table---- 

CREATE TABLE HR.SAN 
(
    SRC_FILENAME VARCHAR2(20 BYTE) 
); 

SET DEFINE OFF; 
Insert into HR.SAN 
    (SRC_FILENAME) 
Values 
    ('audi.txt'); 
Insert into HR.SAN 
    (SRC_FILENAME) 
Values 
    ('mercedes.txt'); 
COMMIT; 

------sql query for man table ---- 

CREATE TABLE HR.MAN 
(
    SRC_FILENAME VARCHAR2(20 BYTE) 
); 

SET DEFINE OFF; 
Insert into HR.MAN 
    (SRC_FILENAME) 
Values 
    ('hundai.txt'); 
COMMIT; 

-------package spec ----- 

CREATE OR REPLACE PACKAGE HR.file_entry 

AS 

PROCEDURE PKG_PROC_FILES(L_MAPPING_ID NUMBER); 
procedure insert_proc (l_object_name VARCHAR2); 
END; 

-----package body ----- 


    CREATE OR REPLACE PACKAGE BODY HR.file_entry 
AS 

    PROCEDURE PKG_PROC_FILES (L_MAPPING_ID NUMBER) 

AS 
     V_TABLE_NAME VARCHAR2 (50); 
    V_SCHEMA_NAME VARCHAR2 (50); 

    TYPE CURTYPE IS REF CURSOR; 

    V_SCHEMA_NAME VARCHAR2 (50); 


    ---- 
     CURSOR TARGET_OBJ_CUR 
     IS 
     SELECT DISTINCT names 
      FROM t1 
      WHERE MAPPING_ID = L_MAPPING_ID; 
    BEGIN 

    FOR I IN TARGET_OBJ_CUR 
     LOOP 
     INSERT_PROC (I.names); 
     DBMS_OUTPUT.PUT_LINE ('TARGET_TABLE_NAME= ' || I.names); 
     END LOOP; 
    END; 



PROCEDURE INSERT_PROC (L_OBJECT_NAME VARCHAR2) 

    AS 

     V_TABLE_NAME  VARCHAR2 (50); 
     V_SCHEMA_NAME  VARCHAR2 (50); 
     V_QUERY   VARCHAR2 (50); 

     TYPE CURTYPE IS REF CURSOR; 

     V_SRC_FILE_NAMES VARCHAR2 (200); 
     CUR    CURTYPE; 

BEGIN 

     V_QUERY := 'select distinct src_filename from ' || L_OBJECT_NAME; 
     OPEN CUR FOR V_QUERY; 

     LOOP 
     FETCH CUR INTO V_SRC_FILE_NAMES; 

     DBMS_OUTPUT.PUT_LINE ('SOURCE FILE NAMES 1 = ' || V_SRC_FILE_NAMES); 
     COMMIT; 

     EXIT WHEN CUR%NOTFOUND; 
     END LOOP; 

     CLOSE CUR; 

    END; 

END; 
/

執行程序後,我有多個名稱從DB:

O/P 
SOURCE FILE NAMES = mercedes.txt 
SOURCE FILE NAMES = audi.txt 
SOURCE FILE NAMES = audi.txt 
TARGET_TABLE_NAME= san 
SOURCE FILE NAMES = hundai.txt 
SOURCE FILE NAMES = hundai.txt 
TARGET_TABLE_NAME= man 

在下面的O/PI需要得到唯一不同的源文件來自表格的名字,但我無法理解爲什麼我多次獲得audi.txthundai.txt。任何人都可以幫我解決這個問題嗎?我需要在輸出中打印一次文件名,例如mercedes.txt,它在輸出中只打印一次。

回答

1

EXIT WHEN CUR%NOTFOUND;退出語句需要在INSERT_PROC程序中fetch之後檢查,而不是在end loop之前檢查。爲什麼在dbms_output.put_line之後使用commit

+0

謝謝你今天學到的東西。 –