Oracle PL / SQL: синтаксическая ошибка при использовании переменной в предложении SAMPLE - PullRequest
2 голосов
/ 03 октября 2011

Работает следующий блок 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.

(Это упрощенные примеры. Что я на самом деле пытаюсь сделать на практике, так эточтобы оптимизировать выбор случайной строки, где процент выборки будет рассчитываться динамически, исходя из текущего числа строк в таблице. Поэтому я не могу использовать литерал, мне нужна переменная, чтобы назначить результат вычисления.)

1 Ответ

5 голосов
/ 03 октября 2011

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...