将列对选择为变量pl/sql
我有一个重复使用多次的元组集:将列对选择为变量pl/sql,sql,oracle,plsql,tuples,Sql,Oracle,Plsql,Tuples,我有一个重复使用多次的元组集: with ICC_DATA_REQS AS ( select ml_tran_id, tran_type, msg_type, icc_data as icc_data_req from TRANEMV2G where msg_type = 'CQ' and (BUSINESS_DT, ML_TRAN_ID) IN ( SELECT BUSINESS_DT, ML_TRAN_ID FROM TRAN
with ICC_DATA_REQS AS
(
select ml_tran_id, tran_type, msg_type, icc_data as icc_data_req from TRANEMV2G where msg_type = 'CQ' and (BUSINESS_DT, ML_TRAN_ID) IN (
SELECT BUSINESS_DT, ML_TRAN_ID
FROM TRANRSP2G
WHERE SETTLE_FILE_ID = -1)
),
ICC_DATA_RESP AS
(
select ml_tran_id, tran_type, msg_type, icc_data as icc_data_rsp from TRANEMV2G where msg_type = 'CS' and (BUSINESS_DT, ML_TRAN_ID) IN (
SELECT BUSINESS_DT, ML_TRAN_ID
FROM TRANRSP2G
WHERE SETTLE_FILE_ID = -1)
),
ICC_DATA_ADVC AS
(
select ml_tran_id, tran_type, msg_type, orig_ml_tran_id, icc_data as icc_data_adv from TRANEMV2G where msg_type = 'CA' and (BUSINESS_DT, ORIG_ML_TRAN_ID) IN (
SELECT BUSINESS_DT, ML_TRAN_ID
FROM TRANRSP2G
WHERE SETTLE_FILE_ID = -1)
)
我想做的是:
SELECT BUSINESS_DT, ML_TRAN_ID INTO vpairs
FROM TRANRSP2G
WHERE SETTLE_FILE_ID = -1
然后在其他查询中使用VPAIR。这可能吗?我一直遇到未知的变量错误
另外,我之所以要做这整件事,是因为表TRANEMV2G有3条记录,我需要3条记录中的数据作为3列。我找不到比这更好的方法了 您可以在另一个CTE中检索它们:
with p2g as
(
select business_dt, ml_tran_id
from tranrsp2g
where settle_file_id = -1
),
icc_data_reqs as
(
select v2g.ml_tran_id, tran_type, msg_type, icc_data as icc_data_req
from p2g
join tranemv2g v2g
on v2g.business_dt = p2g.business_dt
and v2g.ml_tran_id = p2g.ml_tran_id
where v2g.msg_type = 'CQ'
),
icc_data_resp as
(
select v2g.ml_tran_id, tran_type, msg_type, icc_data as icc_data_rsp
from p2g
join tranemv2g v2g
on v2g.business_dt = p2g.business_dt
and v2g.ml_tran_id = p2g.ml_tran_id
where v2g.msg_type = 'CS'
),
icc_data_advc as
(
select v2g.ml_tran_id, tran_type, msg_type, orig_ml_tran_id, icc_data as icc_data_adv
from p2g
join tranemv2g v2g
on v2g.business_dt = p2g.business_dt
and v2g.orig_ml_tran_id = p2g.ml_tran_id
where v2g.msg_type = 'CA'
)
或
我不确定这两个都比你拥有的要好得多
如果您想要创建PL/SQL变量,那么因为您想要在SQL上下文中使用它,所以它需要是SQL级别的类型:
create type t_tuple as object (business_dt date, ml_tran_id number)
/
create type t_tuple_tab as table of t_tuple
/
declare
v_tuples t_tuple_tab;
begin
select t_tuple(business_dt, ml_tran_id)
bulk collect into v_tuples
from tranrsp2g
where settle_file_id = -1;
with icc_data_reqs as
(
select ml_tran_id, tran_type, msg_type, icc_data as icc_data_req
from tranemv2g
where msg_type = 'CQ'
and (business_dt, ml_tran_id) in
(select business_dt, ml_tran_id from table(v_tuples))
),
...
或连接到表集合表达式。这似乎对您的原始代码或使用额外的CTE没有多大帮助,除非您稍后在代码中再次重用元组列表
但如果我了解您在做什么,您可以查询一次表并透视结果,至少如果您使用的是11g或更高版本:
select * from
(
select v2g.ml_tran_id, tran_type, msg_type, orig_ml_tran_id, icc_data
from tranrsp2g p2g
join tranemv2g v2g
on v2g.business_dt = p2g.business_dt
and ((v2g.msg_type in ('CQ', 'CS') and v2g.ml_tran_id = p2g.ml_tran_id)
or (v2g.msg_type = 'CA' and v2g.orig_ml_tran_id = p2g.ml_tran_id))
where p2g.settle_file_id = -1
)
pivot (max(icc_data) for (msg_type) in ('CQ' as req, 'CS' as rsp, 'CA' as adv))
您可以在另一个CTE中检索它们:
with p2g as
(
select business_dt, ml_tran_id
from tranrsp2g
where settle_file_id = -1
),
icc_data_reqs as
(
select v2g.ml_tran_id, tran_type, msg_type, icc_data as icc_data_req
from p2g
join tranemv2g v2g
on v2g.business_dt = p2g.business_dt
and v2g.ml_tran_id = p2g.ml_tran_id
where v2g.msg_type = 'CQ'
),
icc_data_resp as
(
select v2g.ml_tran_id, tran_type, msg_type, icc_data as icc_data_rsp
from p2g
join tranemv2g v2g
on v2g.business_dt = p2g.business_dt
and v2g.ml_tran_id = p2g.ml_tran_id
where v2g.msg_type = 'CS'
),
icc_data_advc as
(
select v2g.ml_tran_id, tran_type, msg_type, orig_ml_tran_id, icc_data as icc_data_adv
from p2g
join tranemv2g v2g
on v2g.business_dt = p2g.business_dt
and v2g.orig_ml_tran_id = p2g.ml_tran_id
where v2g.msg_type = 'CA'
)
或
我不确定这两个都比你拥有的要好得多
如果您想要创建PL/SQL变量,那么因为您想要在SQL上下文中使用它,所以它需要是SQL级别的类型:
create type t_tuple as object (business_dt date, ml_tran_id number)
/
create type t_tuple_tab as table of t_tuple
/
declare
v_tuples t_tuple_tab;
begin
select t_tuple(business_dt, ml_tran_id)
bulk collect into v_tuples
from tranrsp2g
where settle_file_id = -1;
with icc_data_reqs as
(
select ml_tran_id, tran_type, msg_type, icc_data as icc_data_req
from tranemv2g
where msg_type = 'CQ'
and (business_dt, ml_tran_id) in
(select business_dt, ml_tran_id from table(v_tuples))
),
...
或连接到表集合表达式。这似乎对您的原始代码或使用额外的CTE没有多大帮助,除非您稍后在代码中再次重用元组列表
但如果我了解您在做什么,您可以查询一次表并透视结果,至少如果您使用的是11g或更高版本:
select * from
(
select v2g.ml_tran_id, tran_type, msg_type, orig_ml_tran_id, icc_data
from tranrsp2g p2g
join tranemv2g v2g
on v2g.business_dt = p2g.business_dt
and ((v2g.msg_type in ('CQ', 'CS') and v2g.ml_tran_id = p2g.ml_tran_id)
or (v2g.msg_type = 'CA' and v2g.orig_ml_tran_id = p2g.ml_tran_id))
where p2g.settle_file_id = -1
)
pivot (max(icc_data) for (msg_type) in ('CQ' as req, 'CS' as rsp, 'CA' as adv))
如果这些是常量值,则可以将其存储在包中:
CREATE TABLE TRANRSP2G (
BUSINESS_DT DATE,
ML_TRAN_ID INT,
SETTLE_FILE_ID INT
);
CREATE TYPE TRANRSP2G_PAIR IS OBJECT(
BUSINESS_DT DATE,
ML_TRAN_ID INT
);
/
CREATE TYPE TRANRSP2G_PAIR_TABLE IS TABLE OF TRANRSP2G_PAIR;
/
CREATE PACKAGE TRANRSP2G_DATA AS
FUNCTION getData RETURN TRANRSP2G_PAIR_TABLE;
END;
/
CREATE PACKAGE BODY TRANRSP2G_DATA AS
pairs TRANRSP2G_PAIR_TABLE;
FUNCTION getData RETURN TRANRSP2G_PAIR_TABLE
IS
BEGIN
RETURN pairs;
END;
BEGIN
SELECT TRANRSP2G_PAIR( BUSINESS_DT, ML_TRAN_ID )
BULK COLLECT INTO pairs
FROM TRANRSP2G
WHERE SETTLE_FILE_ID = -1;
END;
/
(注意:pairs
集合将在加载包时填充,其中存储的数据将保持静态[即使基础表发生更改],因此不应将此方法用于非静态数据。)
然后你可以做:
WITH ICC_DATA_REQS AS
(
select ml_tran_id, tran_type, msg_type, icc_data as icc_data_req
from TRANEMV2G
where msg_type = 'CQ'
and TRANRSP2G_PAIR(BUSINESS_DT, ML_TRAN_ID)
MEMBER OF TRANRSP2G_DATA.getData()
),
...
如果这些是常量值,则可以将其存储在包中:
CREATE TABLE TRANRSP2G (
BUSINESS_DT DATE,
ML_TRAN_ID INT,
SETTLE_FILE_ID INT
);
CREATE TYPE TRANRSP2G_PAIR IS OBJECT(
BUSINESS_DT DATE,
ML_TRAN_ID INT
);
/
CREATE TYPE TRANRSP2G_PAIR_TABLE IS TABLE OF TRANRSP2G_PAIR;
/
CREATE PACKAGE TRANRSP2G_DATA AS
FUNCTION getData RETURN TRANRSP2G_PAIR_TABLE;
END;
/
CREATE PACKAGE BODY TRANRSP2G_DATA AS
pairs TRANRSP2G_PAIR_TABLE;
FUNCTION getData RETURN TRANRSP2G_PAIR_TABLE
IS
BEGIN
RETURN pairs;
END;
BEGIN
SELECT TRANRSP2G_PAIR( BUSINESS_DT, ML_TRAN_ID )
BULK COLLECT INTO pairs
FROM TRANRSP2G
WHERE SETTLE_FILE_ID = -1;
END;
/
(注意:pairs
集合将在加载包时填充,其中存储的数据将保持静态[即使基础表发生更改],因此不应将此方法用于非静态数据。)
然后你可以做:
WITH ICC_DATA_REQS AS
(
select ml_tran_id, tran_type, msg_type, icc_data as icc_data_req
from TRANEMV2G
where msg_type = 'CQ'
and TRANRSP2G_PAIR(BUSINESS_DT, ML_TRAN_ID)
MEMBER OF TRANRSP2G_DATA.getData()
),
...
如果来自TRANRSP2G的值(对于SELLET_FILE_ID=-1)在连接时不是太大,那么一旦在别处使用,就可以获取列表 Listag是一个选项。(或此处所述的其他方法:) 然后vpairs可以与INSTR一起使用
select ml_tran_id, tran_type, msg_type, icc_data as icc_data_req
from TRANEMV2G where msg_type = 'CQ'
and INSTR(vpairs, BUSINESS_DT || '_x_' || ML_TRAN_ID) <> 0
选择ml\u传输id、传输类型、消息类型、icc数据作为icc数据请求
来自TRANEMV2G,其中msg_type='CQ'
和仪器(vpairs,BUSINESS | | | | | | | | | | | | | | | ML | u TRAN | ID)0
如果来自TRANRSP2G的值(对于结算文件\u ID=-1)在连接时不是太大,那么一旦在其他地方使用,就可以获取列表
Listag是一个选项。(或此处所述的其他方法:)
然后vpairs可以与INSTR一起使用
select ml_tran_id, tran_type, msg_type, icc_data as icc_data_req
from TRANEMV2G where msg_type = 'CQ'
and INSTR(vpairs, BUSINESS_DT || '_x_' || ML_TRAN_ID) <> 0
选择ml\u传输id、传输类型、消息类型、icc数据作为icc数据请求
来自TRANEMV2G,其中msg_type='CQ'
和仪器(vpairs,BUSINESS | | | | | | | | | | | | | | | ML | u TRAN | ID)0
如果您特别想要PL/SQL方法,您是如何将vpairs
定义/声明为记录类型或对象类型的;使用表或varray类型?如果您特别想要PL/SQL方法,您如何将vpairs
-定义/声明为记录类型或对象类型;使用表或varray类型?我只是想,如果我将元组作为变量,我就不必再查询它了。如果您只需要在这个查询中使用它们,那么CTE就可以实现这一点。(除非枢轴满足您的需要)。如果您以后再次需要它们,那么可能值得使用一个集合。这取决于重新查询的成本,因为数据无论如何都会在缓存中。而不是在(从表(v_tuples)中选择business_dt,ml_tran_id))中使用t_tuple(business_dt,ml_tran_id)作为v_tuples的成员。
。谢谢,我总是忘了你可以这么做。我只是想,如果我把元组作为变量,我就不必再查询它了。如果你只需要在这个查询中使用它们,那么CTE就可以做到这一点。(除非枢轴满足您的需要)。如果您以后再次需要它们,那么可能值得使用一个集合。这取决于重新查询的成本,因为数据无论如何都会在缓存中。而不是在(从表(v_tuples)中选择business_dt,ml_tran_id))中使用t_tuple(business_dt,ml_tran_id)作为v_tuples的成员。
。谢谢,我总是忘了你可以这样做。值接近300000条记录。你知道LISTAGG是否能处理这个问题吗?30万是个大数字。即使使用clob,限制也为32K字符。在这种情况下,Alex和MT0的答案可能更好。如果您仍然有兴趣使用listagg或类似的函数,请查看此处(在页面内搜索clob):值接近300000条记录。你知道LISTAGG是否能处理这个问题吗?30万是个大数字。即使使用clob,限制也为32K字符。在这种情况下,Alex和MT0的答案可能更好。如果您仍有兴趣使用listagg或类似功能,请查看此处(在页面内搜索clob):