如何在 PL/SQL 中调用以行类型文字作为参数的过程?

How to call a procedure with a rowtype literal as parameter in PL/SQL?

假设我有一个 table 和一个接受 tables 行类型的一个参数的过程:

CREATE TABLE t (a NUMBER, b NUMBER);

CREATE PROCEDURE p (x t%ROWTYPE) IS
BEGIN
  NULL;
END;

我可以使用 rowtype 文字调用该过程,即不显式创建 rowtype 变量(或至少不显式列出和分配它的每个字段)吗?以下两种方法都会产生以下错误:

p(1, 2);
p((1, 2));

PLS-00306: wrong number or types of arguments in call to 'P'

这不是最佳解决方案,因为它 (a) 需要创建一个变量,并且 (b) 不是很漂亮。但至少它有效:

DECLARE
  x t%ROWTYPE;
BEGIN
  SELECT 1, 2 INTO x FROM dual;
  p(x);
END;

我仍然对更好的解决方案感兴趣。

您还可以从游标循环构建记录:

for r in (
    select 1, 2 from dual
)
loop
    p(r);
end loop;

不幸的是 PL/SQL 记录只是简单的结构,不像对象类型那样带有构造函数。 (我希望他们这样做。)