Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在oracle中从表对象中采样数据_Sql_Oracle_Plsql_Oracle11g - Fatal编程技术网

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

Sql 如何在oracle中从表对象中采样数据,sql,oracle,plsql,oracle11g,Sql,Oracle,Plsql,Oracle11g,我试图创建一个程序,我可以通过采样参数,我尝试了许多方法,但失败了 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

我试图创建一个程序,我可以通过采样参数,我尝试了许多方法,但失败了

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子句 物化视图或关键视图的容器表 保存。不能在非关键视图上指定此子句 保存

因此,表函数既不是物化视图的基表、容器表,也不是键保留视图

要返回一些随机行,可以按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\u随机包

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;
/

干杯

您希望此过程的输出是什么。请仅针对您的需求,因为可能有一些简单的解决方案可用。我只需要传递一个值作为过程中的采样参数,我将从表rs中解释moreSELECT*,其中rownum@Tejash实际上我想用样品,因为它会改变结果,更好地代表我的情况,你的更新似乎是一个完全不同的问题,从你发布的第一个。但你的要求还不清楚。我认为您希望使用v_sample参数限制插入mytable的行数。你有没有进一步的标准,比如随机性?