【发布时间】:2022-01-12 09:48:06
【问题描述】:
在 Oracle 19c DB 上,我需要对客户进行抽样,同时保持统一分布以模拟客户的移动。 有(故意)多行具有相同的客户,但将 adderssses 更改为模型移动。因此,对于采样,我需要先分组。
现在我得到的是,对于 SAMPLE 子句,源必须具体化。因此,在 PL/SQL 脚本中,我生成了一个临时表,之后我想将其与 SAMPLE 一起使用。 但是之后即使是简单的 SELECT INTO 也不起作用。
set SERVEROUT on;
DECLARE
v_cust_name VARCHAR2(100);
cmd_creation VARCHAR2(500):='CREATE PRIVATE TEMPORARY TABLE ORA$PTT_temp_cust AS(
SELECT cust_id, MIN(name) as name
FROM customers
GROUP BY cust_id)';
BEGIN
EXECUTE IMMEDIATE cmd_creation;
dbms_output.put_line('temp created');
SELECT name
INTO v_cust_name
FROM (SELECT *
FROM ORA$PTT_temp_cust SAMPLE(5))
WHERE ROWNUM =1;
EXECUTE IMMEDIATE 'DROP TABLE ORA$PTT_temp_cust';
dbms_output.put_line('temp dropped');
END;
我得到的是这个
ORA-06550: line 15, column 18:
PL/SQL: ORA-00942: table or view does not exist
表被创建。当我只为创建执行 String 而没有其他事情时,我已经走到了这一步。然后我可以从不同的点访问所需脚本中的表。 这和编译有关系吗?有什么不同的方法可以解决这个问题吗?
【问题讨论】:
-
你执行了 nothing PL/SQL 没有编译。
-
此外,没有理由即时创建“临时”表。不要像对待 mssql 一样对待 oracle。查看global temporary table
-
OP 正在使用 Oracle 中引入的
PRIVATE TEMPORARY表 @EdStevens 来满足人们过去在其他数据库中这样做的习惯;) -
@MarmiteBomber - 是的,但这并不是最好的方法。如果 OP 将创建一个 GTT(一次),那么他与 PT 表的问题将不复存在,并且他不必求助于邪恶的动态 SQL 和所有其他随之而来的问题。
-
@EdStevens 将尝试使用 GTT,感谢您的提示!
标签: sql oracle plsql oracle19c