【问题标题】:Oracle PL/SQL: syntax error when using a variable within SAMPLE clauseOracle PL/SQL:在 SAMPLE 子句中使用变量时出现语法错误
【发布时间】:2011-10-03 12:25:37
【问题描述】:

以下 PL/SQL 块有效:

DECLARE
    r TABLE1%ROWTYPE;
BEGIN
    SELECT * INTO r FROM TABLE1 SAMPLE(1) WHERE ROWNUM = 1;
END;

但是,当我尝试用 SAMPLE 子句中的变量替换文字时,Oracle 返回语法错误:

DECLARE
    s NUMBER;
    r TABLE1%ROWTYPE;
BEGIN
    s := 1;
    SELECT * INTO r FROM TABLE1 SAMPLE(s) WHERE ROWNUM = 1;
END;

ORA-06550: line 6, column 39:
PL/SQL: ORA-00933: SQL command not properly ended

我做错了什么?

我正在使用 Oracle 10 和 SQL Developer。

(这些是简化的示例。我在实践中实际尝试做的是优化随机行的选择,其中 SAMPLE 百分比将根据表中的当前行数动态计算。所以我不能使用文字,我需要一个变量来分配计算的结果。)

【问题讨论】:

    标签: oracle plsql oracle10g


    【解决方案1】:

    SAMPLE synthax 需要一个数字。您可以使用动态 SQL 来构建动态查询,例如使用 ref cursor:

    SQL> CREATE TABLE table1 AS
      2  SELECT ROWNUM ID, rpad(ROWNUM, 10, 'x') DATA 
      3    FROM dual CONNECT BY LEVEL <= 1000;
    
    Table created
    
    SQL> DECLARE
      2     l_cur SYS_REFCURSOR;
      3     l_row table1%ROWTYPE;
      4     l_pct NUMBER := 50;
      5  BEGIN
      6     OPEN l_cur
      7        FOR 'SELECT * FROM table1 SAMPLE('||l_pct||') WHERE rownum = 1';
      8     LOOP
      9        FETCH l_cur INTO l_row;
     10        EXIT WHEN l_cur%NOTFOUND;
     11        dbms_output.put_line(l_row.id);
     12     END LOOP;
     13  END;
     14  /
    
    3
    
    PL/SQL procedure successfully completed
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-20
      • 1970-01-01
      • 2012-09-28
      • 1970-01-01
      • 2016-08-28
      • 2017-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多