【发布时间】:2021-03-01 21:17:06
【问题描述】:
我正在寻找一种方法来在 Oracle PL/SQL 中使用异构数据定义数据结构,并且我可以在其中迭代值。
不知道是否有可能,就我所见,数组和关联数组等数据结构只允许所有元素属于同一类型。
我的用例是我收到一堆值,必须处理它们并将它们插入到表中。
我想要这样的东西:
DECLARE
type books is record
(title varchar(50) := myvar1,
author varchar(50) := myvar2,
subject varchar(100) := myvar3,
book_id number := myvar4);
BEGIN
FOR item IN ('SELECT * FROM books')
LOOP
/* Here I would access each individual item key and value (title, author...) */
my_function(item.key, item.value)
END LOOP;
END;
请注意,在上面的示例中,我想迭代字段,而不是记录,只有一条记录。
所以我想要一些与 Javascript 中的对象非常相似的东西:
var obj = {
title: 'Romeo and Juliet',
author: 'Some dude',
subject: 'Romance',
book_id: 332764
};
for (const prop in obj) {
console.log(`obj.${prop} = ${obj[prop]}`);
}
这适用于 Oracle 19c。
有没有办法做到这一点?
【问题讨论】:
-
我不确定我是否完全按照您的意愿行事。您可以使用
dbms_sql执行动态查询,描述结果以找出列和数据类型,然后对其进行迭代。但是从您的问题来看,您需要这种复杂程度的东西对我来说并不明显。在您的循环中,您可以简单地引用item.title和item.author(假设title和author是books表中的列)。如果创建books类型的局部变量,同样可以引用variable.title和variable.author。 -
@JustinCave 如果我必须使用
item.title,item.author... 我将不得不重复同样的事情,比如 20 次。有 20 行带有INSERT语句的不同行看起来很难看,我想要 DRY 代码。此外,将来,如果我想插入另一个项目,只需将其添加到结构中并完成。 -
但是你说你需要处理这些值并将它们插入到一个表中。根据值的来源和处理方式,您可能正在寻找动态 SQL。你可以做一个简单的
execute immediate或者你可能需要使用dbms_sql。不过,这不会涉及 PL/SQL 记录,我不确定这是否是必需的。 -
@JustinCave 我明白了,所以在 PL/SQL 中似乎没有简单的方法可以做到这一点:/ 我真的期待会有一个简单的方法。
-
SQL 和 PL/SQL 是强数据类型的,严格遵守数据结构。那是因为数据完整性是首要指令。是的,在向表中插入数据时,这为开发人员增加了一些工作量。但这也意味着在检索数据时,开发人员的工作量会减少。最重要的是,这意味着我们的用户可以依赖数据的稳定性和正确性。
标签: arrays oracle data-structures plsql iterable