首页 > 解决方案 > 编写一个读取特定表并根据读取的表填充另一个表的函数

问题描述

我想要做的是通过一个名为 transit 的表读取并基于该表,我想填充 ord & ord 2,如果函数继续执行并且没有问题,它将返回 true

CREATE OR REPLACE FUNCTION new_func
  RETURN boolean
IS 
BEGIN
   INSERT INTO ORD(ordernum,cnum,snum,rec,ship,typ)
    SELECT ordernum,cnum,snum,rec,ship,typ
    FROM TRANSIT;

INSERT INTO ORD2(ordernum,cnum,snum,rec,ship,typ)
    SELECT ordernum,cnum,snum,rec,ship,typ
    FROM TRANSIT
    return true;
    
END;


标签: oracleplsqlstored-functions

解决方案


Oracle 为这种类型的操作提供了一个方便的语句:INSERT ALL。这允许只用一个语句将行插入到多个表中:(请参见此处的示例小提琴

   insert all 
       into ord(ordernum,cnum,snum,rec,ship,typ)
          values(ordernum,cnum,snum,rec,ship,typ)
          
       into ord2(ordernum,cnum,snum,rec,ship,typ)
          values(ordernum,cnum,snum,rec,ship,typ)  
          
       select ordernum,cnum,snum,rec,ship,typ
         from transit; 

在上面的每一行都将被复制到两个表中。然而,这不是必需的。上面提到的小提琴在偶数和奇数 ordernum 之间拆分表,但拆分可以是任何结果为真或假的表达式。


最初我的回答就是以上。但是阅读评论很明显,OP可能会受益于看到为什么这应该是一个过程而不是一个函数的例子。(任何需要函数的人都可以。)
作为开发人员,我自动假设可以直接从 SQL 调用函数。在这种情况下,这是不正确的。此函数只能从 plsql 块中调用。这有(至少)两个原因:

  1. SQL 中没有布尔数据类型。布尔数据类型严格来说是一种 plsql数据类型。
  2. SQL 调用的函数不能执行 DML

上面引用的小提琴还包含每个示例以及通过 SQL 和 plsql 调用时会发生什么。


推荐阅读