CREATE TYPE whatever_rectype IS OBJECT (col1 integer, etc..);
CREATE TYPE whatever_tabtype IS TABLE OF whatever_rectype;
CREATE OR REPLACE FUNCTION whatever (paramA IN varchar2)
RETURN whatever_tabtype PIPELINED
AS
var_sql varchar2(32767);
rec_results whatever_rectype;
BEGIN
var_sql := '
SELECT *
FROM TABLE_A A';
IF paramA IS NOT NULL
THEN
var_sql := var_sql ||',
(SELECT whatever_rectype(col1,col2,etc..)
FROM TABLE_B
) B';
END IF;
var_sql := var_sql || '
WHERE 1=1';
IF paramA IS NOT NULL
THEN
var_sql := var_sql ||'
AND A.key = B.key';
END IF;
OPEN cur_whatever FOR var_sql;
FETCH cur_whatever INTO rec_results;
WHILE cur_whatever%FOUND
LOOP
PIPE ROW(rec_results);
FETCH cur_whatever INTO rec_results;
END LOOP;
END;
2条答案
按热度按时间eivgtgni1#
Oracle不允许有条件地包含表。
一个选项可能是始终连接
TABLE_B
并在连接条件中过滤参数(作为绑定参数):这与
:paramA
绑定变量为NULL
时不太一样,TABLE_B
列将包含在输出中,但这些TABLE_B
列的值将全部为NULL
。wqsoz72f2#
如果你是以编程方式确定对象名称,你需要使用动态SQL。把动态SQL放在一起并简单地执行,弄清楚你想要如何将数据返回到调用程序或客户端需要更多的思考,因为有多个选项。下面是一个:
执行:
在最近的版本中,你可以省去TABLE关键字: