在游标内调用表函数宏

问题描述 投票:0回答:1

我用 SQL 宏创建了一个表函数。

当我想在过程和光标中使用它时,它不起作用。

CREATE OR REPLACE TYPE     VARCHAR2_TYPE IS OBJECT (p VARCHAR2(4000));

 

CREATE OR REPLACE FUNCTION LHCXCREPL_CDP.FPRE_CXC_CFG_TAB_INST_SRC_PARMS

( i_cedent                  VARCHAR2_TYPE

, i_cedent_proc_type        VARCHAR2_TYPE

)

return clob sql_macro as

 


v_stmt clob;

 

v_schema            VARCHAR2(200) := SYS_CONTEXT('userenv','current_schema');

 

v_grp_cpt            VPRE_CXC_CFG_CLI_PT_PARMS.GRP_CPT%TYPE;

 

v_cedent             VPRE_CXC_CFG_CLI_PT_PARMS.CEDENT%TYPE;

v_cedent_proc_type   VPRE_CXC_CFG_CLI_PT_PARMS.CEDENT_PROC_TYPE%TYPE;

 

BEGIN

 

v_cedent           := i_cedent.p;

v_cedent_proc_type := i_cedent_proc_type.p;

 

SELECT

NVL(TRIM(CPT.GRP_CPT),'NA')

into v_grp_cpt

FROM VPRE_CXC_CFG_CLI_PT_PARMS CPT

  WHERE CPT.CEDENT             = v_cedent

    AND CPT.CEDENT_PROC_TYPE   = v_cedent_proc_type

;

 

DBMS_OUTPUT.PUT_LINE ( 'v_grp_cpt = ' || v_grp_cpt);

 

v_stmt  := CASE

               WHEN v_grp_cpt = 'NA'

               THEN '

                     select

                      ins_cpt.CEDENT

                    , ins_cpt.CEDENT_PROC_TYPE

                    , ins_cpt.CFG_ID

                    , ins_cpt.TGT_TABLE

                    , ins_cpt.SRC_TABLE

                    , ins_cpt.ATTR_INST_SRC

                    , ins_cpt.FIL_INST_SRC_EXPR

                    --

                    from ' || v_schema || '.VPRE_CXC_CFG_CLI_PT_PARMS cpt

                                                         inner join ' || v_schema || '.TPRE_CXC_CFG_CLI_PT_TGT_INST_SRC_PARMS ins_cpt

                      on  cpt.CEDENT           = ins_cpt.CEDENT

                      and cpt.CEDENT_PROC_TYPE = ins_cpt.CEDENT_PROC_TYPE

                    --                                 

                      where TRIM(cpt.GRP_CPT) IS NULL AND cpt.CEDENT =

                    '

                    || CHR(39) || v_cedent           || CHR(39)

                    || ' AND cpt.CEDENT_PROC_TYPE = '

                    || CHR(39) || v_cedent_proc_type || CHR(39)

                ELSE

                      '

                      select

                          cpt.CEDENT

                        , cpt.CEDENT_PROC_TYPE

                        , ins_grp.CFG_ID

                        , ins_grp.TGT_TABLE

                        , ins_grp.SRC_TABLE

                        , ins_grp.ATTR_INST_SRC

                        , ins_grp.FIL_INST_SRC_EXPR

                        --

                        from ' || v_schema || '.VPRE_CXC_CFG_CLI_PT_PARMS cpt

                                                             inner join ' || v_schema || '.TPRE_CXC_CFG_CLI_GRP_CPT_INST ins_grp

                        on cpt.GRP_CPT = ins_grp.GRP_CPT                                    

                          where TRIM(cpt.GRP_CPT) IS NOT NULL AND cpt.CEDENT =

                       '

                    || CHR(39) || v_cedent           || CHR(39)

                    || ' AND cpt.CEDENT_PROC_TYPE = '

                    || CHR(39) || v_cedent_proc_type || CHR(39)

           END;

 

DBMS_OUTPUT.PUT_LINE ( 'v_stmt = ' || v_stmt);

 

RETURN v_stmt;

 

EXCEPTION

   WHEN NO_DATA_FOUND

   THEN

      RETURN 'ND';

   WHEN OTHERS

   THEN

      RETURN --'ERR';

      'ERR_O_' || SUBSTR(SQLERRM, 1, 50);

          

END;

/

尝试编译该过程时,会发生以下情况:

CURSOR c_src_table  IS

select

         pt.SRC_TABLE

         from FPRE_CXC_CFG_TAB_INST_SRC_PARMS(VARCHAR2_TYPE(w_cedent), VARCHAR2_TYPE('ALL')) pt                                                    

          where

               pt.tgt_table        = v_tgt_table_ext

           and pt.attr_inst_src    = v_ATTR_INST_SRC

        ;
Error message is:  [Error] Compilation (121: 61): PL/SQL: ORA-00932: inconsistent datatypes: expected CHAR got LHCXCREPL_CDP.VARCHAR2_TYPE

我尝试从过程中的游标内使用 sql 宏调用表函数。

oracle function cursor
1个回答
0
投票

您可以在这里做几件事

Change the below to

CREATE OR REPLACE FUNCTION LHCXCREPL_CDP.FPRE_CXC_CFG_TAB_INST_SRC_PARMS

( i_cedent                  varchar2

, i_cedent_proc_type        varchar2

 )

将以下内容更改为

v_cedent           := i_cedent;

v_cedent_proc_type := i_cedent_proc_type;
© www.soinside.com 2019 - 2024. All rights reserved.