我正在尝试创建一个可以传递
sampling
参数的过程,我尝试了很多方法但失败了......
create or replace PROCEDURE proc_sampling (
v_sample NUMBER
) AS
BEGIN
-- USE SAMPLE PARAMETER (v_sample) TO SAMPLE THE BELOW SUB-QUERY
FOR i IN (
SELECT DISTINCT
*
FROM
t1,
t2,
t3
WHERE
t1.id=t2.id
and t2.fid=t3.fid
) LOOP
BEGIN
INSERT INTO mytable (
x,y,z
) VALUES (
v1,v2,v3
);
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
END LOOP;
COMMIT;
END;
来自文档:
您可以在基表的查询中指定 SAMPLE 子句, 物化视图的容器表,或者是关键视图 保存。您不能在非关键视图上指定此子句 保存。
所以表函数既不是基表,也不是物化视图的容器表,也不是键保留视图。
要返回一些随机行,您可以
order by dbms_random.value
然后获取前 N 行:
select *
from table (
cast (
multiset (
select level
from dual
connect by level <= 10
) as sys.odcivarchar2list
)
)
order by dbms_random.value
fetch first 3 rows only;
COLUMN_VALUE
6
2
10
请注意,这必须对整个数据集进行排序。如果这个很大,可能需要一段时间!
我认为您可以使用以下代码,该代码在 Oracle 中使用
DBMS_RANDOM
包:
CREATE OR REPLACE PROCEDURE PROC_SAMPLING (
V_SAMPLE NUMBER
) AS
BEGIN
-- USE SAMPLE PARAMETER (v_sample) TO SAMPLE THE BELOW SUB-QUERY
BEGIN
INSERT INTO MYTABLE (X, Y, Z)
SELECT
<your_related_cols>
FROM
(
SELECT DISTINCT
<your_related_cols>,
ROW_NUMBER() OVER(ORDER BY DBMS_RANDOM.VALUE()) AS RN
FROM
T1 JOIN T2 ON T1.ID = T2.ID
JOIN T3 ON T2.FID = T3.FID
)
WHERE RN <= 20;
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
COMMIT;
END;
/