ORA-00933: команда SQL неправильно завершилась при немедленном выполнении. - PullRequest
0 голосов
/ 07 сентября 2018

Когда я бегу

SELECT COUNT(*) 
  INTO l_entry_found 
  FROM hera.hera_user@iam 
 WHERE username = docm.eb_key;

без немедленного выполнения, это работает.

execute immediate'
      SELECT COUNT(*) INTO l_entry_found FROM hera.hera_user@iam WHERE 
      username = docm.eb_key;';

Однако бросает ora-00933.

В чем может быть проблема и как я могу ее решить? Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 07 сентября 2018

У вас есть некоторые проблемы; скажем, у вас есть стол, как

create table someTable(userName varchar2(100))

и код типа:

declare
    someVariable    varchar2(100);
    l_entry_found   number;
begin
    someVariable := 'someName';
    --
    SELECT COUNT(*)
    INTO l_entry_found
    FROM someTable
    WHERE username = someVariable;
end;

Если вы хотите переключиться на динамический SQL, вам нужно

  • удалить точку с запятой
  • используйте переменные связывания для передачи вашего параметра
  • переместите INTO за пределы динамической части

Ваш код может быть:

declare
    someVariable    varchar2(100);
    l_entry_found   number;
begin
    someVariable := 'someName';
    --
    execute immediate 
    'SELECT COUNT(*)
    FROM someTable
    WHERE username = :bindVar'
    into l_entry_found
    using someVariable;
end;

Здесь я предполагаю, что у вас есть веская причина для перехода на динамический SQL, например, имя вашей таблицы может меняться в зависимости от какого-либо параметра; если нет, простой SQL достаточно хорош для вашей задачи.

0 голосов
/ 09 сентября 2018

Оператор EXECUTE IMMEDIATE выполняет динамический оператор SQL или анонимный блок PL / SQL. Вы можете использовать его для выдачи операторов SQL, которые не могут быть представлены непосредственно в PL / SQL, или для создания операторов, где вы заранее не знаете всех имен таблиц, предложений WHERE и т. Д.

enter image description here

Продолжая ваш вопрос

-- Case using 1 output column 'COUNT(*)', 1 filter variable 'eb_key'
DECLARE
  --
  eb_key VARCHAR2(100) := 'something';
  l_entry_found number;
  --
BEGIN 
  execute immediate 'SELECT COUNT(*) FROM hera.hera_user@iam WHERE username = :eb_key;' USING eb_key INTO l_entry_found;
END;

-- Case using 2 output column 'COUNT(*)', 3 filter variable 'eb_key'
DECLARE
  --
  eb_column1 VARCHAR2(100) := 'something';
  eb_column2 VARCHAR2(100) := 'something';
  l_entry_found1 number;
  l_entry_found2 number;
  --
BEGIN 
  execute immediate 'SELECT column1, column2 FROM hera.hera_user@iam WHERE username = :eb_1 AND lastname = :eb_2;' USING eb_column1, eb_column2 INTO l_entry_found1,l_entry_found2;
END;
0 голосов
/ 07 сентября 2018

вы не можете использовать select into в динамическом SQL и вам не нужна точка с запятой

declare
  l_entry number(10);
begin

  execute immediate'
        SELECT COUNT(*) FROM hera.hera_user@iam WHERE 
        username = '''||docm.eb_key||'''' INTO l_entry;
end;
...