Oracle 结束循环错误的PL/SQL表达式

Oracle 结束循环错误的PL/SQL表达式,oracle,plsql,Oracle,Plsql,我在使用Oracle PL/SQL中的函数时遇到问题 代码如下: create or replace FUNCTION FX_A (IVI NUMBER) RETURN ListadoStrings AS datos ListadoStrings; dato VARCHAR2(4000); idx NUMBER; BEGIN datos := ListadoStrings(); BEGIN FOR prog IN ( SELECT TC

我在使用Oracle PL/SQL中的函数时遇到问题

代码如下:

create or replace FUNCTION FX_A (IVI NUMBER)
RETURN ListadoStrings
AS
  datos ListadoStrings;
  dato VARCHAR2(4000);
  idx NUMBER;
BEGIN
  datos := ListadoStrings();
    BEGIN
        FOR prog IN (
          SELECT TCPR.DES
          FROM TIVI TVIS
          JOIN TICPR TCPR ON (TCPR.PRO = TVIS.PRO AND TCPR.CAT = TVIS.CAT AND TCPR.TIP = TVIS.TIP)
          WHERE TVIS.IVI = IVI
        ) LOOP
            datos.extend;
            datos( datos.count ) := prog;
        END LOOP;
    END;

    BEGIN
        FOR tarea IN (
          SELECT TTAR.DES
          FROM TIVI TVIS
          JOIN TITAR TBTAR ON TBTAR.IVI = TVIS.IVI
          JOIN TMTAR TTAR ON TTAR.ITAR = TBTAR.ITAR
          WHERE TVIS.IVI = IVI
        ) LOOP
            datos.extend;
            datos( datos.count ) := tarea;
        END LOOP;
    END;

  return datos;
END FX_A;
运行此脚本时,我会得到以下响应:

函数FX_DATOSVISITA已编译

错误:检查编译器日志

在编译器日志中,我看到:

错误(17,13):PL/SQL:语句被忽略

错误(17,37):PLS-00382:表达式类型错误

错误(30,13):PL/SQL:语句被忽略

错误(30,37):PLS-00382:表达式类型错误

受影响的线都是“结束循环”线

你能帮我吗? 谢谢大家!

编辑1:

好的,现在我没有任何错误,但函数不返回任何内容:

create or replace FUNCTION FX_A (IVI NUMBER)
RETURN ListadoStrings
AS
  datos ListadoStrings;
  dato VARCHAR2(4000);
  idx NUMBER;
BEGIN
  datos := ListadoStrings();
    BEGIN
        FOR prog IN (
          SELECT TCPR.DES as des
          FROM TIVI TVIS
          JOIN TICPR TCPR ON (TCPR.PRO = TVIS.PRO AND TCPR.CAT = TVIS.CAT AND TCPR.TIP = TVIS.TIP)
          WHERE TVIS.IVI = IVI
        ) LOOP
            DBMS_OUTPUT.PUT_LINE(prog.des );
            datos.extend;
            datos( datos.count ) := prog.des;
        END LOOP;
    END;

    BEGIN
        FOR tarea IN (
          SELECT TTAR.DES as des
          FROM TIVI TVIS
          JOIN TITAR TBTAR ON TBTAR.IVI = TVIS.IVI
          JOIN TMTAR TTAR ON TTAR.ITAR = TBTAR.ITAR
          WHERE TVIS.IVI = IVI
        ) LOOP
            DBMS_OUTPUT.PUT_LINE(tarea.des );
            datos.extend;
            datos( datos.count ) := tarea.des;
        END LOOP;
    END;

  return datos;
END FX_A;
我可以看到DBMS_OUTPUT.PUT_LINE(tarea.des)的结果;在控制台中,但函数的返回仅为“ART_MOVIL.VISITA_DATOS(”


您能提供帮助吗?

替代实现。将循环替换为批量收集到本地收集,然后将它们组合在一起。将操作设置为FTW

create or replace FUNCTION FX_A (IVI NUMBER)
RETURN ListadoStrings
AS
  datos1 ListadoStrings;
  datos2 ListadoStrings;
  datos ListadoStrings;
BEGIN
  datos := ListadoStrings();

  SELECT TCPR.DES
  bulk collect into datos1
  FROM TIVI TVIS
  JOIN TICPR TCPR ON (TCPR.PRO = TVIS.PRO AND TCPR.CAT = TVIS.CAT AND TCPR.TIP = TVIS.TIP)
  WHERE TVIS.IVI = IVI;

  SELECT TTAR.DES
  bulk collect into datos2
  FROM TIVI TVIS
  JOIN TITAR TBTAR ON TBTAR.IVI = TVIS.IVI
  JOIN TMTAR TTAR ON TTAR.ITAR = TBTAR.ITAR
  WHERE TVIS.IVI = IVI;

  datos := datos1 multiset union all datos2;  

  return datos;
END FX_A;

尝试将变量设置更改为
datos(datos.count):=prog.des;
datos(datos.count):=tarea.des
。您想要的是列值,而不是行类型。@HepC您能检查编辑吗?您发布的输出,
“ART\MOVIL.VISITA\u datos(”
,没有任何意义。假设您的表有数据,修改后的函数应该返回一个填充的集合。如果没有,您正在做的事情您没有发布在这里。因此,我们无法为您提供更多帮助。发布一个具有类型和表定义以及样本数据的可复制测试用例,然后我们可能会我可以再帮点忙。