【问题标题】:CAST and CONCAT inside INSERTINSERT 中的 CAST 和 CONCAT
【发布时间】:2016-12-20 15:40:46
【问题描述】:

使用 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...

【问题讨论】:

  • 您的问题?有错误吗?
  • 你可以用更短的'0000000317501820134'||i代替CONCAT('0000000317501820134', CAST(i AS VARCHAR))
  • 您将 number 作为字符串插入(例如 '4242,420')和 date 作为字符串插入(例如'27/01/93') -即使是两位数的年份。我敢打赌,由于设计如此糟糕,您迟早会面临很多问题。

标签: sql oracle plsql


【解决方案1】:

试试这个:

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.

【讨论】:

  • 甜,|| 运算符到底是什么?
  • 这用于连接。您可以使用单词concat||
  • 但是为什么是空字符串''呢?我原以为应该是'''i,以便在数字 i 周围加上引号。
  • @Ellone 只是为了您的理解,Oracle 中没有空字符串这样的概念 - '' 评估为 null。
  • @Boneist - 这取决于一个人对“空字符串”和“null”的定义。在此示例中,'' 实际上表现为一个空字符串。只有在 Oracle 中,一个操作数为“null”的操作的结果不是“null”。使用 Oracle 时最好将'' 有时视为空字符串,有时视为“null”(并不总是以一致的方式)。
【解决方案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>

【讨论】:

    【解决方案3】:

    您可以使用递归 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
    

    【讨论】:

    • 这让我在插入行出现“缺少选择关键字”错误。它应该在哪里? (我正在使用 SQLDeveloper)
    • 递归 cte 在 insert 之后。我改了。
    • 这种方法的优点是一切都在纯 SQL 中完成。 PL/SQL(过程、触发器、函数)只有在普通 SQL 不起作用时才应该使用,而这不是其中一种情况。
    猜你喜欢
    • 1970-01-01
    • 2019-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-25
    • 2019-12-20
    • 2014-12-04
    • 1970-01-01
    相关资源
    最近更新 更多