fre*_*oft 4 oracle types plsql record
我可以从游标定义类型吗?
目前我必须编写以下内容以便从某些表字段创建记录变量:
declare
cursor cur
is
select
f_1,
f_2,
f_3,
f_4
from
mytable
where
1=0;
myvar cur%rowtype; -- use the cursor to declare myvar
begin
null;
end;
Run Code Online (Sandbox Code Playgroud)
我想写这样的东西:
declare
cursor cur
is
select
f_1,
f_2,
f_3,
f_4
from
mytable
where
1=0;
type mytype is cur%rowtype; -- declare "mytype" from cursor
myvar mytype; -- use "mytype" to declare "myvar"
begin
null;
end;
Run Code Online (Sandbox Code Playgroud)
这在这个简单的例子中看起来并不有用,但在实际问题中可能有用.
另一种方法是手动创建记录类型:
declare
type mytype is record -- declare "mytype"
(
f_1 mytable.f_1%type,
f_2 mytable.f_2%type,
f_3 mytable.f_3%type,
f_4 mytable.f_4%type
);
myvar mytype; -- use "mytype" to declare "myvar"
begin
null;
end;
Run Code Online (Sandbox Code Playgroud)
但它对我来说更脏(我必须重复每个字段名称两次,并且表名称多次).
我可以从游标定义类型吗?
是的,你可以定义你自己的基于cursor_name%rowtype
记录类型的类型(在这种情况下基本上它将是一个同义词),使用subtype
关键字,而不是type
一个.
这是一个例子:
set serveroutput on;
declare
cursor c1 is
select 1 as col1
, 2 as col2
, 3 as col3
from dual;
subtype mytype is c1%rowtype;
l_myvar mytype;
begin
open c1;
fetch c1 into l_myvar;
dbms_output.put(to_char(l_myvar.col1) || ' : ');
dbms_output.put(to_char(l_myvar.col2) || ' : ');
dbms_output.put_line(to_char(l_myvar.col3));
close c1;
end;
Run Code Online (Sandbox Code Playgroud)
结果:
anonymous block completed
1 : 2 : 3
Run Code Online (Sandbox Code Playgroud)