[英]How to give a nested table as a default parameter?
我有一个将嵌套表和整数作为参数的函数。
我可以为整数参数创建任何默认参数。 但是对于嵌套表,我只能给出一个空表。
function a return packageName.tOfmyrecord(i in integer:=2,j in integer:=2, k in tableofmyrecord2 package.n) PIPELINED
is
begin
--do its work
end
PLS-00653: 不允许聚合/表函数
我想将返回嵌套表的函数 b 的结果作为默认参数。 此解决方案有效。 但是很麻烦。 我怎样才能做得更好?
function a return packageName.tOfmyrecord PIPELINED
is
c packageName.myrecord;
m_cur SYS_REFCURSOR;
begin
OPEN m_cur FOR select * from table(
packageName.a(2,2, packageName.b)); --I give the 3 default parameters. 2,2 for the integer and the table returns by the funciton b
loop
fetch m_cur into c;
exit when m_cur%notfound;
PIPE ROW(c);
end loop;
close m_cur;
end;
我也试过这个解决方案,但它不起作用。 也许只有一点点改变才能让它起作用——
function a return packageName.a PIPELINED
is
begin
return packagename(2,2,packagename.b);
end;
PLS_00633:流水线函数中的 return 语句不能包含表达式。
在 SQL 范围内创建集合类型:
CREATE TYPE stringlist IS TABLE OF VARCHAR2(20);
然后您可以在 SQL 语句和 PL/SQL 中使用它(而如果您在 PL/SQL 范围内定义集合,那么您只能在 PL/SQL 中使用它)。
然后你可以定义你的包规范:
CREATE PACKAGE test_package IS
FUNCTION test_fn(
a IN INTEGER DEFAULT 1,
b IN stringlist DEFAULT stringlist('a','b','c')
) RETURN stringlist PIPELINED;
END;
/
和包体:
CREATE PACKAGE BODY test_package IS
FUNCTION test_fn(
a IN INTEGER DEFAULT 1,
b IN stringlist DEFAULT stringlist('a','b','c')
) RETURN stringlist PIPELINED
IS
BEGIN
IF b IS NULL THEN
RETURN;
END IF;
FOR i IN 1 .. b.COUNT LOOP
PIPE ROW ( b(i) || a );
END LOOP;
END;
END;
/
并使用默认参数在 SQL 中使用它:
SELECT *
FROM TABLE( test_package.test_fn() );
哪些输出:
\n | COLUMN_VALUE |\n | :----------- |\n | a1 |\n | b1 |\n | c1 |\n
或者提供你自己的论点:
SELECT *
FROM TABLE(
test_package.test_fn(
b => stringlist('d','e','f','g')
)
);
哪些输出:
\n | COLUMN_VALUE |\n | :----------- |\n | d1 |\n | e1 |\n | f1 |\n | g1 |\n
db<> 在这里摆弄
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.