Выберите INTO с параметрами привязки, не работающими с немедленным выполнением

У меня есть следующий запрос, который возвращает 1 при выполнении:

SELECT COUNT(*)  FROM TABLE_NAME WHERE Column1='x' AND Column2='y';

В моем блоке PL/SQL мне нужно оценить приведенное выше условие, чтобы выполнить бизнес-логику. Ниже приведен упрощенный вариант:

DECLARE
   column1 VARCHAR(20):='x';
   column2 VARCHAR(20):='y';
   rows_no NUMBER :=0;
   sql_query VARCHAR2(200) :='SELECT COUNT(*)  FROM TABLE_NAME WHERE Column1=:1 AND Column2=:2';

BEGIN

  EXECUTE IMMEDIATE sql_query INTO rows_no USING column1, column2;
  DBMS_OUTPUT.PUT_LINE('ROWS NO: '|| rows_no);

END;

Результатом выполнения блока PL/SQL является 0, что отличается от результата при выполнении запроса, который равен 1. Я думаю, что придерживаюсь правил привязки параметра для выбора запроса в PL/SQL. Буду признателен за любую помощь или руководство.

С уважением, Рандо.

P.S

Когда я делаю модификацию ниже:

DECLARE
   column1 VARCHAR(20):='x';
   column2 VARCHAR(20):='y';
   rows_no NUMBER :=0;
   sql_query VARCHAR2(200) :='SELECT COUNT(*)  FROM TABLE_NAME WHERE Column1=''x'' AND Column2=''y''';

BEGIN

  EXECUTE IMMEDIATE sql_query INTO rows_no;
  DBMS_OUTPUT.PUT_LINE('ROWS NO: '|| rows_no);

END;

Результат: 1

У меня есть цикл, который читает файл excel и вставляет его в таблицу базы данных (Table_name). Приведенный выше результат необходим для предотвращения вставки повторяющихся записей. Коммит выдается в конце процедуры.

Это означает, что если запись добавляется из процедуры, она остается незафиксированной до завершения процедуры.

Я сомневаюсь, что это проблема, незафиксированные вставки недоступны из других соединений, но в текущем соединении они должны быть доступны. Ниже приведена вся упрощенная логика блока plsql:

DECLARE;
--declaration variables
BEGIN
      LOOP
         -- fetching information from excel file
         EXECUTE IMMEDIATE sql_query INTO rows_no;
         DBMS_OUTPUT.PUT_LINE('ROWS NO: '|| rows_no);
         IF rows_no=0 THEN
           -- insert the information read from excel in database table
           rows_inserted:=rows_inserted+1;
         END IF;
      END LOOP;
   IF  rows_inserted>0 THEN
        COMMIT;
        DBMS_OUTPUT.PUT_LINE('ROWS INSERTED: '||rows_inserted);
        ELSE 
        DBMS_OUTPUT.PUT_LINE('No rows were inserted');
   END IF;
END

person Rando Shtishi    schedule 26.11.2020    source источник
comment
Каков результат блока PL/SQL, если вы не используете переменную связывания и используете тот же постоянный запрос, что и ваш обычный запрос, который дает 1 в качестве вывода? Ваш блок PL/SQL кажется правильным.   -  person Popeye    schedule 26.11.2020
comment
Не удается повторить проблему db‹›fiddle. (Вы уверены, что COMMITпроверили данные?)   -  person MT0    schedule 26.11.2020
comment
Если я запускаю запрос, данные доступны. Тот же запрос, запущенный внутри plsql с параметром привязки, возвращает 0 данных. Коммит выдается в конце процедуры. Условие необходимо для предотвращения вставки дубликатов записей.   -  person Rando Shtishi    schedule 26.11.2020


Ответы (1)


Проблема, скорее всего, вне Oracle, попробуйте повторно протестировать следующий скрипт (результат отображается в виде комментария)

create table tab (column1 varchar2(1), column2 varchar2(1));

set SERVEROUTPUT ON
DECLARE
   column1 VARCHAR(20):='x';
   column2 VARCHAR(20):='y';
   rows_no NUMBER :=0;
   sql_query VARCHAR2(200) :='SELECT COUNT(*)  FROM TAB WHERE Column1=:1 AND Column2=:2';

BEGIN

  EXECUTE IMMEDIATE sql_query INTO rows_no USING column1, column2;
  DBMS_OUTPUT.PUT_LINE('ROWS NO: '|| rows_no);

END;
/

-- ROWS NO: 0

insert into tab (column1, column2) values ('x','y');

DECLARE
   column1 VARCHAR(20):='x';
   column2 VARCHAR(20):='y';
   rows_no NUMBER :=0;
   sql_query VARCHAR2(200) :='SELECT COUNT(*)  FROM TAB WHERE Column1=:1 AND Column2=:2';

BEGIN

  EXECUTE IMMEDIATE sql_query INTO rows_no USING column1, column2;
  DBMS_OUTPUT.PUT_LINE('ROWS NO: '|| rows_no);

END;
/

-- ROWS NO: 1
person Marmite Bomber    schedule 26.11.2020
comment
Спасибо за ваш ответ. К сожалению, я перепроверил несколько раз, также закрыв соединение и создав новое соединение. Это не работает так, как должно. - person Rando Shtishi; 26.11.2020