INSERT中的CAST和CONCAT

时间:2016-12-20 15:40:46

标签: sql oracle plsql

使用Oracle数据库:

如何在INSERT语句中使用连接和强制转换?

我需要为某些测试插入数据,我需要更改插入数据的ID。

到目前为止,我得到了这个:

BEGIN
  FOR i IN 100..400 LOOP
      INSERT INTO PRESTATION 
      (ID_DEMANDE, ID_PRESTATION, CODE_PRODUCTEUR_UNICITE_PRESTA, SELECTION, ID_RUBRIQUE, LIBELLE_CONTRAT, CODE_PRODUCTEUR_ENTITE_JURIDIQ, GUICHET_GESTIONNAIRE, CODE_SOURCE, CODE_PRODUIT, CODE_SOUS_PRODUIT, LIBELLE_PRODUIT, CODE_BANQUE, NUMERO_CLIENT, MONTANT, DEVISE, RESEAU_DISTRIBUTION, DATE_OUVERTURE, DATE_FERMETURE, ROLE) 
      VALUES 
      ('DO20161220160056000592', CONCAT('0000000317501820134', CAST(i AS VARCHAR)), '00020', 'O', 0, 'COMPTE  COURANT', '30003', '03175', '001', '020', '001', 'COMPTE D ENTREPRISE', '30003', '00000013419', '4242,420', 'EUR', '10', '27/01/93', '31/12/99', '10');
  END LOOP;
END;

我可能需要在某处添加SELECT。

或者可能有更好的方法来生成这些ID ...

3 个答案:

答案 0 :(得分:2)

您可以使用递归cte生成数字,然后在其中一列中使用concatenate

INSERT INTO PRESTATION 
  (ID_DEMANDE, ID_PRESTATION, CODE_PRODUCTEUR_UNICITE_PRESTA, SELECTION, ID_RUBRIQUE, LIBELLE_CONTRAT, CODE_PRODUCTEUR_ENTITE_JURIDIQ, GUICHET_GESTIONNAIRE, CODE_SOURCE, CODE_PRODUIT, CODE_SOUS_PRODUIT, LIBELLE_PRODUIT, CODE_BANQUE, NUMERO_CLIENT, MONTANT, DEVISE, RESEAU_DISTRIBUTION, DATE_OUVERTURE, DATE_FERMETURE, ROLE) 
with nums(num) as (select 100 from dual
                   union all
                   select num+1 from nums where num < 400)
SELECT 'DO20161220160056000592', CONCAT('0000000317501820134', CAST(num AS VARCHAR(3))), '00020', 'O', 0, 'COMPTE  COURANT', '30003', '03175', '001', '020', '001', 'COMPTE D ENTREPRISE', '30003', '00000013419', '4242,420', 'EUR', '10', '27/01/93', '31/12/99', '10'
FROM nums

答案 1 :(得分:2)

如果您需要在表格中插入许多行,其中只有一些字段不同,您可以使用以下内容:

SQL> create table yourTable ( col1 varchar2(20), col2 varchar2(20), col3 varchar2(20));

Table created.

SQL> insert into yourTable ( col1, col2, col3)
  2    select 'fixedValue', 'fixedValue2', 100 + level
  3    from dual
  4    connect by level <= 10;

10 rows created.

SQL> select * from yourTable;

COL1                 COL2                 COL3
-------------------- -------------------- --------------------
fixedValue           fixedValue2          101
fixedValue           fixedValue2          102
fixedValue           fixedValue2          103
fixedValue           fixedValue2          104
fixedValue           fixedValue2          105
fixedValue           fixedValue2          106
fixedValue           fixedValue2          107
fixedValue           fixedValue2          108
fixedValue           fixedValue2          109
fixedValue           fixedValue2          110

10 rows selected.

SQL>

答案 2 :(得分:2)

试试这个:

BEGIN
  FOR i IN 1..400 LOOP
      INSERT INTO PRESTATION 
      (ID_DEMANDE, ID_PRESTATION, CODE_PRODUCTEUR_UNICITE_PRESTA, SELECTION, ID_RUBRIQUE, LIBELLE_CONTRAT, CODE_PRODUCTEUR_ENTITE_JURIDIQ, GUICHET_GESTIONNAIRE, CODE_SOURCE, CODE_PRODUIT, CODE_SOUS_PRODUIT, LIBELLE_PRODUIT, CODE_BANQUE, NUMERO_CLIENT, MONTANT, DEVISE, RESEAU_DISTRIBUTION, DATE_OUVERTURE, DATE_FERMETURE, ROLE) 
      VALUES 
      ('DO20161220160056000592', '0000000317501820134'||''||i||'', '00020', 'O', 0, 'COMPTE  COURANT', '30003', '03175', '001', '020', '001', 'COMPTE D ENTREPRISE', '30003', '00000013419', '4242,420', 'EUR', '10', '27/01/93', '31/12/99', '10');
  END LOOP;
END;

演示:

SQL> BEGIN
  FOR i IN 1..4 LOOP
      dbms_output.put_line ('0000000317501820134'||''||i||'');
  END LOOP;
 END;    
 /
00000003175018201341
00000003175018201342
00000003175018201343
00000003175018201344

PL/SQL procedure successfully completed.