我用 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 宏调用表函数。
您可以在这里做几件事
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;