2017-04-17 60 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

谢谢你今天学到的东西。 –