oracle - 编写一个读取特定表并根据读取的表填充另一个表的函数
问题描述
我想要做的是通过一个名为 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;
解决方案
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 块中调用。这有(至少)两个原因:
- SQL 中没有布尔数据类型。布尔数据类型严格来说是一种 plsql数据类型。
- SQL 调用的函数不能执行 DML。
上面引用的小提琴还包含每个示例以及通过 SQL 和 plsql 调用时会发生什么。
推荐阅读
- xslt - 在 net core (net 5) 上使用 XSLT 2.0 文件进行 schematron 验证
- r - R管道工api在控制台中工作,但不适用于systemd
- c++ - 有没有办法覆盖 Font.Position 增量以使它们更小(小于 5 pt)?使用 VBA 还是其他方式?
- javascript - 在新标签页中打开链接,抓取,转到上一页
- django - 在本地运行服务器时,RelatedObjectDoesNotExist 在 /login/
- javascript - 为什么我的闭包内的函数效果不持久?
- c# - 试图在 C# 中查找元素我做错了什么
- ios - 如何从我的标题中删除重复的空格?
- c# - ASP.NET MVC 5:在整个会话中保持共享视图单选按钮选择/值
- php - 如何将 symfony 应用程序连接到 Azure redis 缓存?