En mis procedimientos almacenados, normalmente sería como ejecutar q '[código a ejecutar] inmediato. Sin embargo, tengo algo en mi código que tiene '$ [*]'. Oracle interpreta la cita y el corchete como el final de mi cita. ¿Cómo puedo escapar de esto? A continuación, encontrará el código completo.

    EXECUTE IMMEDIATE q'[
CREATE OR REPLACE VIEW vw_err_text AS
    WITH aux AS (
        SELECT
            err_txt
        FROM
            u339990_mr2
        WHERE
            err_txt IS NOT NULL
    )
    SELECT
        error_text,
        COUNT(*) AS ct,
        round(RATIO_TO_REPORT(COUNT(1)) OVER() * 100, 2) perc
    FROM
        aux CROSS APPLY
            JSON_TABLE(err_txt, '$[*]'
                COLUMNS
                    error_text PATH '$'
            )
    GROUP BY
        error_text
    ORDER BY
        ct DESC,
        error_text
        ]'
    ;
1
Javi Torre 4 mar. 2021 a las 00:01

2 respuestas

La mejor respuesta

Utilice un carácter (o caracteres) diferente para la sintaxis de comillas q.

q'[ ... ]' es correcto, pero también puede usar q'( ... )' (o lo mismo con llaves o < y >). Además, puede usar cualquier carácter individual (no emparejado) como en q'@ ... @' o q'^ ... ^'; simplemente use un carácter donde la combinación de cierre no surja naturalmente en sus datos. Esta es exactamente la razón por la que la sintaxis permite esta flexibilidad.

https://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements003.htm#i42617

4
mathguy 3 mar. 2021 a las 21:28

Puede usar cualquier carácter con la sintaxis de comillas q, no tiene por qué ser corchetes. Verifique este código:

set serveroutput on size 999999
clear screen
declare
begin
  dbms_output.put_line(q'[some text with  'quotes']');
  dbms_output.put_line(q'!some text with square [] brackets!');
  dbms_output.put_line(q'€some text with square [] brackets and exclamation marks ! €');
  dbms_output.put_line(q'~some text with square [] brackets, exclamation marks ! and a €~');
  dbms_output.put_line(q'zsome text with square [] brackets, exclamation marks ! and a ~ z');
  
end;
/
3
Koen Lostrie 3 mar. 2021 a las 21:32