ORA-00933:使用立即执行时,SQL命令未正确结束

时间:2018-09-07 13:27:13

标签: plsql ora-00933

我跑步时

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 :(得分:2)

您不能在动态SQL中使用select into 而且您也不需要分号

declare
  l_entry number(10);
begin

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

答案 1 :(得分:1)

您遇到了一些问题;说你有一张像

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就足以完成您的任务。

答案 2 :(得分:0)

EXECUTE IMMEDIATE语句执行动态SQL语句或匿名PL / SQL块。您可以使用它来发出不能在PL / SQL中直接表示的SQL语句,或者在不知道所有表名,WHERE子句等的地方建立语句

enter image description here

继续您的问题

ObjTypeAbstract