Oracle 结束循环错误的PL/SQL表达式
我在使用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
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(”
,没有任何意义。假设您的表有数据,修改后的函数应该返回一个填充的集合。如果没有,您正在做的事情您没有发布在这里。因此,我们无法为您提供更多帮助。发布一个具有类型和表定义以及样本数据的可复制测试用例,然后我们可能会我可以再帮点忙。