如何从oracle中的表对象中采样数据

问题描述 投票:0回答:2

我正在尝试创建一个可以传递

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;
sql oracle plsql oracle11g
2个回答
0
投票

来自文档

您可以在基表的查询中指定 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    

请注意,这必须对整个数据集进行排序。如果这个很大,可能需要一段时间!


0
投票

我认为您可以使用以下代码,该代码在 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;
/
© www.soinside.com 2019 - 2024. All rights reserved.