Todos nós que trabalhamos com banco de dados por varias vezes seguida temos a necessidade de repetir um mesmo conjunto de dados alterando apenas um ou dois campos da chave.
Esta tarefa é bem fácil quando estamos trabalhando com uma tabela com poucos campo.
Suponhamos que temos a tabela TPT210 que contém um campo CDMOEDA que faz parte da chave e precisamos duplicar as linhas da tabela cujo campo CDMOEDA é igual a 1 alterando o valor para 20. Se temos poucos campos na tabela seria algo assim:
INSERT INTO TPT210 SELECT CAMPO1, CAMPO2, 20 AS CDMOEDA, CAMPO4 FROM
TPT210
Mas se temos muitos campos; reescreve-los todos é bastante trabalhoso e propenso a erros. Embora podemos utilizar alguns recursos de aplicativos dos bancos que copia os nomes de campos separados por virgula e tal, ainda assim, por experiência, é chato.
Portanto o script abaixo tem o objetivo de resolver esta questão.
O objetivo é o mesmo acima descrito. Copiar todos os registros da tabela com TPT210 com o valor do campo CDMOEDA = 1 e inseri-los na própria TPT210 alterando o conteúdo do campo
CDMOEDA para 20.
DECLARE @vCOLLIST VARCHAR(1000), @vSQLS VARCHAR(4000)
SET @vCOLLIST = ''
SELECT @vCOLLIST = @vCOLLIST + CASE WHEN NAME != 'CDMOEDA' THEN
NAME
ELSE
'20 AS CDMOEDA'
END + ', ' FROM SYSCOLUMNS WHERE ID = OBJECT_ID('TPT210') ORDER BY COLORDER
SELECT @vSQLS = 'INSERT INTO TPT210 SELECT ' + substring(@vCOLLIST,1,len(@vCOLLIST)-1) + ' FROM TPT210 WHERE CDMOEDA = 1'
PRINT @vSQLS
Por enquanto é somente isso.
Até a próxima.
Reginaldo
PS: Aqui na empresa funciona e quase todos os servidores menos em um e não sei porque.
quinta-feira, 19 de junho de 2008
segunda-feira, 16 de junho de 2008
Seleção de registros aleatórios - ORACLE
Por vezes gostaríamos de preencher um campo de uma tabela com valores aleatórios. Abaixo o script que pode ajuda-lo a cumprir esta tarefa.
Criei uma tabela teste para acumular os valores para podermos analisar o que foi feito pelo script.
Neste caso poderia utilizar o valor vCDFNC tranquilamente porque o valor já é um número aleatório e é isso que quero porém em alguns casos posso querer inserir um valor aleatório que vem de um SELECT de um campo VARCHAR. Neste caso passo à função RANDOM os valores minimos e maximos que quero. Aqui no exemplo tenho 124 registros na tabela TPT154, isto me traz um valor neste intervalo e após isso seleciono o campo VARCHAR da tabela cujo registro é exatamente este número.
Verifique que neste script estão contidas várias técnicas : selecionar um registro randomicamente, selecionar apenas um registro, ou vários aleatóriamente, etc.
CREATE TABLE TESTE
(
ID INTEGER PRIMARY KEY,
vCDFNC INTEGER,
aCDFNC VARCHAR(40)
);
DECLARE
vCDFNC INTEGER;
n INTEGER;
aCDFNC VARCHAR(40);
BEGIN
n := 1;
WHILE n <>
LOOP
SELECT ROUND( dbms_random.VALUE(1,124)) INTO vCDFNC FROM dual;
SELECT DSFNC INTO aCDFNC
FROM ( SELECT a.dsfnc, ROWNUM rnum FROM ( SELECT * FROM TPT154
ORDER BY CDFNC, ROWID ) a WHERE ROWNUM <= vCDFNC )
WHERE rnum > vCDFNC - 1;
INSERT INTO TESTE VALUES( n, vCDFNC, aCDFNC );
n := n + 1;
END LOOP;
END;
Espero que lhe seja útil em algum momento. Pode perguntar se não entender via comentário que terei prazer em lhe ajudar.
Até a próxima.
Reginaldo
Criei uma tabela teste para acumular os valores para podermos analisar o que foi feito pelo script.
Neste caso poderia utilizar o valor vCDFNC tranquilamente porque o valor já é um número aleatório e é isso que quero porém em alguns casos posso querer inserir um valor aleatório que vem de um SELECT de um campo VARCHAR. Neste caso passo à função RANDOM os valores minimos e maximos que quero. Aqui no exemplo tenho 124 registros na tabela TPT154, isto me traz um valor neste intervalo e após isso seleciono o campo VARCHAR da tabela cujo registro é exatamente este número.
Verifique que neste script estão contidas várias técnicas : selecionar um registro randomicamente, selecionar apenas um registro, ou vários aleatóriamente, etc.
CREATE TABLE TESTE
(
ID INTEGER PRIMARY KEY,
vCDFNC INTEGER,
aCDFNC VARCHAR(40)
);
DECLARE
vCDFNC INTEGER;
n INTEGER;
aCDFNC VARCHAR(40);
BEGIN
n := 1;
WHILE n <>
LOOP
SELECT ROUND( dbms_random.VALUE(1,124)) INTO vCDFNC FROM dual;
SELECT DSFNC INTO aCDFNC
FROM ( SELECT a.dsfnc, ROWNUM rnum FROM ( SELECT * FROM TPT154
ORDER BY CDFNC, ROWID ) a WHERE ROWNUM <= vCDFNC )
WHERE rnum > vCDFNC - 1;
INSERT INTO TESTE VALUES( n, vCDFNC, aCDFNC );
n := n + 1;
END LOOP;
END;
Espero que lhe seja útil em algum momento. Pode perguntar se não entender via comentário que terei prazer em lhe ajudar.
Até a próxima.
Reginaldo
Assinar:
Comentários (Atom)

