text:  -- SQL LOADER
   
   -- CRIAR TABELA TESTE
   CREATE TABLE EMP(
      EMPNO       NUMBER(4)
  ,   ENAME       VARCHAR2(10)
  ,   EJOB        VARCHAR2(10)
  ,   EMGR        NUMBER(4)
  ,   HIREDATE    DATE
  ,   SAL         NUMBER(8,2)
  ,   COMN        NUMBER(7,2)
  ,   DEPTNO      NUMBER(2)
  ,   PROJNO      NUMBER(4)
  ,   LOADSEQ     NUMBER(3));
  
  
  -- NO MEU CASO,EU NÃO TINHA UM ARQUIVO DE CARGA PRONTO,
  -- ENTÃO FIZ UMA PROCEDURE PRA POPULAR A TABELA
  -- E DEPOIS UMA OUTRA PRA CRIAR O ARQUIVO O:-)
  CREATE OR REPLACE PROCEDURE PRC_POPULAR_TABELAS IS
  V_EMPNO     NUMBER(4);
  V_NAME      VARCHAR2(10);
  V_EJOB      VARCHAR2(10);
  V_EMGR      NUMBER(4);     
  V_SAL       NUMBER(8,2);        
  V_COMN      NUMBER(4);
  V_DEPTNO    NUMBER(2);
  
  V_DATE      CHAR(10); -- NO FINAL DO SCRIPT, ONDE ESTÁ A FUNÇÃO 
                        -- QUE CRIEI, EXPLICO PORQUE DO CHAR 
  BEGIN 
  
  -- INSERIR ALGUNS VALORES PADRÃO
  V_NAME  := 'JOSE SILVA'; 
  V_EJOB  := 'RANDOM    '; -- 10 SPACES P AJUDAR NO LOADER
  V_COMN := 1200;
  
  FOR DD IN 1..5000 LOOP
  
   -- FUNÇÃO PRA GERAR IDS SEQUENCIAIS E NÃO ALEATÓRIOS
   SELECT NVL(MAX(p.empno),0)+1 -- ANTES DE EXEC O BLOCO EU INSERI O PRIMEIRO
   INTO V_EMPNO             -- NÚMERO DE 4 DIGITOS PRA TODOS TEREM 4
   FROM EMP P;
  
   SELECT FCT_DATE_RANDOM(2005,2021) -- FUNÇÃO QUE CRIEI PARA GERAR DATAS ALEATÓRIAS
   INTO V_DATE                       -- VOU COLOCAR ELA NO FINAL DESSE SCRIPT
   FROM DUAL;                        -- MAS TEM NO INÍCIO DO MEU PERFIL AQUI DO GITHUB
  
   SELECT dbms_random.value(10000,20000)NUM -- FUNÇÃO DO ORACLE BASE PRA MINHA FUNÇÃO ACIMA,  
   INTO V_SAL                                 -- PRA PREENCHER O SAL COM VALORES ALEATÓRIOS
   FROM DUAL;
   
   SELECT DBMS_RANDOM.value(1000,1050)NUM
   INTO V_EMGR
   FROM DUAL;
   
   SELECT DBMS_RANDOM.value(01,20)NUM
   INTO V_DEPTNO
   FROM DUAL;
   
   INSERT INTO emp(EMPNO,ENAME,EJOB,EMGR,HIREDATE,SAL,COMN,DEPTNO)
      VALUES(V_EMPNO,V_NAME,V_EJOB,V_EMGR,V_DATE,V_SAL,V_COMN,V_DEPTNO);
   -- (NÃO VAMOS USAR A DATA NO LOADER, MAS JA DEIXEI AQUI PRA VOCÊS 
   -- USAREM QUANDO PRECISO
   END LOOP;
  
  COMMIT;
  END;
  
  
  -- PROCEDURE PARA GERAR ARQUIVO .TXT
  CREATE OR REPLACE PROCEDURE PCR_EMP_UTL IS
  
  V_LINHA VARCHAR2(100);
  V_ARQUIVO UTL_FILE.FILE_TYPE;
  
  BEGIN
  
  V_ARQUIVO := utl_file.fopen('DIR_UTL', 'demo02.dat','W');
  
   FOR i IN (SELECT * FROM emp) LOOP
   -- USAR UM DELIMITADOR PARA FACILITAR ARECUPERAÇÃO DOS DADOS
   V_LINHA := i.empno||' '||i.ename||' '||i.ejob||' '
   ||i.emgr||' '||i.sal||' '||i.comn||' '||i.deptno;
  
   utl_file.put_line(V_ARQUIVO, V_LINHA);
  
   END LOOP;
  
  utl_file.fclose(V_ARQUIVO);
  
  END;
  
  EXECUTE pcr_emp_utl;
  
  
  -- CRIAÇÃO DO ARQUIVO DE CONTROLE NA PASTA TEMP
  -- TESTE.CTL -> COLOCAR AS INFROMAÇÕES ASEGUIR:
  LOAD DATA
  INFILE 'C:\temp\demo02.dat'
  INTO TABLE EMP 
  (EMPNO  POSITION(01:04)   INTEGER EXTERNAL,
   ENAME  POSITION(06:15)   CHAR,
   EJOB   POSITION(16:26)   CHAR,
   EMGR   POSITION(28:31)   INTEGER EXTERNAL,
   SAL    POSITION(33:41)   DECIMAL EXTERNAL,
   COMN   POSITION(43:46)   DECIMAL EXTERNAL,
   DEPTNO POSITION(47:49)   INTEGER EXTERNAL)
   
   
   -- CHAMAR SQL LOADER COM O SEGUINTE COMANDO NO TERMINAL DO SO
   sqlldr userid=usuario/senha@instancia control='C:/temp/teste.ctl' log=teste.log
   
   -- NESSE PROCESSO É BEM COMUM DAR ERRO EM ALGUMA ETAPA, OK?
   -- ENTÃO MUITA ATENÇÃO NAS SYNTAXES E DADOS INSERIDOS.
   
   
   
   
   
   -- AQUI ESTÁ A FUNÇÃO QUE CIREI, SE JA EXISTE ALGUMA 
   -- QUE FAZ A MESMA COISANÃO SEI, MAS A MINHA ESTÁ AÍ!!
   -- INSERT PARAMETERS WHEN CALL THE FUNCTION
  -- YEAR START AND YEAR END. EX FCT_DATE_RANDOM(1999,2021)
  CREATE OR REPLACE FUNCTION FCT_DATE_RANDOM 
  (P_START_Y IN NUMBER,                      
  P_END_Y IN NUMBER) RETURN CHAR -- RETURN CHAR BECAUSE RETURN DATE IS (DD/MM/YYYY HH:MM:SS)
  IS
  
  -- A VAR FOR EACH VALUE
  V_DAY NUMBER(2);
  V_MONTH NUMBER(2);
  V_YEAR NUMBER(4);
  
  -- A VAR FOR THE FULL DATE
  V_DATE_FULL CHAR(10);
  
  BEGIN
  -- SELECT STRUCTURE FOR THE RANDONS NUMBERS
  SELECT DBMS_RANDOM.value(P_START_Y,P_END_Y)NUM
  INTO V_YEAR
  FROM DUAL;
  
  SELECT DBMS_RANDOM.value(01,30)NUM
  INTO V_DAY
  FROM DUAL;
  
  SELECT DBMS_RANDOM.value(01,12)NUM
  INTO V_MONTH
  FROM DUAL;
  
  -- PROCESS TO CONCATENATE DATE
  V_DATE_FULL := V_DAY||'/'||V_MONTH||'/'||V_YEAR;
  
   RETURN (V_DATE_FULL);
  END;
  