2011-10-03 9 views
2

内で次のPL/SQLブロックの作品を変数を使用している場合:OracleのPL/SQL:構文エラーSAMPLE句

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の割合が動的に計算されるランダムな行の選択を最適化しています。私はリテラルを使用できません。計算の結果を割り当てるには変数が必要です)。

答えて

5

SAMPLE synthaxには数字が必要です。たとえば、ref cursorという動的クエリを作成するために動的SQLを使用できます。

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