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

Oracle PL/SQL:在SAMPLE子句中使用变量时出现语法错误,oracle,plsql,oracle10g,Oracle,Plsql,Oracle10g,以下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 TABLE

以下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

(这些都是简化的示例。我实际上试图在实践中优化随机行的选择,根据表中当前的行数动态计算样本百分比。因此我不能使用文本,我需要一个变量来分配计算结果。)

需要一个数字。您可以使用动态SQL构建动态查询,例如使用
ref游标

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
SQL>将表1创建为
2选择ROWNUM ID,rpad(ROWNUM,10,'x')数据
3从双连接按级别声明
2当前系统参考光标;
3行表格1%行类型;
4 l_pct编号:=50;
5开始
6开放式l_cur
7表示“从表1样本(“|l|u pct | |”)中选择*,其中rownum=1”;
8环路
9将l_cur放入l_行;
10未找到l_cur%时退出;
11 dbms_输出.put_行(l_行.id);
12端环;
13结束;
14  /
3.
PL/SQL过程已成功完成