Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将列对选择为变量pl/sql_Sql_Oracle_Plsql_Tuples - Fatal编程技术网

将列对选择为变量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):