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 变量