Skip to Main Content

APEX

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

PL/SQL Function Body returning SQL Query does not recognize :PXXXX

Christian Morales46 hours ago

I'm creating an interactive grid with a PL/SQL Function Body returning a SQL Query to pivot some columns.
But it doesn't recognize the :PXXX.
If I burn the parameters, it works fine, but if I use the :PXXXX, it doesn't work.

The block where it takes out the columns that have burns 01 and C_3,

Thank you

DECLARE
l_no_cia VARCHAR2(2) := TRIM(APEX_UTIL.GET_SESSION_STATE('G_NO_CIA')); -- lee de session state
l_consec VARCHAR2(12) := TRIM(APEX_UTIL.GET_SESSION_STATE('G_CONSECUTIVO')); -- lee de session state
l_cols VARCHAR2(32767);
l_sql VARCHAR2(32767);

-- funcióncita para poner comillas y escapar '
FUNCTION q(v IN VARCHAR2) RETURN VARCHAR2 IS
BEGIN
RETURN '''' || REPLACE(v, '''', '''''') || '''';
END;
BEGIN
-- 0) Si no hay valores aún, evita error de parseo
--IF l_no_cia IS NULL OR l_consec IS NULL THEN
-- RETURN 'SELECT ''Sin filtros'' info FROM dual WHERE 1=0';
--END IF;

-- 1) Construir columnas del PIVOT con los mismos filtros (usando variables PL/SQL)
SELECT LISTAGG(
'''' || centro || ''' AS ' ||
'C_' || REGEXP_REPLACE(UPPER(centro), '[^A-Z0-9_]', '_'),
','
) WITHIN GROUP (ORDER BY centro)
INTO l_cols
FROM (
SELECT DISTINCT c.centro
FROM arim_ca_dist_impor_gde e
JOIN arim_ca_dist_impor_gdd d
ON d.no_cia = e.no_cia AND d.consecutivo = e.consecutivo
JOIN arim_ca_dist_impor_gdc c
ON c.no_cia = d.no_cia AND c.consecutivo = d.consecutivo
AND c.no_docu = d.no_docu AND c.no_arti = d.no_arti
WHERE e.no_cia = '01'--l_no_cia -- <-- texto
AND e.consecutivo = 'C_3'--l_consec -- <-- texto ('C01')
);
ptrace('cml',l_cols);
ptrace('cml',:G_NO_CIA);
ptrace('cml',:G_CONSECUTIVO);
ptrace('cml',l_no_cia);
ptrace('cml',l_consec);
-- 2) Si no hay centros, genera un dummy para que el PIVOT tenga al menos 1 col
--l_cols := NVL(l_cols, '''NO_DATA'' AS NO_DATA');

-- 3) Armar el SQL final (ojo: como l_no_cia y l_consec son TEXTO, llevan comillas)
l_sql := q'[
WITH base AS (
SELECT
e.consecutivo,
d.no_docu,
d.no_orden,
d.no_arti,
d.descripcion,
fa.descripcion AS familia,
ca.descripcion AS categoria,
su.descripcion AS subcategoria,
cl.descripcion AS ncluster,
d.porc_distri,
d.cant_tot_comp,
d.ind_picking,
d.cant_x_distrib,
d.porc_distribuido,
c.centro,
SUM(c.capacidad_estante) AS capacidad
FROM arim_ca_dist_impor_gde e
JOIN arim_ca_dist_impor_gdd d
ON d.no_cia = e.no_cia AND d.consecutivo = e.consecutivo
JOIN arim_ca_dist_impor_gdc c
ON c.no_cia = d.no_cia AND c.consecutivo = d.consecutivo
AND c.no_docu = d.no_docu AND c.no_arti = d.no_arti
JOIN arinca fa ON fa.no_cia = d.no_cia AND fa.codigo = d.clase
JOIN arincat ca ON ca.no_cia = d.no_cia AND ca.clase = d.clase AND ca.codigo = d.categoria
JOIN arinscat su ON su.no_cia = d.no_cia AND su.clase = d.clase AND su.categoria = d.categoria AND su.codigo = d.subcategoria
LEFT JOIN arimvrcluster cl ON cl.no_cia = d.no_cia AND cl.cod_cluster = d.cod_cluster
WHERE e.no_cia = ]' || q(l_no_cia) || q'[ -- '01' ¿ con comillas
AND e.consecutivo = ]' || q(l_consec) || q'[ -- 'C01' ¿ con comillas
GROUP BY
e.consecutivo, d.no_docu, d.no_orden, d.no_arti, d.descripcion,
fa.descripcion, ca.descripcion, su.descripcion, cl.descripcion,
d.porc_distri, d.cant_tot_comp, d.ind_picking, d.cant_x_distrib, d.porc_distribuido,
c.centro
)
SELECT *
FROM base
PIVOT (
SUM(capacidad)
FOR centro IN (]' || l_cols || q'[)
)
ORDER BY no_docu, no_arti, no_orden]';
ptrace('cml',l_sql);
RETURN l_sql;
END;

Comments
Post Details
Added 46 hours ago
3 comments
63 views