Oracle PL/SQL:在 SAMPLE 子句中使用变量时出现语法错误

Posted

技术标签:

【中文标题】Oracle PL/SQL:在 SAMPLE 子句中使用变量时出现语法错误【英文标题】:Oracle PL/SQL: syntax error when using a variable within SAMPLE clause 【发布时间】: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 百分比将根据表中的当前行数动态计算。所以我不能使用文字,我需要一个变量来分配计算的结果。)

【问题讨论】:

【参考方案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

【讨论】:

以上是关于Oracle PL/SQL:在 SAMPLE 子句中使用变量时出现语法错误的主要内容,如果未能解决你的问题,请参考以下文章

oracle 形式:pl/sql 中 where 子句中的 max 子句

变量作为 Oracle PL/SQL 中 where 子句中的列名

如何在 select 的 where 子句中替换 oracle pl/sql 变量

Oracle PL/SQL - 如何在异常子句的单独表中捕获坏数据?

Oracle pl sql 动态使用子句

Oracle PL/SQL SELECT INTO 子句认为它需要另一个 INTO