【发布时间】: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 定义和示例数据发布一个可重现的测试用例,然后也许我们可以提供更多帮助。