Oracle 是否允许您简单地为 RECORD 提供预期的数据类型而无需在过程调用中声明记录?
Does Oracle Allow you to simply supply the expected data types for a RECORD without Declaring the Record within a Procedure Call?
与此 中完成的工作类似,我很想知道是否可以对复合数据类型执行类似的操作。
我正在尝试但从未见过它起作用的示例。
/* Is it possible somehow to instead do THIS? */
tst_proc_rec_type(p_rec => (sys.odcivarchar2list('dan','bob')
, sys.odcivarchar2list('anderson','bebop'))
);
出于某种原因,我一直回到这个概念,多年来我从未见过让它发挥作用的方法......很可能是因为它根本不可能,但我决定伸出援手对社区希望也许这是可能的,也许我只是做错了。 (不会是第一次)。
工作代码示例和显示我正在尝试执行的更改代码。
DECLARE
TYPE t_tst_rec IS RECORD (
fname sys.odcivarchar2list,
lname sys.odcivarchar2list
);
iamrecord t_tst_rec; /* Declare record of type t_tst_rec */
PROCEDURE tst_proc_rec_type(p_rec t_tst_rec)
IS
BEGIN
FOR i IN 1..p_rec.lname.COUNT
LOOP
dbms_output.put_line(p_rec.lname(i) ||', ' || p_rec.fname(i));
END LOOP;
END;
BEGIN
iamrecord.fname := sys.odcivarchar2list('dan','bob');
iamrecord.lname := sys.odcivarchar2list('anderson','bebop');
tst_proc_rec_type(p_rec => iamrecord
);
/* Is it possible somehow to instead do THIS? */
-- tst_proc_rec_type(p_rec => (sys.odcivarchar2list('dan','bob')
-- , sys.odcivarchar2list('anderson','bebop'))
-- );
END;
查看实际效果。
您需要处理对象类型才能拥有此类构造函数。简单的记录类型没有这种能力。例如,以下将起作用。
CREATE OR REPLACE TYPE t_tst_rec AS OBJECT
(
fname sys.odcivarchar2list,
lname sys.odcivarchar2list,
CONSTRUCTOR FUNCTION t_tst_rec
(
fname sys.odcivarchar2list,
lname sys.odcivarchar2list
) RETURN SELF AS RESULT
);
CREATE OR REPLACE TYPE BODY t_tst_rec AS
CONSTRUCTOR FUNCTION t_tst_rec
(
fname sys.odcivarchar2list,
lname sys.odcivarchar2list
) RETURN SELF AS RESULT IS
BEGIN
self.fname := fname;
self.lname := lname;
RETURN;
END t_tst_rec;
END;
/
DECLARE
iamrecord t_tst_rec; /* Declare record of type t_tst_rec */
PROCEDURE tst_proc_rec_type(p_rec t_tst_rec) IS
BEGIN
FOR i IN 1 .. p_rec.lname.count LOOP
dbms_output.put_line(p_rec.lname(i) || ', ' || p_rec.fname(i));
END LOOP;
END;
BEGIN
tst_proc_rec_type(t_tst_rec(sys.odcivarchar2list('dan', 'bob')
,sys.odcivarchar2list('anderson', 'bebop')));
END;
/
与此
我正在尝试但从未见过它起作用的示例。
/* Is it possible somehow to instead do THIS? */
tst_proc_rec_type(p_rec => (sys.odcivarchar2list('dan','bob')
, sys.odcivarchar2list('anderson','bebop'))
);
出于某种原因,我一直回到这个概念,多年来我从未见过让它发挥作用的方法......很可能是因为它根本不可能,但我决定伸出援手对社区希望也许这是可能的,也许我只是做错了。 (不会是第一次)。
工作代码示例和显示我正在尝试执行的更改代码。
DECLARE
TYPE t_tst_rec IS RECORD (
fname sys.odcivarchar2list,
lname sys.odcivarchar2list
);
iamrecord t_tst_rec; /* Declare record of type t_tst_rec */
PROCEDURE tst_proc_rec_type(p_rec t_tst_rec)
IS
BEGIN
FOR i IN 1..p_rec.lname.COUNT
LOOP
dbms_output.put_line(p_rec.lname(i) ||', ' || p_rec.fname(i));
END LOOP;
END;
BEGIN
iamrecord.fname := sys.odcivarchar2list('dan','bob');
iamrecord.lname := sys.odcivarchar2list('anderson','bebop');
tst_proc_rec_type(p_rec => iamrecord
);
/* Is it possible somehow to instead do THIS? */
-- tst_proc_rec_type(p_rec => (sys.odcivarchar2list('dan','bob')
-- , sys.odcivarchar2list('anderson','bebop'))
-- );
END;
查看实际效果。
您需要处理对象类型才能拥有此类构造函数。简单的记录类型没有这种能力。例如,以下将起作用。
CREATE OR REPLACE TYPE t_tst_rec AS OBJECT
(
fname sys.odcivarchar2list,
lname sys.odcivarchar2list,
CONSTRUCTOR FUNCTION t_tst_rec
(
fname sys.odcivarchar2list,
lname sys.odcivarchar2list
) RETURN SELF AS RESULT
);
CREATE OR REPLACE TYPE BODY t_tst_rec AS
CONSTRUCTOR FUNCTION t_tst_rec
(
fname sys.odcivarchar2list,
lname sys.odcivarchar2list
) RETURN SELF AS RESULT IS
BEGIN
self.fname := fname;
self.lname := lname;
RETURN;
END t_tst_rec;
END;
/
DECLARE
iamrecord t_tst_rec; /* Declare record of type t_tst_rec */
PROCEDURE tst_proc_rec_type(p_rec t_tst_rec) IS
BEGIN
FOR i IN 1 .. p_rec.lname.count LOOP
dbms_output.put_line(p_rec.lname(i) || ', ' || p_rec.fname(i));
END LOOP;
END;
BEGIN
tst_proc_rec_type(t_tst_rec(sys.odcivarchar2list('dan', 'bob')
,sys.odcivarchar2list('anderson', 'bebop')));
END;
/