动态SQL中的Oracle PLSQL求值变量
我有下面的代码,它工作得很好,因为cols是在第二个动态语句中使用之前进行计算的动态SQL中的Oracle PLSQL求值变量,oracle,plsql,Oracle,Plsql,我有下面的代码,它工作得很好,因为cols是在第二个动态语句中使用之前进行计算的 DECLARE vstr_aux_cols CLOB; vstr_aux CLOB; cols CLOB; BEGIN vstr_aux_cols := q'[ SELECT LISTAGG('"' || column_name
DECLARE
vstr_aux_cols CLOB;
vstr_aux CLOB;
cols CLOB;
BEGIN
vstr_aux_cols := q'[
SELECT
LISTAGG('"'
|| column_name
|| '"', ',') WITHIN GROUP(
ORDER BY
column_name
)
FROM
all_tab_columns
WHERE
lower(table_name) = 'd_dialler_brut'
AND column_name LIKE 'REASON%'
]'
;
EXECUTE IMMEDIATE vstr_aux_cols
INTO cols;
vstr_aux := q'[
WITH aux AS (
SELECT
some columns
FROM
d_dialler_brut UNPIVOT ( v
FOR reason
IN ( ]'
|| cols
|| q'[ ) ) u
WHERE
condition
]';
dbms_output.put_line(vstr_aux);
END;
但是,如果我尝试下面的方法,它将不起作用,因为它首先将cols求值为blank,然后使用空值构建vstr_aux。是否有办法调整第二个代码片段,使其在填充cols后在vstr_aux中计算cols
DECLARE
vstr_aux_cols CLOB;
vstr_aux CLOB;
cols CLOB;
BEGIN
vstr_aux_cols := q'[
SELECT
LISTAGG('"'
|| column_name
|| '"', ',') WITHIN GROUP(
ORDER BY
column_name
)
FROM
all_tab_columns
WHERE
lower(table_name) = 'd_dialler_brut'
AND column_name LIKE 'REASON%'
]'
;
vstr_aux := q'[
WITH aux AS (
SELECT
some columns
FROM
d_dialler_brut UNPIVOT ( v
FOR reason
IN ( ]'
|| cols
|| q'[ ) ) u
WHERE
condition
]';
EXECUTE IMMEDIATE vstr_aux_cols
INTO cols;
dbms_output.put_line(vstr_aux);
END;
如果希望局部变量
cols
在用于构建不同字符串时具有值,则必须在进行字符串连接之前将该值指定给局部变量。还有其他方法可以做到这一点,但由于您尚未解释第一种方法存在问题的原因,因此很难猜测其中是否有一种方法对您更有利。例如,您可以使用第一个示例中为cols
赋值的代码,将其分解为一个单独的函数,然后在组装后面的字符串时调用该函数。该函数似乎是一个不错的选择。还有什么办法呢?同样,在不知道第一种方法有什么问题的情况下,很难猜测哪些解决方案对你有效。您可以使用占位符构建字符串,然后在填充局部变量cols
后替换占位符。您可以在一次过程中构建第二个字符串,而不是使用第一个字符串构建第二个字符串。第一种方法本身没有问题。我只是希望有一些解决方案可以帮助我在代码结束时立即执行,这在调试时对我有很大帮助。