【 FILE オープン関数の作成 】

1. TXT_FOPEN
2. TXT_FOPEN を使用したプロシージャ
3. コマンドファイルの追加

  • パッケージにするのは、部品として完成してからです。とりあえず FUNCTION にします

  • /*
    /*===========================================================================
    	テキストファイル OPEN ( TXT_FOPEN )
    ===========================================================================*/
    CREATE or REPLACE FUNCTION TXT_FOPEN
    	(
    	PM_FILEHANDLE	IN OUT	UTL_FILE.FILE_TYPE
    	,PM_TARGETDIR	IN	VARCHAR2
    	,PM_TARGET	IN	VARCHAR2
    	)
    	RETURN BOOLEAN
    	AS
     
    	ERR	NUMBER;
     
    BEGIN
     
    	BEGIN
    		ERR := 0;
     
    		/* 第4引数の max_linesize は未指定時は 1000 です */
    		PM_FILEHANDLE := utl_file.fopen( PM_TARGETDIR, PM_TARGET, 'r' );
    		EXCEPTION
    			WHEN UTL_FILE.INVALID_OPERATION THEN
    				ERR := 1;
    			WHEN UTL_FILE.INVALID_PATH      THEN
    				ERR := 2;
    			WHEN UTL_FILE.INVALID_FILENAME  THEN
    				ERR := 3;
    			WHEN UTL_FILE.INVALID_MODE      THEN
    				ERR := 4;
    			WHEN UTL_FILE.FILE_OPEN         THEN
    				ERR := 5;
    			WHEN UTL_FILE.ACCESS_DENIED     THEN
    				ERR := 6;
    			WHEN UTL_FILE.INTERNAL_ERROR    THEN
    				ERR := 9;
    	END;
    	IF ERR != 0 THEN
    		DBMS_OUTPUT.PUT_LINE( 'ERR = ' || ERR );
    		RETURN FALSE;
    	ELSE
    		RETURN TRUE;
    	END IF;
     
    END TXT_FOPEN;
    /
    

    /*
    /*===========================================================================
    	テキストファイル読込み ( TEXT_GET2 )
    ===========================================================================*/
    CREATE or REPLACE PROCEDURE TEXT_GET2
    	AS
     
    	TEXT_BUFFER		VARCHAR2(2000);		-- 読込バッファ
    	FILEHANDLE		UTL_FILE.FILE_TYPE;
     
    BEGIN
     
    	DBMS_OUTPUT.PUT_LINE( 'TXT_FOPEN使用' );
     
    	/* ここでは使用しませんが、一番外側への脱出用です */
    	<<main_loop>>
    	LOOP -- ここにもコメントが書けます
     
    		EXIT main_loop
    		  WHEN
    		    not TXT_FOPEN( FILEHANDLE, 'TEXT_DIR', 'list.txt' );
     
    		LOOP
    			BEGIN
    				UTL_FILE.GET_LINE( FILEHANDLE,TEXT_BUFFER );
    				EXCEPTION
    					WHEN NO_DATA_FOUND THEN
    						EXIT;
    			END;
    	 
    			DBMS_OUTPUT.PUT_LINE( TEXT_BUFFER );
    	 
    		END LOOP;
     
    		UTL_FILE.FCLOSE( FILEHANDLE );
     
    	/* 脱出用ブロックとしてのループブロックです */
    	EXIT; -- 無条件に脱出するので、ループ処理をしないループになります
    	END LOOP;
     
    END TEXT_GET2;
    /
    

    複数のプロシージャ用
  • nc.sql で、指定したソースをコンパイルします
  •  
    START &コンパイルソース
    

  • l.sql は プロシージャの一覧を表示します
  •  
    select * from USER_PROCEDURES;