Динамическое преобразование оператора обновления для выбора - PullRequest
0 голосов
/ 05 июля 2019

Я хотел бы преобразовать оператор обновления для динамического выбора оператора в PL / SQL.

Например update temp set b='apple' where a=1 следует преобразовать в select count(*) from temp where a=1

Ответы [ 2 ]

2 голосов
/ 05 июля 2019

Если ваш запрос динамический, вы можете попробовать следующее:

-- DATA PREPARATION
WITH MY_QUERY ( QRY ) AS (
    SELECT
        q'#update temp set b='apple' where a=1#'
    FROM
        DUAL
)
-- ACTUAL QUERY
SELECT
    'SELECT COUNT(*) FROM '
    || TABLENAME
    || ' '
    || WHERE_CLAUSE AS UPDATED_QUERY
FROM
    (
        SELECT
            REGEXP_SUBSTR(QRY, '[^ ]+', 1, 2) AS TABLENAME,
            REGEXP_SUBSTR(QRY, 'where (.)+$', 1, 1) AS WHERE_CLAUSE
        FROM
            MY_QUERY
    );


--
OUTPUT:
--
SELECT COUNT(*) FROM temp where a=1

Ваш запрос (String) заключен в альтернативную строку в кавычках (q '# .... #'), так как содержитцитаты.

db <> fiddle demo

1 голос
/ 06 июля 2019

Вам действительно нужно динамически изменять SQL, или вы просто хотите получить количество измененных строк?Если вам нужно только количество измененных строк, то SQL%ROWCOUNT может обеспечить следующее:

create table temp as
select 1 a, 'orange' b from dual;

declare
    v_sql varchar2(32767) := q'[update temp set b='apple' where a=1]';
begin
    execute immediate v_sql;
    dbms_output.put_line('Rows updated: '||sql%rowcount);
end;
/

Вывод:

Rows updated: 1

Если вам действительно нужно динамически изменить SQL,тогда ты в мире боли.Правильный синтаксический анализ SQL на 100% практически невозможен, если только вы не можете гарантировать, что ваш входной SQL будет соответствовать небольшому диапазону значений.

Если вам нужно проанализировать и переформатировать SQL, надеюсь, вы сможете использовать регулярные выражения, как в Tejashответ.Если вам нужно что-то более мощное, взгляните на мою программу с открытым исходным кодом PLSQL_LEXER .Если вам все еще нужно больше энергии, взгляните на Antlr.Но по мере того, как решения становятся более мощными, они экспоненциально усложняются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...