如何将单个列中的值存储到 oracle 中的单个变量中?
Posted
技术标签:
【中文标题】如何将单个列中的值存储到 oracle 中的单个变量中?【英文标题】:How do I store values from a single column into a single variable in oracle? 【发布时间】:2019-10-17 07:23:34 【问题描述】:以下是我的代码:
SELECT
/*+ parallel (sales 8) */
COUNT(1)
INTO v_datacount_actualtable
FROM sales
WHERE processingunitseq=38
AND (compensationdate BETWEEN TO_DATE(v_startdate,'DD-MON-YYYY') AND TO_DATE(v_enddate,'DD-MON-YYYY')
OR eventtypeseq IN
(SELECT EVENTTYPESEQ FROM EPS_FRS_PAYMENTS
));
SELECT EVENTTYPESEQ FROM EPS_FRS_PAYMENTS
将返回 4 个值。所以我不能做一个简单的 SELECT INTO。
我想将SELECT EVENTTYPESEQ FROM EPS_FRS_PAYMENTS
的结果存储到一个变量中,并使代码如下所示,这样子查询就不会每次都执行。
SELECT
/*+ parallel (sales 8) */
COUNT(1)
INTO v_datacount_actualtable
FROM sales
WHERE processingunitseq=38
AND (compensationdate BETWEEN TO_DATE(v_startdate,'DD-MON-YYYY') AND TO_DATE(v_enddate,'DD-MON-YYYY')
OR eventtypeseq = v_frseventpeseqs );
SELECT EVENTTYPESEQ FROM EPS_FRS_PAYMENTS
返回四个值:
1,
2,
3,
4,
我不想在代码中硬编码这些值,因为这是一种不好的做法。需要在像 v_frseventypeseqs 这样的变量中。
我该怎么做 - 数组/集合/记录/批量收集到?
【问题讨论】:
是的,bulk select into
的集合是要走的路
【参考方案1】:
如果不存在则创建类型
CREATE OR REPLACE
TYPE t_number1 AS TABLE OF NUMBER(8,0)
数字数组
在 PL/SQL 中使用
declare
v_frseventpeseqs t_number1;
begin
SELECT EVENTTYPESEQ bulk collect
into v_frseventpeseqs
FROM EPS_FRS_PAYMENTS;
for i in (select t.column_value id from table(v_frseventpeseqs) t)
loop
dbms_output.put_line(i.id );
end loop;
end;
仅使用语句 in (select t.column_value 从表(v_frseventpeseqs)t)
【讨论】:
【参考方案2】:您可以使用 WITH 子句。优点是重复引用子查询可能更有效,因为数据很容易从临时表中检索出来,而不是每次引用都重新查询。
WITH eventtypeseq_query AS
(SELECT EVENTTYPESEQ
FROM EPS_FRS_PAYMENTS)
SELECT
/*+ parallel (sales 8) */
COUNT(1)
INTO v_datacount_actualtable
FROM sales
WHERE processingunitseq=38
AND (compensationdate BETWEEN TO_DATE(v_startdate,'DD-MON-YYYY') AND TO_DATE(v_enddate,'DD-MON-YYYY')
OR eventtypeseq IN eventtypeseq_query);
您可以在此处找到更多信息: https://oracle-base.com/articles/misc/with-clause
【讨论】:
【参考方案3】:自从
SELECT EVENTTYPESEQ FROM EPS_FRS_PAYMENTS
不相关,您不需要在此处进行任何“优化” - Oracle 只会运行此子查询一次。
【讨论】:
【参考方案4】:与使用IN
相比,使用EXISTS
在性能方面总是更好。
此外,如果您正在编写此查询以在 LIVE 环境中定期运行,建议不要使用像 /*+ parallel */
这样的 HINT。 HINT 应仅用于临时查询。
我已使用EXISTS
在下面重写了您的查询:
SELECT
/*+ parallel (sales 8) */
COUNT(1)
INTO v_datacount_actualtable
FROM sales sl
WHERE processingunitseq=38
AND (compensationdate BETWEEN TO_DATE(v_startdate,'DD-MON-YYYY') AND TO_DATE(v_enddate,'DD-MON-YYYY')
OR EXISTS ( SELECT 1 from EPS_FRS_PAYMENTS efp where s.eventtypeseq = efp.eventtypeseq);
【讨论】:
以上是关于如何将单个列中的值存储到 oracle 中的单个变量中?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Laravel 8 将单个列中的标签输入值存储到数据库中