使用表函数对每一行数据执行操作



我有一个查询,根据传入的Number ID(参数)返回多条记录。我想创建一个表函数,在"num_id"(number datatype)作为参数,传递给查询,对查询结果的每条记录执行操作,并返回"mainkey";(字符数据类型)作为记录。

我找到的每个教程都让我在创建函数之前创建一个对象和该对象的表。我不太明白这个的用法。

我也不明白我会在哪里添加我的原始查询(从DB检索记录的查询)。

谁能告诉我怎么才能做到这一点?我可以对每条记录执行操作

这是我到目前为止的工作:

-- create object
CREATE TYPE test_t AS OBJECT
(mainKey char);
-- create collection type:
CREATE TYPE testSet_t AS TABLE OF test_t;
--Create table function: "test_tf"
CREATE OR REPLACE FUNCTION test_tf 
(num_id IN NUMBER)
RETURN char
IS
z char;
BEGIN
SELECT one_column_name from testSet_t
END;

我曾经能够在每个记录中使用游标和for循环执行操作…但在这里,我只能将数据打印为dbms_output。因此,我需要能够制作一些唱片。下面是光标的尝试:

DECLARE
cursor cur_test IS
<my select statement which returns 4 records>;
BEGIN
FOR ln_index IN cur_test
LOOP
DBMS_OUTPUT.put_line(ln_index.one_column_name);
DBMS_OUTPUT.put_line(ln_index.another_column_name);
END LOOP;
END;

上面的代码工作良好,打印到dbms输出…但是我需要能够对每行中的数据执行操作,并返回记录而不是DBMS输出。

对于Oracle 19c(19.7)及以上版本,您可以使用SQL_MACRO来创建表值函数,可以用作参数化视图。

create table t(id, val)
as
select level, mod(level, 4)
from dual
connect by level < 10
create function f_do_smth(
p1 int, p2 in int
) return timestamp
is
begin
/*To demonstrate some work*/
dbms_session.sleep(trunc(p1+p2)/10);
return systimestamp;
end;/
create function f_get_t_byval (
p_val in int
) return varchar2
sql_macro(table)
is
begin
return '
select
t.*,
f_do_smth(
p1 => t.id,
/*Here we use a parameter as a parameter
for processing, not only as a filter*/
p2 => f_get_t_byval.p_val
) as processed_result
from t
where val >= f_get_t_byval.p_val
';
end;/
select *
from f_get_t_byval(p_val => 2)
PROCESSED_RESULT16-NOV-22 22.18.31.16493900016-NOV-22 22.18.31.66820300016-NOV-22 22.18.32.50826900016-NOV-22 22.18.33.468175000

最新更新