【问题标题】:Oracle PL/SQL - parameterizing SAMPLE clause in SELECT statementOracle PL/SQL - 在 SELECT 语句中参数化 SAMPLE 子句
【发布时间】:2018-04-12 19:03:39
【问题描述】:

我有一个与 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

有什么想法吗?我在语法被破坏的地方绞尽脑汁。

【问题讨论】:

    标签: oracle plsql


    【解决方案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;
    

    【讨论】:

    • 我试图避免这种情况,但我想我别无选择。感谢您的回答!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 2019-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多