【问题标题】:END LOOP wrong expression PL/SQLEND LOOP 错误表达式 PL/SQL
【发布时间】:2017-03-29 16:18:50
【问题描述】:

我在使用 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:表达式类型错误

受影响的行都是“END LOOP;”行。

你能帮帮我吗? 谢谢!

编辑 1:

好的,现在我没有任何错误,但是函数返回 NOTHING:

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(”

你能帮忙吗?

【问题讨论】:

  • 尝试将变量集更改为datos( datos.count ) := prog.des;datos( datos.count ) := tarea.des。您需要的是列值,而不是行类型。
  • @HepC 你能检查编辑吗?
  • 您发布的输出"ART_MOVIL.VISITA_DATOS(" 没有任何意义。假设您的表有数据,修改后的函数应该返回一个填充的集合。如果没有,那么您正在做的事情还没有在此处发布。因此,我们无能为力帮助您。使用 TYPE 和 TABLE 定义和示例数据发布一个可重现的测试用例,然后也许我们可以提供更多帮助。

标签: oracle plsql


【解决方案1】:

替代实现。用批量收集替换循环到本地收集中,然后将它们压缩在一起。设置操作 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-27
    • 2019-06-10
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 2021-01-08
    • 2020-05-02
    • 2015-12-22
    相关资源
    最近更新 更多