我有一个与Oracle相关的问题。我希望从视图或表中选择一个随机样本,以便SAMPLE子句被参数化。
鉴于下表。
CREATE TABLE FOO AS
(SELECT LEVEL AS ID
FROM DUAL
CONNECT BY LEVEL < 101
);
以下构造使用SAMPLE子句中的文字参数。
SELECT ID FROM FOO SAMPLE (15); -- this will get a 15% sample
然而,
DECLARE
N NUMBER := 50;
BEGIN
FOR r IN
( SELECT ID FROM FOO SAMPLE (N) -- <<< this won't work
)
LOOP
DBMS_OUTPUT.PUT_LINE( r.ID );
END LOOP;
END;
当我们在SAMPLE
子句中放入参数时,此块会爆炸。如果我们把它写成文字,它编译和工作。
但如果它是变量,我会得到以下结果:
ORA-06550: line 5, column 33:
PL/SQL: ORA-00933: SQL command not properly ended
有什么想法吗?我正在绞尽脑汁,语法被打破了。
答案 0 :(得分:1)
语法不允许变量存在。
一种解决方法是动态构造SELECT
语句。例如:
declare
l_rc sys_refcursor;
n number := 5;
begin
-- replace "mtl_system_items" with your table...
open l_rc FOR 'select count(*) from mtl_system_items sample (' || n || ')';
-- replace call to RETURN_RESULT with whatever processing you want
DBMS_SQL.RETURN_RESULT(l_rc);
end;