Estou com o seguinte problema relativo ao comando MERGE. Se alguém souber a causa eu agradeço. Grande abraço,
Saída do DBMS_OUTPUT:
ERRO NO SUB-PROGRAMA.
ERRO ORACLE: ORA-00904: "F"."CD_MAT": invalid identifier
Criei duas tabelas e uma procedure que realiza o comando MERGE. A procedure foi compilada sem nenhum erro de compilação.
O que está causando este erro de execução (quando chamo o execute TESTE_MERGE)???
Tabelas:
CREATE TABLE FATO_FUNC
(
CD_MAT NUMBER(5) NOT NULL
,NM_FUNC VARCHAR2(12)
,NM_SOBRENOME VARCHAR2(12)
,CD_DEPTO CHAR(3)
,NR_RAMAL NUMBER(4)
,DT_ADM DATE
,NR_CARGO NUMBER(3)
,NR_GIT NUMBER(2)
,IN_SEXO VARCHAR2(1) CHECK (IN_SEXO IN ('F', 'M'))
,DT_NASC DATE
,VL_SAL NUMBER(9,2)
,NM_FOTO VARCHAR2(200)
)
CREATE TABLE TEMP_FUNC
(
CD_MAT NUMBER(5) NOT NULL
,NM_FUNC VARCHAR2(12)
,NM_SOBRENOME VARCHAR2(12)
,CD_DEPTO CHAR(3)
,NR_RAMAL NUMBER(4)
,DT_ADM DATE
,NR_CARGO NUMBER(3)
,NR_GIT NUMBER(2)
,IN_SEXO VARCHAR2(1) CHECK (IN_SEXO IN ('F', 'M'))
,DT_NASC DATE
,VL_SAL NUMBER(9,2)
,NM_FOTO VARCHAR2(200)
,constraint pk_func1 PRIMARY KEY (CD_MAT)
)
CREATE OR REPLACE PROCEDURE TESTE_MERGE IS
-- Created on 23/10/2008 by PEDRO.SILVA
-- Local variables here
VAR_TOT_REG_TOTAL NUMBER;
begin
-- Test statements here
VAR_TOT_REG_TOTAL := 0;
MERGE INTO FATO_FUNC F
USING (SELECT cd_mat,
nm_func,
nm_sobrenome,
cd_depto,
nr_ramal,
dt_adm,
nr_cargo,
nr_git,
in_sexo,
dt_nasc,
vl_sal,
nm_foto
FROM TEMP_FUNC ) T
ON (F.CD_MAT = T.CD_MAT)
WHEN MATCHED THEN
UPDATE
SET F.cd_mat = T.cd_mat,
F.nm_func = T.nm_func,
F.nm_sobrenome = T.nm_sobrenome,
F.cd_depto = T.cd_depto,
F.nr_ramal = T.nr_ramal,
F.dt_adm = T.dt_adm,
F.nr_cargo = T.nr_cargo,
F.nr_git = T.nr_git,
F.in_sexo = T.in_sexo,
F.dt_nasc = T.dt_nasc,
F.vl_sal = T.vl_sal,
F.nm_foto = T.nm_foto
WHEN NOT MATCHED THEN
INSERT
( F.CD_MAT,
F.nm_func,
F.nm_sobrenome,
F.cd_depto,
F.nr_ramal,
F.dt_adm,
F.nr_cargo,
F.nr_git,
F.in_sexo,
F.dt_nasc,
F.vl_sal,
F.nm_foto)
VALUES
( T.CD_MAT,
T.nm_func,
T.nm_sobrenome,
T.cd_depto,
T.nr_ramal,
T.dt_adm,
T.nr_cargo,
T.nr_git,
T.in_sexo,
T.dt_nasc,
T.vl_sal,
T.nm_foto);
VAR_TOT_REG_TOTAL := SQL%ROWCOUNT;
DBMS_OUTPUT.PUT_LINE('TOTAL DE REGISTROS: '||VAR_TOT_REG_TOTAL);
-- DBMS_OUTPUT.PUT_LINE();
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
DBMS_OUTPUT.PUT_LINE('ERRO NA PROCEDURE TESTE_MERGE.');
DBMS_OUTPUT.PUT_LINE('ERRO ORACLE: '|| SUBSTR(SQLERRM(SQLCODE), 1, 200));
END;