Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
动态SQL中的Oracle PLSQL求值变量_Oracle_Plsql - Fatal编程技术网

动态SQL中的Oracle PLSQL求值变量

动态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

我有下面的代码,它工作得很好,因为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%'
            ]'
    ;
    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
后替换占位符。您可以在一次过程中构建第二个字符串,而不是使用第一个字符串构建第二个字符串。第一种方法本身没有问题。我只是希望有一些解决方案可以帮助我在代码结束时立即执行,这在调试时对我有很大帮助。