Fórum Pl/Sql Json Incluindo Registro em Tabela dinamicamente #462286
27/11/2013
0
-- PL/JSON (version 1.0.4)
CREATE OR REPLACE PACKAGE Dynamic_Insert
IS
PROCEDURE ValidaCampo (Tabela IN VARCHAR2, Campo IN VARCHAR2,
Valor IN VARCHAR2, Erro OUT NUMBER);
FUNCTION SString (Valor IN VARCHAR2, Coluna IN VARCHAR2)
RETURN VARCHAR2;
PROCEDURE Incluir_Registros(Tabela IN VARCHAR2, Obj IN VARCHAR2,
ErroS OUT VARCHAR2);
END;
/
CREATE OR REPLACE PACKAGE BODY Dynamic_Insert
IS
Tipo VARCHAR2(106);
FUNCTION SString
(Valor IN VARCHAR2, Coluna IN VARCHAR2)
RETURN VARCHAR2
IS
r VARCHAR2(40) :=NULL;
c VARCHAR2(1);
n VARCHAR2(40);
BEGIN
-- Se não Existir Coluna Apenas retorna o to_char
IF (Coluna IS NOT NULL) THEN
-- Acha os dados do Campo
BEGIN
select DISTINCT TRIM(t.DATA_TYPE)
INTO Tipo
from user_tab_columns t
where t.COLUMN_NAME = Coluna;
EXCEPTION
WHEN OTHERS THEN
Tipo:=NULL;
END;
-- Modifica o Campo Quando for Numerico
IF (Tipo = 'NUMBER') THEN
n:=TO_CHAR(Valor);
IF (N IS NULL) THEN
n:='0';
END IF;
n:=replace(n,'.',',');
ELSE
n:=TO_CHAR(Valor);
END IF;
ELSE
n:=TO_CHAR(Valor);
END IF;
-- Retorna o Campo Convertido
RETURN n;
END;
PROCEDURE ValidaCampo
(Tabela IN VARCHAR2, Campo IN VARCHAR2,
Valor IN VARCHAR2, Erro OUT NUMBER)
AS
Obriga VARCHAR2(1);
TamanhoStr NUMBER;
TamanhoNum NUMBER;
QtdDec NUMBER;
Data DATE;
Numero NUMBER;
BEGIN
-- Acha dados da Tabela
BEGIN
select t.data_type, t.nullable, t.data_length,
t.data_precision, t.data_scale
into Tipo, Obriga, TamanhoStr, TamanhoNum, QtdDec
from user_tab_columns t
where t.table_name = UPPER(Tabela)
and t.column_name = UPPER(Campo);
EXCEPTION
WHEN OTHERS THEN
BEGIN
Erro:='Campo nao Localizado: '||Campo;
goto Fim;
END;
END;
-- Valida Obrigatorio
if (Obriga = 'N') and (Valor IS NULL)then
Erro:='Campo Obrigatorio: '||Campo;
goto Fim;
end if;
-- Se Valor for nulo encerra a Critica
if (Valor is null) then
goto Fim;
end if;
-- Critica Data
begin
if (Tipo = 'DATE') then
Data:=to_date(Valor);
end if;
exception
when others then
begin
Erro:='Data Invalida: '||Campo;
goto Fim;
end;
end;
-- Critica Numero
begin
if (Tipo = 'NUMBER') then
Numero:=to_number(Valor);
if (length(Valor) > (TamanhoNum - QtdDec)) then
Erro:='Valor de Campo Numerico Invalido: '||Campo;
goto Fim;
end if;
end if;
exception
when others then
begin
Erro:='Campo Numerico Invalido: '||Campo;
goto Fim;
end;
end;
-- Critica Char
begin
if (Tipo = 'CHAR') then
if (length(Valor) > TamanhoStr) then
Erro:='Valor de Campo Caracter Invalido: '||Campo;
goto Fim;
end if;
end if;
exception
when others then
begin
Erro:='Valor de Campo Caracter Invalido: '||Campo;
goto Fim;
end;
end;
-- Critica Varchar2
begin
if (Tipo = 'VARCHAR2') then
if (length(Valor) > TamanhoStr) then
Erro:='Valor de Campo Caracter Invalido: '||Campo;
goto Fim;
end if;
end if;
exception
when others then
begin
Erro:='Valor de Campo Caracter Invalido: '||Campo;
goto Fim;
end;
end;
<<Fim>>
Tipo:=NULL;
END;
PROCEDURE Incluir_Registros
(Tabela IN VARCHAR2, Obj IN VARCHAR2, ErroS OUT VARCHAR2)
AS
j_json json;
Valor VARCHAR2(4000):=NULL;
sSql VARCHAR2(2000);
sValue VARCHAR2(2000);
Erro VARCHAR2(4000);
vSql VARCHAR2(4000);
LF VARCHAR2(2):=CHR(13)||CHR(10);
var_cur NUMBER;
var_exec NUMBER;
var_retor NUMBER;
var_1 NUMBER:=0;
BEGIN
-- Monta o Sql Inicial
sSql:='INSERT INTO '||TRIM(UPPER(Tabela))||' (';
sValue:='VALUES (';
-- Monta Objeto Json
j_json:=json(Obj);
-- Loop de Validação e Inclusão do Registro
For r in (select t.column_name Campo,
t.data_type Tipo
from user_tab_columns t
where t.table_name = UPPER(Tabela))
Loop
<<Ler>>
if (json_ac.object_exist(j_json, r.Campo)) then
-- Trata o tipo NUMBER para substituir a virgula por ponto
if (r.Tipo = 'NUMBER') then
Valor:=SString(json_ext.get_string(j_json, r.Campo), r.Campo);
else
Valor:=json_ext.get_string(j_json, r.Campo);
end if;
-- Validação Generica do Campo
ValidaCampo(Tabela, r.Campo, Valor, Erro);
-- Se Houve Erro Acumula e Volta a Ler
IF (Erro IS NOT NULL) THEN
ErroS:=trim(Erro)||LF;
GOTO Ler;
END IF;
ELSE
GOTO Ler;
END IF;
-- Monta o Sql
sSql:=sSql||r.Campo||',';
if (r.Tipo IN ('VARCHAR2','CHAR','DATE')) THEN
sValue:=sValue||''''||Valor||''''||',';
else
sValue:=sValue||Valor||',';
end if;
End Loop;
-- Se Houve Erro Aborta
IF (ErroS IS NOT NULL) THEN
GOTO Fim;
END IF;
-- Complementa o Sql
sSql:=SUBSTR(sSql,1,length(sSql) - 1)||') ';
sValue:=SUBSTR(sValue,1,length(sValue) - 1)||')';
vSql:=TRIM(sSql)||TRIM(sValue);
-- Executa a Inclusão
execute immediate vSql;
<<Fim>>
sSql:=NULL;
END;
END;
/
Dúvidas ou implementações compartilhem com todos.
Lourival Queiroz
Lourival Queiroz
Curtir tópico
+ 0Posts
27/11/2013
Lourival Queiroz
obj => :obj, -- Objeto json
erros => :erros); -- Variável de retorno do erro
Gostei + 0
27/11/2013
Lourival Queiroz
CREATE OR REPLACE PROCEDURE Monta_Json
(Campo1 IN NUMBER, Campo2 IN NUMBER, Campo3 IN NUMBER,
Campo OUT VARCHAR2)
AS
ObjJson json;
Ip VARCHAR2(100);
Campo VARCHAR2(10000);
BEGIN
-- Acha o Ip
select TRIM(substr(SYS_CONTEXT ('USERENV', 'IP_ADDRESS'),1,100))
into Ip
from dual;
-- Monta Objeto Json
ObjJson:=json();
ObjJson.put('CAMPOTAB1', Campo1);
ObjJson.put('CAMPOTAB1', Campo2);
ObjJson.put('CAMPOTAB1', Campo3);
ObjJson.Put('IP' , IP);
Campo:=json.to_char(ObjJson);
END;
/
Gostei + 0
27/11/2013
Lourival Queiroz
CREATE OR REPLACE PROCEDURE Monta_Json
(Campo1 IN NUMBER, Campo2 IN NUMBER, Campo3 IN NUMBER,
Campo OUT VARCHAR2)
AS
ObjJson json;
Ip VARCHAR2(100);
Campo VARCHAR2(10000);
BEGIN
-- Acha o Ip
select TRIM(substr(SYS_CONTEXT ('USERENV', 'IP_ADDRESS'),1,100))
into Ip
from dual;
-- Monta Objeto Json
ObjJson:=json();
ObjJson.put('CAMPOTAB1', Campo1);
ObjJson.put('CAMPOTAB2', Campo2);
ObjJson.put('CAMPOTAB3', Campo3);
ObjJson.Put('IP' , IP);
Campo:=json.to_char(ObjJson);
END;
/
Lourival Queiroz
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)