【问题标题】:SQL INSERT INTO simultaneously in 2 tables in apex oracleSQL INSERT INTO 同时在顶点 oracle 的 2 个表中
【发布时间】:2020-01-11 01:34:21
【问题描述】:

我有一个脚本: 我在test2中写数据!

INSERT INTO test2 (val)
SELECT    SUBSTR (:P1_FIRST, 1, 1)
      || TO_CHAR (
            (  TO_NUMBER (REGEXP_SUBSTR (:P1_FIRST, '\d+$'))
             + LEVEL
             - 1))
         AS val
 FROM dual
 CONNECT BY LEVEL <=
                TO_NUMBER (
                   REGEXP_SUBSTR (:P1_LAST, '\d+$'))
             - TO_NUMBER (
                   REGEXP_SUBSTR (:P1_FIRST, '\d+$'))
             + 1;

我想自己把它写在另一个表中。我想在一个请求中把它全部写下来

INSERT INTO test3 (val,data_area,data_add )
SELECT    SUBSTR (:P1_FIRST, 1, 1)
      || TO_CHAR (
            (  TO_NUMBER (REGEXP_SUBSTR (:P1_FIRST, '\d+$'))
             + LEVEL
             - 1))
         AS val,
        (select data_area from SEC_USERS_LIST where login =   LOWER(:APP_USER)) as data_area, 
          (select to_char(sysdate, 'dd.mm.yyyy hh24:mi:ss') "Right Now" from dual )  as data_add 
 FROM dual
 CONNECT BY LEVEL <=
                TO_NUMBER (
                   REGEXP_SUBSTR (:P1_LAST, '\d+$'))
             - TO_NUMBER (
                   REGEXP_SUBSTR (:P1_FIRST, '\d+$'))
             + 1;

【问题讨论】:

  • 为什么要将当前日期作为字符串插入?使用DATE 列并插入SYSDATE

标签: sql oracle oracle11g oracle-apex sql-insert


【解决方案1】:

您可以尝试使用Oracle INSERT ALL syntax

多表插入中,您将从子查询评估返回的行中派生的计算行插入到一个或多个表中。

所有 into_clause

指定ALL 后跟多个insert_into_clauses 以执行无条件的多表插入。 Oracle 数据库对子查询返回的每一行执行每个 insert_into_clause 一次。

考虑:

INSERT ALL
INTO test3 (val,data_area,data_add) VALUES (x_val, x_data_area, x_data_add)
INTO test2 (val) VALUES (x_val)
SELECT    SUBSTR (:P1_FIRST, 1, 1)
      || TO_CHAR (
            (  TO_NUMBER (REGEXP_SUBSTR (:P1_FIRST, '\d+$'))
             + LEVEL
             - 1))
         AS x_val,
        (select data_area from SEC_USERS_LIST where login =   LOWER(:APP_USER)) as x_data_area, 
        (select to_char(sysdate, 'dd.mm.yyyy hh24:mi:ss') "Right Now" from dual )  as x_data_add 
 FROM dual
 CONNECT BY LEVEL <=
     TO_NUMBER (REGEXP_SUBSTR (:P1_LAST, '\d+$'))
     - TO_NUMBER (REGEXP_SUBSTR (:P1_FIRST, '\d+$'))
     + 1
;

注意:就问题而言,不需要返回当前日期的内联子查询,可以简化为:

to_char(sysdate, 'dd.mm.yyyy hh24:mi:ss') as x_data_add

代替:

(select to_char(sysdate, 'dd.mm.yyyy hh24:mi:ss') "Right Now" from dual )  as x_data_add

更重要的是,正如Thomas Tschernich 所评论的:如果x_data_add 的数据类型为DATE,则不需要强制转换,您可以简单地在表列上使用默认值并从INSERT 中完全省略它

【讨论】:

  • 更重要的是,如果 x_data_add 的数据类型为 DATE,则不需要强制转换,您可以简单地在表列上使用默认值,并从 INSERT 中完全省略它。
  • 同样,“INSERT ALL”会导致错误“ORA-06550: line 1, column 144: PL / SQL: ORA-00905: missing keyword”
  • @ThomasTschernich:是的,好点(虽然 OP 没有告诉目标数据类型),我将它添加到我的答案中。谢谢!
  • @AndriiHavrylyak:查询中有错字,INSERT 被重复多次,我刚刚更正了。它现在对你有用吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-24
  • 1970-01-01
  • 2021-11-16
  • 2023-02-09
相关资源
最近更新 更多