perl dbi和临时桌子

发布于 2025-02-05 03:47:24 字数 1277 浏览 3 评论 0原文

我正在使用Perl DBI和DB2。

当我运行此代码时:

sub MergePolygonNameTable()
{
   my $table = "THESCHEMA.NAME";

   print "Merging into ${table} table. ", scalar localtime, "\n";
   eval
   {
      $DbHandle->do("
      declare global temporary table session.TEMP_NAME
      (POLICY_MASTER_ID INT
      )
      ;
      ");

      $DbHandle->do("
         CREATE UNIQUE INDEX session.TEMP_NAME_IDX1 ON session.TEMP_NAME
         (POLICY_MASTER_ID ASC
         )");
     $DbHandle->do("
      insert into session.TEMP_NAME
      (POLICY_MASTER_ID
      )
      SELECT pm.ID as POLICY_MASTER_ID
        FROM THESCHEMA.POLICY_MASTER pm

      ");
      $DbHandle->do("
      MERGE INTO THESCHEMA.NAME as t
      USING session.TEMP_NAME as s
         ON t.POLICY_MASTER_ID = s.POLICY_MASTER_ID
      WHEN MATCHED
      ) THEN
      UPDATE SET t.UPDATED_DATETIME = CURRENT_TIMESTAMP
      WHEN NOT MATCHED THEN
      INSERT
      (POLICY_MASTER_ID
      ) VALUES
      (s.POLICY_MASTER_ID
      )
        ;
      ");
   };
   if ($@)
   {
      print STDERR "ERROR: $ExeName: Cannot merge into ${table} table.\n$@\n";
      ExitProc(1);
   }
}

问题是theschema.name运行后是空的。

我怀疑DBI在DO()之后都不会保留临时表的内容。但是DBI不允许我在do()中提出多个语句。

如何在DBI中获得临时桌子?

I am using the Perl DBI and DB2.

When I run this code:

sub MergePolygonNameTable()
{
   my $table = "THESCHEMA.NAME";

   print "Merging into ${table} table. ", scalar localtime, "\n";
   eval
   {
      $DbHandle->do("
      declare global temporary table session.TEMP_NAME
      (POLICY_MASTER_ID INT
      )
      ;
      ");

      $DbHandle->do("
         CREATE UNIQUE INDEX session.TEMP_NAME_IDX1 ON session.TEMP_NAME
         (POLICY_MASTER_ID ASC
         )");
     $DbHandle->do("
      insert into session.TEMP_NAME
      (POLICY_MASTER_ID
      )
      SELECT pm.ID as POLICY_MASTER_ID
        FROM THESCHEMA.POLICY_MASTER pm

      ");
      $DbHandle->do("
      MERGE INTO THESCHEMA.NAME as t
      USING session.TEMP_NAME as s
         ON t.POLICY_MASTER_ID = s.POLICY_MASTER_ID
      WHEN MATCHED
      ) THEN
      UPDATE SET t.UPDATED_DATETIME = CURRENT_TIMESTAMP
      WHEN NOT MATCHED THEN
      INSERT
      (POLICY_MASTER_ID
      ) VALUES
      (s.POLICY_MASTER_ID
      )
        ;
      ");
   };
   if ($@)
   {
      print STDERR "ERROR: $ExeName: Cannot merge into ${table} table.\n$@\n";
      ExitProc(1);
   }
}

The problem is that the THESCHEMA.NAME is empty after the run.

I suspect that DBI does not keep the contents of the temporary table after the do(). But the DBI does not allow me to put more than one statement in a do().

How do I get temporary tables to work in the DBI?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

我偏爱纯白色 2025-02-12 03:47:24

在提交删除行上的声明全局临时表语句
使用在提交preserve行选项上使用在显式或隐式commit时保留行。

像这样:

      declare global temporary table session.TEMP_NAME
      (POLICY_MASTER_ID INT
      )
      ON COMMIT PRESERVE ROWS
      ;

The ON COMMIT DELETE ROWS is the default option of the DECLARE GLOBAL TEMPORARY TABLE statement.
Use the ON COMMIT PRESERVE ROWS option to preserve the rows upon explicit or implicit COMMIT.

Like this:

      declare global temporary table session.TEMP_NAME
      (POLICY_MASTER_ID INT
      )
      ON COMMIT PRESERVE ROWS
      ;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文