Oracle PL / SQL - 在SELECT语句中参数化SAMPLE子句

时间:2018-04-12 19:03:40

标签: oracle plsql

我有一个与Oracle相关的问题。我希望从视图或表中选择一个随机样本,以便SAMPLE子句被参数化。

鉴于下表。

 CREATE TABLE FOO AS
        (SELECT     LEVEL AS ID
                   FROM DUAL
                    CONNECT BY LEVEL < 101
        );

以下构造使用SAMPLE子句中的文字参数。

SELECT ID FROM FOO SAMPLE (15); -- this will get a 15% sample

然而,

DECLARE
    N NUMBER := 50;
BEGIN
    FOR r IN
    ( SELECT ID FROM FOO SAMPLE (N) -- <<< this won't work
    )
    LOOP
        DBMS_OUTPUT.PUT_LINE( r.ID );
    END LOOP;
END;

当我们在SAMPLE子句中放入参数时,此块会爆炸。如果我们把它写成文字,它编译和工作。

但如果它是变量,我会得到以下结果:

ORA-06550: line 5, column 33:
PL/SQL: ORA-00933: SQL command not properly ended

有什么想法吗?我正在绞尽脑汁,语法被打破了。

1 个答案:

答案 0 :(得分:1)

语法不允许变量存在。

一种解决方法是动态构造SELECT语句。例如:

declare
  l_rc sys_refcursor;
  n number := 5;
begin
  -- replace "mtl_system_items" with your table...
  open l_rc FOR 'select count(*) from mtl_system_items sample (' || n || ')';
  -- replace call to RETURN_RESULT with whatever processing you want
  DBMS_SQL.RETURN_RESULT(l_rc);
end;